在统信 UOS 20 上并存安装 NixOS
面向已有安全可信计算机(飞腾 Phytium D2000 + Glenfly Arise1020,统信 UOS 20 / 内核 4.19)的完整部署。NixOS 装在独立分区和子卷上,UOS 系统分区、用户数据和共享盘保持不动。固件默认仍启动 UOS。
/boot(仅当它们还是空盘或错误文件系统时)。在任何 mkfs 之前,先把那两块分区上还需要的文件拷走。仓库脚本对数据盘有型号校验,并拒绝操作 NVMe 上的 UOS 盘。
目标
- UOS 继续从 NVMe 启动,NixOS 作为第二系统,从机械盘的可移动 EFI 进入。
- NixOS 根、软件库、家目录、交换文件各自使用 btrfs 子卷,不覆盖 UOS 的根和数据分区。
- 共享数据盘只挂载为
/share,安装过程不格式化它。 - 配置来自本仓库 flake,而不是安装介质上的临时频道。
禁止操作
- 不要对数据盘执行
mkfs,不要对 UOS 所在的 NVMe 做任何格式化或分区。 - 不要运行 Disko 的
destroy或format。nixos/disko-config.nix只是磁盘布局说明,enableConfig保持关闭。 - 不要在 UOS 上用
systemd-nspawn --boot冒充启动测试。统信 4.19 不能把 NixOS 的 systemd 261 当作 PID 1(EUNATCH/ Protocol driver not attached)。真正的验收是从机械盘 EFI 启动。 - 若 NixOS 已经迁到 NVMe 的第 6 分区,不要在该系统上执行
nixos-rebuild switch --flake …#sda-phytium。那会写出指向旧机械盘根的 GRUB 代,而新的 Nix 存储只在 NVMe 上。本机第 22 代就是这样进了 initrd 急救,并因 root 被锁而无法进控制台。 - 不要对 banana 做
luksFormat。它保持明文。NixOS 启动口令来自 KeyVault U 盘,UOS 不依赖这只 U 盘。
磁盘角色
机械盘由仓库脚本按磁盘 ID 和型号令牌识别(WD10EARZ)。GPT 上没有 PARTLABEL,挂载一律用 UUID。下表是并存安装时的角色,不是要你重新分区。
| 分区 | 角色 | 文件系统 | 能否格式化 |
|---|---|---|---|
| sda1 | NixOS 可移动 EFI | vfat | 仅当为空或文件系统不对 |
| sda2 | NixOS /boot | ext4,标签 boot | 仅当为空或仍是旧标签 |
| sda3 | watermelon,挂到 /share | ext4 | 否 |
| sda4 | banana,NixOS 子卷 | btrfs | 否,只新建子卷 |
banana 上的子卷:
| 子卷 | 挂载点 |
|---|---|
@nixos | /(默认子卷) |
@nix | /nix |
@home | /home |
@swap | /swap(16G swapfile;UOS 4.19 不能 swapon,NixOS 可以) |
NVMe 上的 UOS(EFI、Boot、Root、受保护分区和交换分区)不进入本安装的格式化路径。安装树挂在 /mnt,UOS 自己的根保持原样。
安装前
- 在真实终端里操作,需要 sudo。确认用户数据、watermelon 和 UOS 家目录都有独立备份。本流程不删除它们,但 EFI/
/boot的一次性格式化不可逆。 - 仓库在
/home/Designers/home-config。辅助脚本是nixos/install-nixos-beside-uos.sh。先看状态,不要直接进菜单里的格式化项:sudo nixos/install-nixos-beside-uos.sh status
输出必须指向机械数据盘,并写明 UOS 仍在 NVMe、脚本不会碰它。型号不对就停。 - 在 UOS 上准备安装工具(只装工具,不装系统):
nix profile install nixpkgs#nixos-install-tools
- 构建要写入磁盘的系统闭包。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。交互菜单是同一套命令。
- 只在 banana 上创建尚不存在的子卷,并把默认子卷设为
@nixos。已有子卷会跳过。这一步不执行mkfs。sudo nixos/install-nixos-beside-uos.sh subvolumes
- 把安装树挂到
/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。 - 交换文件可选。UOS 内核对 btrfs swapfile 的
swapon会失败,这不阻止安装;NixOS 6.18 / Deepin 6.6 能用。sudo nixos/install-nixos-beside-uos.sh swap
- 安装。若
/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」。 - 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
- 卸下安装树后再重启:
sudo nixos/install-nixos-beside-uos.sh unmount
怎么进 NixOS,又不丢 UOS
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-phytium | Deepin linux-6.6.y | snd-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 found | chroot 之后仍是宿主 PATH | 在 -c 里把 PATH 设到系统 profile |
nspawn --boot:Protocol driver not attached | systemd 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
- 每次启动和重启都会把
@home做成只读快照@snapshots/home-YYYYMMDD-HHMMSS,保留 12 份。恢复时从/btrfs-root把该快照送回@home。 - tty1 自动登录、startx、oxwm、USB 鼠标:鼠标插 xHCI(USB3 或 KeyVault 集线器)。不要加载
uhci_hcd,Zhaoxin UHCI 在 6.6 上会卡住。不要写systemd.services."getty@tty1",那会把 NixOS 的 getty 包装换成不存在的/usr/bin/agetty。 - USB 惠普 M252n 走 EHCI 和 CUPS,同样不要为了找打印机去加载
uhci_hcd。 - Caps Lock 点按为 Escape,由 NixOS 的 keyd 模块提供。
这台机器现在的布局
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。