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

构建可启动的 NixOS ISO

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

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

版本范围:下列示例保留 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
sync

ISO 构建成功不等于实机启动成功。可先在 QEMU 中验证启动菜单和需要的软件,再用目标硬件核对 UEFI/BIOS、驱动及网络。

参考与延伸

  1. nix.dev ISO 教程 ↗
  2. NixOS 安装手册 ↗

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

沿专题继续阅读

NixOS 虚拟化与部署

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

把应用 derivation、运行时 closure 和容器数据状态分开管理。