版本范围:下列示例保留 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.qcow24. 图形化虚拟机(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下一步#
- 05-构建ISO - 构建可启动 ISO 镜像
- 06-Docker镜像 - 构建 Docker 镜像
- 10-最佳实践 - 最佳实践指南
参考资源#
参考与延伸
根据技术笔记重新整理,示例使用通用名称。