版本范围:下列示例保留 NixOS 24.05 的教程上下文;该版本已结束维护。实际项目应选择受支持的发行版、锁定 nixpkgs revision,并核对相应选项。
system.stateVersion表示兼容性基线,不应随升级机械改动。本文命令是教学示例,未在目标系统运行验证。
概述#
NixOS 可以自定义构建可启动的 ISO 镜像,用于:
- 创建定制安装盘
- 制作系统维护工具盘
- 部署预配置系统
基础配置#
创建一个 iso.nix 文件:
{ pkgs, modulesPath, ... }:
{
imports = [
(modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix")
];
# ISO 标识
isoImage.makeEfiBootable = true;
isoImage.makeUsbBootable = true;
# 主机名
networking.hostName = "nixos-custom";
# 预装软件
environment.systemPackages = with pkgs; [
vim
git
htop
parted
gparted
];
# 系统版本
system.stateVersion = "24.05";
}构建 ISO#
# 构建 ISO
nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage \
-I nixos-config=./iso.nix \
-I nixpkgs=channel:nixos-24.05生成的 ISO 文件位于 ./result/iso/;文件名由构建配置决定,用 ls ./result/iso/ 确认,不假定固定名称。
图形化 ISO#
使用 GNOME 桌面环境的 ISO:
{ pkgs, modulesPath, ... }:
{
imports = [
(modulesPath + "/installer/cd-dvd/installation-cd-graphical-gnome.nix")
];
# 添加额外的软件
environment.systemPackages = with pkgs; [
firefox
libreoffice
];
}使用 Flakes 构建#
# flake.nix
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
outputs = { self, nixpkgs }: {
nixosConfigurations.iso = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
(nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix")
({ pkgs, ... }: {
isoImage.makeEfiBootable = true;
networking.hostName = "nixos-live";
environment.systemPackages = [ pkgs.vim ];
})
];
};
};
}构建:
nix build .#nixosConfigurations.iso.config.system.build.isoImage将 ISO 写入 U 盘#
写入会覆盖整个目标盘。先备份目标 U 盘,确认型号、容量和设备路径,并卸载它的已挂载分区;目标应是整盘而不是某个分区。下面的占位符必须替换,不能直接运行。
# 查看设备身份与挂载状态
lsblk -o NAME,SIZE,MODEL,TYPE,MOUNTPOINTS
ls ./result/iso/
# 确认目标后,逐个卸载其已挂载的分区
sudo umount /dev/<USB_PARTITION>
# 写入已经核对过的 ISO 和整盘设备
sudo dd if=./result/iso/<BUILT_IMAGE>.iso of=/dev/<USB_DISK> bs=4M status=progress conv=fsync
syncISO 构建成功不等于实机启动成功。可先在 QEMU 中验证启动菜单和需要的软件,再用目标硬件核对 UEFI/BIOS、驱动及网络。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。