OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 069

用 QEMU 验证 NixOS 配置

从最小配置到 GNOME 与 Sway,区分虚拟机声明和持久化磁盘状态。

所在专题NixOS 虚拟化与部署 ↗
约 9 分钟阅读开始阅读

版本范围:下列示例保留 NixOS 24.05 的教程上下文;该版本已结束维护。实际项目应选择受支持的发行版、锁定 nixpkgs revision,并核对相应选项。system.stateVersion 表示兼容性基线,不应随升级机械改动。本文命令是教学示例,未在目标系统运行验证。

翻译自 nix.dev: NixOS virtual machines

本章介绍如何创建和管理 NixOS 虚拟机,这是测试配置和学习 NixOS 的绝佳方式。

本章学习目标#

  • 创建一个基本的 NixOS 虚拟机配置
  • 使用 QEMU 运行虚拟机
  • 配置图形界面(GNOME/Sway)
  • 理解虚拟机参数

前置要求#

  • Linux 系统(支持虚拟化)
  • 已安装 Nix(可通过 nix.dev/install-nix 安装)
  • 基本的 Nix 语言知识

1. 基础配置#

创建一个 configuration.nix 文件:

{ config, pkgs, ... }:
{
  # 引导加载器配置
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # 创建用户
  users.users.alice = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];  # 启用 sudo
    initialPassword = "<VM_TEST_PASSWORD>";   # 初始密码(仅演示用)
  };

  # 安装示例软件包
  environment.systemPackages = with pkgs; [
    cowsay
    lolcat
  ];

  # 系统版本
  system.stateVersion = "24.05";
}

2. 构建虚拟机#

使用 nix-build 命令构建虚拟机:

nix-build '<nixpkgs/nixos>' -A vm \
  -I nixpkgs=channel:nixos-24.05 \
  -I nixos-config=./configuration.nix

命令解析:

  • <nixpkgs/nixos>: NixOS 的入口文件
  • -A vm: 构建 vm 属性
  • -I nixpkgs=channel:nixos-24.05: 使用 NixOS 24.05 频道
  • -I nixos-config=./configuration.nix: 指定你的配置文件

3. 运行虚拟机#

构建完成后,会在当前目录生成 result 符号链接:

# 查看生成的文件
ls -R ./result

# 运行虚拟机(无图形界面)
QEMU_KERNEL_PARAMS=console=ttyS0 ./result/bin/run-nixos-vm -nographic

注意: 退出虚拟机后运行 reset,恢复终端设置。明文 initialPassword 只适用于可丢弃的隔离测试 VM;生产系统使用密码文件或经过核对的 SSH 公钥配置。

登录:

  • 用户名:alice
  • 密码:配置中替换的 <VM_TEST_PASSWORD>

测试安装的软件:

cowsay hello | lolcat

退出虚拟机:

sudo poweroff

清理虚拟机状态

每次运行虚拟机会在目录下创建 nixos.qcow2 磁盘镜像文件,包含虚拟机的状态。修改配置后,如果要清除旧密码与运行时状态,先停止该 VM、确认没有需要保留的数据,再删除它的磁盘:

rm nixos.qcow2

4. 图形化虚拟机(GNOME)#

要在虚拟机中运行 GNOME 桌面环境,修改配置:

{ config, pkgs, ... }:
{
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # 启用 X11
  services.xserver.enable = true;

  # 启用 GDM 和 GNOME
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;

  users.users.alice = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
    initialPassword = "<VM_TEST_PASSWORD>";
  };

  system.stateVersion = "24.05";
}

修改配置后重新执行前面的 VM 构建命令,再运行(不带 -nographic 参数):

./result/bin/run-nixos-vm

使用预定义的安装镜像配置

NixOS 提供了预定义的图形安装镜像配置:

nix-shell -I nixpkgs=channel:nixos-24.05 -p "$(cat <<EOF
  let
    pkgs = import <nixpkgs> { config = {}; overlays = []; };
    iso-config = pkgs.path + /nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix;
    nixos = pkgs.nixos iso-config;
  in nixos.config.system.build.nixos-generate-config
EOF
)"

nixos-generate-config --dir ./

5. Wayland 桌面(Sway)#

要运行 Sway(Wayland 窗口管理器):

{ config, pkgs, ... }:
{
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;

  # 启用 Sway
  programs.sway.enable = true;

  users.users.alice = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
    initialPassword = "<VM_TEST_PASSWORD>";
  };

  system.stateVersion = "24.05";
}

注意: 在虚拟机中运行 Wayland 可能需要特定的 QEMU 显示驱动:

./result/bin/run-nixos-vm -device virtio-vga

在配置中声明 QEMU 选项

{ config, pkgs, ... }:
{
  # ... 前面的配置 ...

  # 导入 QEMU 虚拟机模块
  imports = [ <nixpkgs/nixos/modules/virtualisation/qemu-vm.nix> ];

  # 配置 QEMU 选项
  virtualisation.qemu.options = [
    "-device virtio-vga"
  ];

  system.stateVersion = "24.05";
}

虚拟机配置选项#

查看所有可用的 QEMU 配置选项:

实用技巧#

快速重启虚拟机

# 在虚拟机内执行
sudo reboot

强制停止虚拟机

# 从另一个终端确认该测试 VM 的 PID
pgrep -af qemu
# 只终止已确认的测试 VM;替换占位符后执行
kill <TEST_VM_PID>

查看虚拟机日志

QEMU_KERNEL_PARAMS=console=ttyS0 ./result/bin/run-nixos-vm -nographic 2>&1 | tee vm.log

下一步#


参考资源#


参考与延伸

  1. nix.dev 虚拟机教程 ↗
  2. QEMU 系统模拟器文档 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

NixOS 虚拟化与部署

  1. 01用 QEMU 验证 NixOS 配置
  2. 02构建可启动的 NixOS ISO
  3. 03用 dockerTools 构建与运行容器镜像
  4. 04通过 SSH 部署 NixOS
  5. 05Terraform 与 NixOS 的部署分工
  6. 06设计分层的桌面与开发环境
CONTINUE READING / 下一篇构建可启动的 NixOS ISO

通过安装介质模块定制软件、图形桌面和可启动镜像。