在统信 UOS 20 上并存安装 NixOS

面向已有安全可信计算机(飞腾 Phytium D2000 + Glenfly Arise1020,统信 UOS 20 / 内核 4.19)的完整部署。NixOS 装在独立分区和子卷上,UOS 系统分区、用户数据和共享盘保持不动。固件默认仍启动 UOS。

先读这一段。 本流程不会重装 UOS,也不会格式化存放数据的分区。唯一会清空的是专用 EFI 和 /boot(仅当它们还是空盘或错误文件系统时)。在任何 mkfs 之前,先把那两块分区上还需要的文件拷走。仓库脚本对数据盘有型号校验,并拒绝操作 NVMe 上的 UOS 盘。

目标

禁止操作

磁盘角色

机械盘由仓库脚本按磁盘 ID 和型号令牌识别(WD10EARZ)。GPT 上没有 PARTLABEL,挂载一律用 UUID。下表是并存安装时的角色,不是要你重新分区。

分区角色文件系统能否格式化
sda1NixOS 可移动 EFIvfat仅当为空或文件系统不对
sda2NixOS /bootext4,标签 boot仅当为空或仍是旧标签
sda3watermelon,挂到 /shareext4否
sda4banana,NixOS 子卷btrfs否,只新建子卷

banana 上的子卷:

子卷挂载点
@nixos/(默认子卷)
@nix/nix
@home/home
@swap/swap(16G swapfile;UOS 4.19 不能 swapon,NixOS 可以)

NVMe 上的 UOS(EFI、Boot、Root、受保护分区和交换分区)不进入本安装的格式化路径。安装树挂在 /mnt,UOS 自己的根保持原样。

安装前

  1. 在真实终端里操作,需要 sudo。确认用户数据、watermelon 和 UOS 家目录都有独立备份。本流程不删除它们,但 EFI//boot 的一次性格式化不可逆。
  2. 仓库在 /home/Designers/home-config。辅助脚本是 nixos/install-nixos-beside-uos.sh。先看状态,不要直接进菜单里的格式化项:
    sudo nixos/install-nixos-beside-uos.sh status
    输出必须指向机械数据盘,并写明 UOS 仍在 NVMe、脚本不会碰它。型号不对就停。
  3. 在 UOS 上准备安装工具(只装工具,不装系统):
    nix profile install nixpkgs#nixos-install-tools
  4. 构建要写入磁盘的系统闭包。UOS 4.19 上必须关掉沙箱,否则 initrd 里的 udevadm verify 会因 EUNATCH 失败(仓库用 nixos/udev.nix 跳过这项校验):
    nix build '.#nixosConfigurations.sda.config.system.build.toplevel' \
      --out-link /tmp/nixos-sda \
      --option sandbox false --option filter-syscalls false
    需要飞腾声卡和 Glenfly DRM 时,改用下一节的 sda-phytium 闭包,仍用同一个安装脚本写入。

安装

脚本动作:status、subvolumes、mount、swap、format-boot、install、bootloader、nspawn、unmount。交互菜单是同一套命令。

  1. 只在 banana 上创建尚不存在的子卷,并把默认子卷设为 @nixos。已有子卷会跳过。这一步不执行 mkfs。
    sudo nixos/install-nixos-beside-uos.sh subvolumes
  2. 把安装树挂到 /mnt:@nixos、@nix、@home、@swap,watermelon 挂到 /mnt/share,再挂 /mnt/boot 和 /mnt/boot/efi。
    sudo nixos/install-nixos-beside-uos.sh mount
    若 sda2 仍标着旧标签或不是 ext4,脚本会拒绝把它当作 /boot。只有这时才考虑 format-boot,确认短语是 FORMAT EFI BOOT。它只格式化 sda1 和 sda2。
  3. 交换文件可选。UOS 内核对 btrfs swapfile 的 swapon 会失败,这不阻止安装;NixOS 6.18 / Deepin 6.6 能用。
    sudo nixos/install-nixos-beside-uos.sh swap
  4. 安装。若 /tmp/nixos-sda 存在,脚本用 --system 复制已构建闭包;否则用 flake #sda。两者不会同时传给 nixos-install。确认短语是 INSTALL。这一步复制闭包和引导配置,不重新分区。
    sudo nixos/install-nixos-beside-uos.sh install
    安装带 --no-root-passwd。root 口令哈希和 initrd 急救入口写在 nixos/configuration.nix 里,避免再出现「root account is locked」。
  5. GRUB 由 nixos/nixos-enter-uos.sh 安装,不使用上游 nixos-enter --mount-proc(UOS 的 binfmt_misc 会让 unshare 返回 EBUSY)。引导程序是可移动 EFI(efiInstallAsRemovable,canTouchEfiVariables = false),所以不会改写 UOS 的 NVRAM。只重装 GRUB 时:
    sudo nixos/install-nixos-beside-uos.sh bootloader
  6. 卸下安装树后再重启:
    sudo nixos/install-nixos-beside-uos.sh unmount

