在 QEMU/KVM 虚拟机上安装 NixOS 发行版
<img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/preview.png" alt="Featured image of post 在 QEMU/KVM 虚拟机上安装 NixOS 发行版" /><h2 id="前言">前言</h2>
<p>2019 年 1 月的时候知道了这个发行版,当时 <code>@NixOS_zh</code> 群刚建立(<del>后来这群凉了</del>),就开虚拟机玩了一下,时隔多年发现又有不少人对其颇感兴趣,便决定重新写一下安装相关的教程。</p>
<p><strong>本文以 Arch Linux 作为宿主机,大体步骤与 Arch Wiki 相近</strong></p>
<h2 id="qemukvm-虚拟机配置">QEMU/KVM 虚拟机配置</h2>
<blockquote>
<p>ArchLinux Wiki: <a class="link" href="https://wiki.archlinux.org/index.php/KVM" target="_blank" rel="noopener"
>KVM</a>
| <a class="link" href="https://wiki.archlinux.org/index.php/QEMU" target="_blank" rel="noopener"
>QEMU</a>
| <a class="link" href="https://wiki.archlinux.org/index.php/Libvirt" target="_blank" rel="noopener"
>Libvirt</a></p>
</blockquote>
<h3 id="0-检测硬件是否支持-kvm">0. 检测硬件是否支持 KVM</h3>
<p>一般情况下需要进入到 <code>BIOS</code> 对应页面打开虚拟化支持,常见对应设置项如下:</p>
<ul>
<li>AMD: SVM Support</li>
<li>Intel: Intel Virtual Technology</li>
</ul>
<p>开启虚拟化后在宿主机上用命令行检测(比如我的是 AMD 的处理器):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ <span class="nv">LC_ALL</span><span class="o">=</span>C lscpu <span class="p">|</span> grep Virtualization
</span></span><span class="line"><span class="cl">Virtualization: AMD-V
</span></span></code></pre></td></tr></table>
</div>
</div><p>内核支持检测,如果使用的是 ArchLinux 提供的官方内核,即 <code>core/linux</code> 则已经包含了对应的 kvm 模块(<code>kvm</code>、<code>kvm_amd</code>或<code>kvm_intel</code>):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ zgrep CONFIG_KVM /proc/config.gz
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_GUEST</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_MMIO</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_ASYNC_PF</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_VFIO</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_COMPAT</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_XFER_TO_GUEST_WORK</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_INTEL</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_AMD</span><span class="o">=</span>m <span class="c1"># 可以看到有该模块</span>
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_AMD_SEV</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_KVM_MMU_AUDIT</span><span class="o">=</span>y
</span></span></code></pre></td></tr></table>
</div>
</div><p>查看这些内核模块是否已自动加载:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ lsmod <span class="p">|</span>grep kvm
</span></span><span class="line"><span class="cl">kvm_amd <span class="m">114688</span> <span class="m">8</span>
</span></span><span class="line"><span class="cl">ccp <span class="m">118784</span> <span class="m">1</span> kvm_amd
</span></span><span class="line"><span class="cl">kvm <span class="m">933888</span> <span class="m">1</span> kvm_amd
</span></span><span class="line"><span class="cl">irqbypass <span class="m">16384</span> <span class="m">1</span> kvm
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果没有自动加载则手动:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo modprobe kvm
</span></span><span class="line"><span class="cl">$ sudo modprobe kvm_amd <span class="c1"># 对应你的 CPU 类型</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="1-准虚拟化使用-virtio">1. 准虚拟化(使用 VIRTIO)</h3>
<p>检测 VIRTIO 模块是否可用:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ zgrep VIRTIO /proc/config.gz
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_BLK_MQ_VIRTIO</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_VSOCKETS</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_VSOCKETS_COMMON</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_NET_9P_VIRTIO</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_BLK</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_SCSI_VIRTIO</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_NET</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_CONSOLE</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_HW_RANDOM_VIRTIO</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_DRM_VIRTIO_GPU</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_MENU</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_PCI</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_PCI_LEGACY</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_VDPA</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_PMEM</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_BALLOON</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_MEM</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_INPUT</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_MMIO</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_DMA_SHARED_BUFFER</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_RPMSG_VIRTIO</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_VIRTIO_FS</span><span class="o">=</span>m
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_CRYPTO_DEV_VIRTIO</span><span class="o">=</span>m
</span></span></code></pre></td></tr></table>
</div>
</div><p>准虚拟化设备列表(主要确保以下几个模块有对应开启,若未开启则手动用 <code>modprobe</code> 命令开启):</p>
<ul>
<li>网络设备 (virtio-net)</li>
<li>硬盘设备 (virtio-blk)</li>
<li>控制器设备 (virtio-scsi)</li>
</ul>
<h3 id="2-安装-qemu">2. 安装 QEMU</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo pacman -S qemu
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>Arch Wiki: <a class="link" href="https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Setting_up_IOMMU" target="_blank" rel="noopener"
>PCI 直通</a></p>
</blockquote>
<p>如果需要启用 PCI 直通功能则需要在内核参数中添加 <code>intel_iommu=on</code> 或者 <code>amd_iommu=on</code>,同时可以在其后添加 <code>iommu=pt</code>,以防前者失效,以下命令检测是否开启成功,由于本人所用 <code>AMD Ryzen 5 4600U</code> 支持方面还有些问题,故此不做展示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo dmesg <span class="p">|</span> grep -i -e DMAR -e IOMMU
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3-安装-libvirt">3. 安装 libvirt</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo pacman -S libvirt virt-manager dnsmasq edk2-ovmf
</span></span></code></pre></td></tr></table>
</div>
</div><p>为了避免每次都需要询问 <code>root</code> 密码,建议将自己的用户添加到 <code>libvirt</code> 组:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo usermod -aG libvirt <YourUserName>
</span></span></code></pre></td></tr></table>
</div>
</div><p>编辑服务端配置文件 <code>/etc/libvirt/libvirtd.conf</code>,取消如下几行的注释:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">unix_sock_group = "libvirt"
</span></span><span class="line"><span class="cl">unix_sock_ro_perms = "0777" # set to 0770 to deny on-group libvirt users
</span></span><span class="line"><span class="cl">unix_sock_rw_perms = "0770"
</span></span><span class="line"><span class="cl">auth_unix_ro = "none"
</span></span><span class="line"><span class="cl">auth_unix_rw = "none"
</span></span></code></pre></td></tr></table>
</div>
</div><p>同时添加 ipv4 的内核转发参数:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo <span class="nb">echo</span> <span class="s1">'net.ipv4.ip_forward = 1'</span> >> /etc/sysctl.d/00-network.conf
</span></span></code></pre></td></tr></table>
</div>
</div><p>设置开机启动和运行服务。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl <span class="nb">enable</span> --now libvirtd.service
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4-配置-virt-manager">4. 配置 virt-manager</h3>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_connection.png"
width="799"
height="264"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_connection_hua6b2f70857beea847a4e403761694cf4_45516_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_connection_hua6b2f70857beea847a4e403761694cf4_45516_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="添加连接"
class="gallery-image"
data-flex-grow="302"
data-flex-basis="726px"
></p>
<p>建议重启以应用之前的设置,此时在 <code>Virtual Machine Manager</code> 的界面应该可以看到一些已经连接上的服务端,如果没有则在菜单栏自行添加,推荐初次连接系统级服务来创建虚拟机。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/new_vm.png"
width="547"
height="569"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/new_vm_hu8d65781e9df1dff7162eeaf71bdeb11e_38276_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/new_vm_hu8d65781e9df1dff7162eeaf71bdeb11e_38276_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="添加虚拟机"
class="gallery-image"
data-flex-grow="96"
data-flex-basis="230px"
></p>
<blockquote>
<p><a class="link" href="https://nixos.org/download.html#nixos-iso" target="_blank" rel="noopener"
>NixOS 镜像下载</a></p>
</blockquote>
<p>将下载到的镜像文件<strong>所在目录</strong>创建为文件系统池,随后在其中选择镜像文件进行加载。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_image_pool.png"
width="544"
height="469"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_image_pool_hu970b1afb910bcaae4894d29acb9106cc_27256_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/add_image_pool_hu970b1afb910bcaae4894d29acb9106cc_27256_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="添加镜像池"
class="gallery-image"
data-flex-grow="115"
data-flex-basis="278px"
> <img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/select_image.png"
width="790"
height="569"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/select_image_hu2a8c4f1d1d239972d45bfa5118d53040_41702_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/select_image_hu2a8c4f1d1d239972d45bfa5118d53040_41702_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="选择镜像"
class="gallery-image"
data-flex-grow="138"
data-flex-basis="333px"
></p>
<p>设置合适的系统资源和网络配置等(初次使用推荐用 <code>NAT</code> 模式较为简单,<code>Bridge</code> 模式之后会提到如何配置)。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mems_and_cpus.png"
width="540"
height="569"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mems_and_cpus_hu3f94115c352a8224f9934a0cf4916735_29442_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mems_and_cpus_hu3f94115c352a8224f9934a0cf4916735_29442_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="虚拟机能用的内存和CPU核心数量设置"
class="gallery-image"
data-flex-grow="94"
data-flex-basis="227px"
> <img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/storage.png"
width="540"
height="569"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/storage_hu2d0361517b02270d862594eb87061b93_34400_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/storage_hu2d0361517b02270d862594eb87061b93_34400_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="存储空间设置"
class="gallery-image"
data-flex-grow="94"
data-flex-basis="227px"
></p>
<p>如果你的宿主机支持的话,推荐使用 <code>UEFI</code> 模式启动(由 <code>extra/edk2-ovmf</code> 这个提供,中途安装的话要重启 <code>libvirtd</code> 服务以生效)。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/efi.png"
width="1064"
height="878"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/efi_hu9f899bb67943b59a1cb22147594f3a07_107289_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/efi_hu9f899bb67943b59a1cb22147594f3a07_107289_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="EFI Firmware"
class="gallery-image"
data-flex-grow="121"
data-flex-basis="290px"
></p>
<p>调整镜像到启动优先级最高,最后启动工具栏上的 Begin Install 就可以安装了。
<img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_order.png"
width="1064"
height="878"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_order_hu0104e4f34f9204d4af86754a01e3407e_89865_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_order_hu0104e4f34f9204d4af86754a01e3407e_89865_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="更改启动优先级"
class="gallery-image"
data-flex-grow="121"
data-flex-basis="290px"
></p>
<h2 id="nixos-系统安装">NixOS 系统安装</h2>
<blockquote>
<p><a class="link" href="https://nixos.org/manual/nixos/stable/" target="_blank" rel="noopener"
>NixOS 使用手册</a></p>
</blockquote>
<h3 id="0-进入引导界面">0. 进入引导界面</h3>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/iso_grub.png"
width="768"
height="525"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/iso_grub_hu9ae0ec0bcf0062785606d81bd30497db_8765_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/iso_grub_hu9ae0ec0bcf0062785606d81bd30497db_8765_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="ISO Grub"
class="gallery-image"
data-flex-grow="146"
data-flex-basis="351px"
> <img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/nix_begin.png"
width="1064"
height="878"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/nix_begin_huafbe3e8e1b72f2541b162b11814cfc21_22482_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/nix_begin_huafbe3e8e1b72f2541b162b11814cfc21_22482_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="NixOS 镜像启动"
class="gallery-image"
data-flex-grow="121"
data-flex-basis="290px"
></p>
<p>由于我下载的是最小化镜像,所以并没有图形界面,如果下载的是带 <code>Gnome</code> 或者 <code>KDE</code> 的镜像的话应该可以看到界面了,稍后我也会以最小化镜像的方式开始安装图形界面。</p>
<h3 id="1-磁盘分区">1. 磁盘分区</h3>
<p>查看当前块设备状态,可以看到我们之前分配的盘 <code>vda</code> 还未被挂载</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk.png"
width="449"
height="152"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk_hu344fddbf0f37cde290abb7988bb0dc38_63573_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk_hu344fddbf0f37cde290abb7988bb0dc38_63573_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="lsblk"
class="gallery-image"
data-flex-grow="295"
data-flex-basis="708px"
></p>
<p>建议使用 GPT 分区表,按照可以按照图中对 <code>boot</code>、<code>swap</code>(可选)和 <code>root</code> 分区进行创建,注意下方 <code>Type</code> 选择对应的分区类型,<code>Write</code> 写入后退出。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo cfdisk /dev/vda
</span></span></code></pre></td></tr></table>
</div>
</div><p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/cfdisk.png"
width="1025"
height="759"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/cfdisk_hu4fb32da0e060ded920f2416639508d64_12319_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/cfdisk_hu4fb32da0e060ded920f2416639508d64_12319_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="cfdisk"
class="gallery-image"
data-flex-grow="135"
data-flex-basis="324px"
></p>
<p>格式化分区,可以看到格式化后效果如下:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo mkfs.fat -F32 /dev/vda1
</span></span><span class="line"><span class="cl">$ sudo mkswap /dev/vda2
</span></span><span class="line"><span class="cl">$ sudo swapon
</span></span><span class="line"><span class="cl">$ sudo mkfs.xfs -L root /dev/vda3
</span></span></code></pre></td></tr></table>
</div>
</div><p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk_label.png"
width="1058"
height="236"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk_label_hu760cf4292d45bf36294e06e878beb773_15356_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/lsblk_label_hu760cf4292d45bf36294e06e878beb773_15356_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="mkfs check"
class="gallery-image"
data-flex-grow="448"
data-flex-basis="1075px"
></p>
<h3 id="2-分区挂载">2. 分区挂载</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo mount /dev/vda3 /mnt
</span></span><span class="line"><span class="cl">$ sudo mkdir -p /mnt/boot
</span></span><span class="line"><span class="cl">$ sudo mount /dev/vda1 /mnt/boot
</span></span></code></pre></td></tr></table>
</div>
</div><p>挂载后可以检查是否挂载成功,不要重复挂载。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mount.png"
width="563"
height="236"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mount_hub30013d1b3472c1e3833db17bbd67cad_4425_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/mount_hub30013d1b3472c1e3833db17bbd67cad_4425_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="挂载"
class="gallery-image"
data-flex-grow="238"
data-flex-basis="572px"
></p>
<h3 id="3-系统配置">3. 系统配置</h3>
<p>由命令生成默认的配置文件:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo nixos-generate-config --root /mnt
</span></span><span class="line"><span class="cl">$ sudo nano /mnt/etc/nixos/configuration.nix
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以看到已经有了 <code>systemd-boot</code> 作为 <code>bootloader</code> 引导操作系统。其他一些基本配置,按照自己的需求取消注释并修改内容即可,注意创建用户 <code>users.users.<YourUserName></code> 及其对应的用户组,完成后 <code>Ctrl + O</code> 保存。</p>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/config.png"
width="1082"
height="816"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/config_hucd270a1c19e44eafd2ee501c1b303a2d_19570_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/config_hucd270a1c19e44eafd2ee501c1b303a2d_19570_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="config"
class="gallery-image"
data-flex-grow="132"
data-flex-basis="318px"
></p>
<p>如果网络情况欠佳的话可以设置 <code>http_proxy</code> 或者更换更新频道到国内镜像站:</p>
<blockquote>
<p><a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/nix/" target="_blank" rel="noopener"
>TUNA Nix Help</a></p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo nix-channel --add https://mirrors.tuna.tsinghua.edu.cn/nix-channels/nixos-20.09 nixos
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用 <code>sudo nixos-install</code> 进行安装并设置 <code>root</code> 密码,完成之后取消挂载并重启(记得更改启动项顺序到虚拟硬盘)。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo nixos-install
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">setting root password...
</span></span><span class="line"><span class="cl">Enter new UNIX password: ***
</span></span><span class="line"><span class="cl">Retype new UNIX password: ***
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">$ sudo umount -r /mnt
</span></span><span class="line"><span class="cl">$ reboot
</span></span></code></pre></td></tr></table>
</div>
</div><p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_from_dev.png"
width="1135"
height="492"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_from_dev_hua4a363df8d1ea1c13471afa92cdc8452_56415_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_from_dev_hua4a363df8d1ea1c13471afa92cdc8452_56415_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="调整启动顺序"
class="gallery-image"
data-flex-grow="230"
data-flex-basis="553px"
></p>
<h2 id="nixos-系统配置和使用">NixOS 系统配置和使用</h2>
<h3 id="0-检查引导状态">0. 检查引导状态</h3>
<p>重启登陆后可以查看引导状态:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo bootctl status
</span></span></code></pre></td></tr></table>
</div>
</div><p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_status.png"
width="984"
height="822"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_status_hufa72d0cbb1b5710b183f3687d93852e2_23367_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/boot_status_hufa72d0cbb1b5710b183f3687d93852e2_23367_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="systemd-boot 状态"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="287px"
></p>
<h3 id="1-配置桌面环境">1. 配置桌面环境</h3>
<p><code>/etc/nixos/configuration.conf</code> 配置文件参考如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="c1"># Edit this configuration file to define what should be installed on</span>
</span></span><span class="line"><span class="cl"><span class="c1"># your system. Help is available in the configuration.nix(5) man page</span>
</span></span><span class="line"><span class="cl"><span class="c1"># and in the NixOS manual (accessible by running ‘nixos-help’).</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span> <span class="n">config</span><span class="o">,</span> <span class="n">pkgs</span><span class="o">,</span> <span class="o">...</span> <span class="p">}:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="n">imports</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span> <span class="c1"># Include the results of the hardware scan.</span>
</span></span><span class="line"><span class="cl"> <span class="sr">./hardware-configuration.nix</span>
</span></span><span class="line"><span class="cl"> <span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Use the systemd-boot EFI boot loader.</span>
</span></span><span class="line"><span class="cl"> <span class="n">boot</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">systemd-boot</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">boot</span><span class="o">.</span><span class="n">loader</span><span class="o">.</span><span class="n">efi</span><span class="o">.</span><span class="n">canTouchEfiVariables</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">networking</span><span class="o">.</span><span class="n">hostName</span> <span class="o">=</span> <span class="s2">"axionl"</span><span class="p">;</span> <span class="c1"># 设置 hostname.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Set your time zone.</span>
</span></span><span class="line"><span class="cl"> <span class="n">time</span><span class="o">.</span><span class="n">timeZone</span> <span class="o">=</span> <span class="s2">"Asia/Shanghai"</span><span class="p">;</span> <span class="c1"># 设置时区</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># The global useDHCP flag is deprecated, therefore explicitly set to false here.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Per-interface useDHCP will be mandatory in the future, so this generated config</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># replicates the default behavior.</span>
</span></span><span class="line"><span class="cl"> <span class="n">networking</span><span class="o">.</span><span class="n">useDHCP</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">networking</span><span class="o">.</span><span class="n">interfaces</span><span class="o">.</span><span class="n">enp1s0</span><span class="o">.</span><span class="n">useDHCP</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">networking</span><span class="o">.</span><span class="n">networkmanager</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> <span class="c1"># 启用 NetworkManager 替代默认的 DHCP</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Configure network proxy if necessary</span>
</span></span><span class="line"><span class="cl"> <span class="n">networking</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="s2">"http://192.168.122.1:8888"</span><span class="p">;</span> <span class="c1"># 设置一个外部代理(可选)</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Select internationalisation properties.</span>
</span></span><span class="line"><span class="cl"> <span class="n">i18n</span><span class="o">.</span><span class="n">defaultLocale</span> <span class="o">=</span> <span class="s2">"en_US.UTF-8"</span><span class="p">;</span> <span class="c1"># 默认语言环境</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># console = {</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># font = "Lat2-Terminus16";</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># keyMap = "us";</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># };</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Configure keymap in X11</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">xserver</span><span class="o">.</span><span class="n">layout</span> <span class="o">=</span> <span class="s2">"us"</span><span class="p">;</span> <span class="c1"># 设置键盘布局</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># services.xserver.xkbOptions = "eurosign:e";</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Enable CUPS to print documents.</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">printing</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> <span class="c1"># 启用打印服务(不需要可禁止)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Enable sound.</span>
</span></span><span class="line"><span class="cl"> <span class="n">sound</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> <span class="c1"># 允许声音</span>
</span></span><span class="line"><span class="cl"> <span class="n">hardware</span><span class="o">.</span><span class="n">pulseaudio</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Enable touchpad support (enabled default in most desktopManager).</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">xserver</span><span class="o">.</span><span class="n">libinput</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span> <span class="c1"># 允许触摸板</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Define a user account. Don't forget to set a password with ‘passwd’.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 创建用户并添加到用户组</span>
</span></span><span class="line"><span class="cl"> <span class="n">users</span><span class="o">.</span><span class="n">users</span><span class="o">.</span><span class="n">axionl</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="n">isNormalUser</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">extraGroups</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"wheel"</span> <span class="s2">"networkmanager"</span> <span class="p">];</span> <span class="c1"># Enable ‘sudo’ for the user.</span>
</span></span><span class="line"><span class="cl"> <span class="n">shell</span> <span class="o">=</span> <span class="n">pkgs</span><span class="o">.</span><span class="n">fish</span><span class="p">;</span> <span class="c1"># 指定终端(默认为 bash)</span>
</span></span><span class="line"><span class="cl"> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># List packages installed in system profile. To search, run:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># $ nix search wget</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 在系统层面安装软件包</span>
</span></span><span class="line"><span class="cl"> <span class="n">environment</span><span class="o">.</span><span class="n">systemPackages</span> <span class="o">=</span> <span class="k">with</span> <span class="n">pkgs</span><span class="p">;</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="n">htop</span>
</span></span><span class="line"><span class="cl"> <span class="n">neofetch</span>
</span></span><span class="line"><span class="cl"> <span class="n">fish</span>
</span></span><span class="line"><span class="cl"> <span class="n">spice-vdagent</span>
</span></span><span class="line"><span class="cl"> <span class="n">virglrenderer</span>
</span></span><span class="line"><span class="cl"> <span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Some programs need SUID wrappers, can be configured further or are</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># started in user sessions.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># programs.mtr.enable = true;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># programs.gnupg.agent = {</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># enable = true;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># enableSSHSupport = true;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># };</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># List services that you want to enable:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Enable the OpenSSH daemon.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># services.openssh.enable = true;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Open ports in the firewall.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># networking.firewall.allowedTCPPorts = [ ... ];</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># networking.firewall.allowedUDPPorts = [ ... ];</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Or disable the firewall altogether.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># networking.firewall.enable = false;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># This value determines the NixOS release from which the default</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># settings for stateful data, like file locations and database versions</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># on your system were taken. It‘s perfectly fine and recommended to leave</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># this value at the release version of the first install of this system.</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Before changing this value read the documentation for this option</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).</span>
</span></span><span class="line"><span class="cl"> <span class="n">system</span><span class="o">.</span><span class="n">stateVersion</span> <span class="o">=</span> <span class="s2">"20.09"</span><span class="p">;</span> <span class="c1"># Did you read the comment?</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># X Windows Server</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 启动 X 显示服务</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">xserver</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># services.qemuGuest.enable = true;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># services.spice-vdagentd.enable = true;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 允许 SDDM 作为窗口管理器</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">xserver</span><span class="o">.</span><span class="n">displayManager</span><span class="o">.</span><span class="n">sddm</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 安装 Plasma KDE 作为桌面环境</span>
</span></span><span class="line"><span class="cl"> <span class="n">services</span><span class="o">.</span><span class="n">xserver</span><span class="o">.</span><span class="n">desktopManager</span><span class="o">.</span><span class="n">plasma5</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Packages</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># 允许第三方闭源软件包</span>
</span></span><span class="line"><span class="cl"> <span class="n">nixpkgs</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">allowUnfree</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>修改配置文件之后需要使用命令重建并推荐重启生效:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo nixos-rebuild switch --upgrade
</span></span></code></pre></td></tr></table>
</div>
</div><p>日常使用的时候理论上可以多套配置(profile)兼容和切换,当配置过多的时候可用 <code>nix-collect-garbage -d</code> 来完成,详见<a class="link" href="https://nixos.org/guides/nix-pills/garbage-collector.html" target="_blank" rel="noopener"
>文档</a>。</p>
<p>在用户层面安装软件包使用 <code>nix</code> 包管理器进行搜索和安装:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ nix search <软件包名称> <span class="c1"># 搜索</span>
</span></span><span class="line"><span class="cl">$ nix-env -i <软件包名称> <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">$ nix-env -qa <span class="c1"># 列出可安装的包</span>
</span></span><span class="line"><span class="cl">$ nix-env -e <软件包名称> <span class="c1"># 卸载软件包</span>
</span></span><span class="line"><span class="cl">$ nix-env --rollback <span class="c1"># 软件包回滚</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>更多用法可见<a class="link" href="https://nixos.org/manual/nix/stable/" target="_blank" rel="noopener"
>官方文档</a></p>
</blockquote>
<h3 id="2-截图">2. 截图</h3>
<p><img src="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/final.png"
width="1960"
height="1120"
srcset="https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/final_hu716cf65f9b220f6ee002cb4b4595423f_2261830_480x0_resize_box_3.png 480w, https://axionl.me/p/%E5%9C%A8-qemu/kvm-%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E5%AE%89%E8%A3%85-nixos-%E5%8F%91%E8%A1%8C%E7%89%88/final_hu716cf65f9b220f6ee002cb4b4595423f_2261830_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="预览"
class="gallery-image"
data-flex-grow="175"
data-flex-basis="420px"
></p>