NixOS 自定义运维 ISO 构建

目标

用 NixOS 制作一个自定义系统 ISO,内置于硬盘分区、UEFI 引导、BCD 编辑、Windows 安装、ISO 处理等运维工具,用途类比 PE 维护盘。

可行性

可行。NixOS 以声明式配置文件(configuration.nix)精确指定所需软件包与配置,再生成可启动 ISO。

实现步骤

1. 编写 configuration.nix

{ config, pkgs, ... }:

{
  imports = [
    <nixpkgs/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix>
  ];

  # 禁用非必要服务
  services.sshd.enable = false;
  networking.networkmanager.enable = false;
  networking.dhcpcd.enable = false;
  services.resolved.enable = false;

  # 使用 LXDE 桌面环境
  services.xserver.enable = true;
  services.xserver.desktopManager.lxde.enable = true;
  services.xserver.displayManager.lightdm.enable = true;
  services.xserver.displayManager.autoLogin.enable = true;
  services.xserver.displayManager.autoLogin.user = "nixos";

  # 硬盘维护工具
  environment.systemPackages = with pkgs; [
    gnome.gnome-disk-utility  # 磁盘管理工具 (~20MB)
  ];

  # 支持 UEFI 启动
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # 只支持必要文件系统
  boot.supportedFilesystems = [ "ntfs" "vfat" "ext4" ];

  # 使用精简内核
  boot.kernelPackages = pkgs.linuxPackages_tinyconfig;
  boot.kernelModules = [ "ntfs" "vfat" "ext4" ];

  # 禁用国际化
  i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
  i18n.defaultLocale = "en_US.UTF-8";

  # 禁用文档
  documentation.enable = false;
  documentation.man.enable = false;

  # 最大化压缩
  isoImage.squashfsCompression = "xz -Xdict-size 100% -Xbcj x86";

  # ISO 名称
  isoImage.isoName = "nixos-lxde-disk.iso";

  # 默认用户
  users.users.nixos = {
    isNormalUser = true;
    password = "nixos";
    home = "/home/nixos";
    createHome = true;
  };

  # 添加桌面快捷方式
  environment.etc."skel/Desktop/gnome-disks.desktop" = {
    text = ''
      [Desktop Entry]
      Name=Disk Utility
      Exec=${pkgs.gnome.gnome-disk-utility}/bin/gnome-disks
      Type=Application
      Terminal=false
      Icon=drive-harddisk
    '';
    mode = "0644";
  };

  # 精简 initrd
  boot.initrd.includeDefaultModules = false;
  boot.initrd.availableKernelModules = [ "usbhid" "uas" "nvme" ];
}

2. 构建 ISO

需在已安装 Nix 包管理器的系统(一般为 Linux 或虚拟机)中执行:

nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage -I nixos-config=./configuration.nix

构建产物位于 result/iso/ 目录下,例如 nixos-custom-tools.iso。

3. 测试 ISO

qemu-system-x86_64 -cdrom result/iso/nixos-custom-tools.iso -m 2048

4. 可选扩展

  • 需要更多 Windows 工具时,可将 Windows ISO 集成进 NixOS ISO,并在启动菜单中提供入口。
  • 网络支持默认已启用,可用于下载额外工具或驱动。

工具对应

  • 硬盘分区:gparted、parted 可满足大多数需求。
  • UEFI 引导:efibootmgr 管理 UEFI 启动项,grub2 作为备用引导加载器。
  • BCD 工具:NixOS 无 bcdedit,可通过 ntfs3g 挂载 Windows 分区后手动编辑 BCD 文件,或在虚拟环境中运行 Windows 工具。
  • Windows 安装:woeusb 可将 Windows ISO 写入 U 盘。
  • ISO 工具:mkisofs、xorriso 用于创建与操作 ISO 文件。

注意事项

  • BCD 编辑:bcdedit 为 Windows 专有工具,需在 ISO 中包含轻量 Windows PE 环境,或由用户手动操作。
  • 许可问题:Windows 相关工具可能涉及版权或授权,需确保合规。
  • 硬件兼容性:需在真实硬件上测试 ISO 的 UEFI 启动能力。