怎么进 NixOS,又不丢 UOS

固件默认项保持 UOS 的 NVMe。要进 NixOS,在启动菜单里选手动 EFI:机械盘上的 BOOTAA64.EFI。U 盘 KeyVault 只在走 NixOS 时需要;拔掉它,UOS 仍能启动。

NixOS 启动时在控制台输入 KeyVault 的 LUKS 口令。解锁后的 U 盘以只读方式挂到 /keyvault,并检查其中有恢复目录。banana 本身不加密。

GRUB 使用文本交接(gfxpayloadEfi = text)。这台 Glenfly 没有 initrd 里的 KMS,若保留图形帧,HDMI 上看不到内核和口令提示。

内核怎么选

Flake内核模拟声卡Glenfly
#sda主线 6.18无仅 modesetting
#sda-phytiumDeepin linux-6.6.ysnd-hda-phytium内核内 arise DRM

UOS 自带的 arise_pro 和 ft-hda 绑在 4.19.0-arm64-desktop 上,不能加载进 NixOS。优先 Deepin 6.6.y,不要用已停止维护的 UOS K5.10。首次拉取内核输入:

nix flake lock --update-input deepin-kernel

X 仍走 modesetting。完整 Glenfly OpenGL 还需要 DRM 模块以外的用户态驱动,主线 #sda 不包含它。

在 UOS 4.19 上安装时的已知失败

现象原因做法
unshare: mount /proc failed,设备或资源忙nixos-enter --mount-proc 与 /proc 下的 binfmt 冲突只用 nixos-enter-uos.sh / 脚本的 bootloader
exec: chroot: not found替换 PATH 之后才去找宿主的 chroot保留 /usr/sbin/chroot,再把 NixOS 的 sw/bin 加到前面
进入后 mount: command not foundchroot 之后仍是宿主 PATH在 -c 里把 PATH 设到系统 profile
nspawn --boot:Protocol driver not attachedsystemd 261 不能在 4.19 上当 PID 1不要 --boot。脚本的 nspawn 只是查看文件的 shell
构建时 udevadm verify 失败同一内核缺口--option sandbox false,并使用仓库的 udev 模块

装完之后

第一次从 NixOS 启动并确认是预期根分区之后,日常重建用当时的活动配置。若根已经在 NVMe 第 6 分区:

sudo nixos-rebuild switch --flake /home/Designers/home-config#nvme-p6-phytium

用户环境仍单独激活:

home-manager switch --flake .#Designers

这台机器现在的布局

2026-08-24 之后,正在运行的 NixOS 根是 NVMe 第 6 分区(flake #nvme-p6-phytium),子卷为 @nixos、@nix、@home、@tmp。交换分区是 UOS 的 NVMe 第 3 分区,不是 swapfile。UOS 仍在 NVMe 第 1–5 分区。机械盘第 4 分区是旧副本。/boot 和 /share 仍在机械盘上。

因此:新机器按上面的 sda 流程做并存;这台已经迁到 NVMe 的机器,只重建 #nvme-p6-phytium,不要再 switch #sda-phytium。