nixos系统的硬盘规划
现状(2026-10-08 实测)
| 盘 | 型号 | 容量 | 分区 |
|---|---|---|---|
| nvme0n1 | BC711 NVMe SK hynix | 119.2 GiB | p1 1 GiB vfat /boot(用 161 MiB)· p2 118.2 GiB ext4 /(用 35 G,剩 76 G) |
| nvme1n1 | CWESR02TBTLCZ-27J-2 | 1.86 TiB | p1 551 MiB vfat BWINEFI · p2 295.1 GiB ntfs s500win · 未分配约 1.57 TiB |
目标布局:盘1 入主
盘1 nvme1n1 1.86 TiB —— 主力盘
p1 551 MiB vfat BWINEFI Windows ESP,原样保留
p2 295.1 GiB ntfs s500win 后备 Win,原样保留(零成本,将来可回收)
p3 1 GiB vfat NIXESP 新建:NixOS 自己的 ESP(与 Windows 分开)
p4 256 GiB ext4 / NixOS root
p5 ~1.32 TiB 待定 /s500data 挂载点(文件系统待定)
盘2 nvme0n1 119.2 GiB —— 原样不动 = 一台完整可启动的备用 NixOS
/s500data 下平铺(同一层,不嵌套):
vms/ repos/ docker/ <个人数据目录…>分盘判据
| 决策 | 理由 |
|---|---|
| root 倾向 ext4(不倾向 ZFS) | NixOS generation 本身就是 root 的时点回退(启动菜单切代),ZFS root 增量价值小;ext4 保住「任何 U 盘都能 mount 修」 |
| 挂载点命名用业务 / 设备名 | 不用 dataset / pool / tank 这类技术概念名 —— 名字不得预设技术选型,否则读方案的人会默认朝某个技术走 |
| /s500data 的文件系统不预设 | 判据:要快照 / 校验 / zfs send 到冷备 → ZFS;要任何 U 盘可 mount、可 fsck → ext4。技术选择留到建盘前定 |
| root 给 256 GiB(比现在大一倍) | ZFS 只能长不能缩,所以 root 给宽是安全的;root 增长源只有 /nix/store,配自动 gc 后稳定 |
| ESP 与 Windows 分开 | Windows 功能更新会重写引导项;分开后 NixOS 的 generation 回退链不受盘1 任何操作波及 |
| 盘2 原样保留 | 零成本救援系统,也是未来唯一扩容位(内部仅 2 个 M.2 位,已占满) |
| 不建任何冗余 | 内部没有第三盘位,mirror / raidz 物理上无从谈起 |
配套三件(缺一不可)
nix.gc.automatic = true; nix.gc.options = "--delete-older-than 14d";
nix.settings.auto-optimise-store = true; # 不给 gc,/nix/store 无界增长,root 迟早撑爆
boot.loader.systemd-boot.configurationLimit = 10; # ESP 写满 = rebuild 直接失败
boot.extraModprobeConfig = "options zfs zfs_arc_max=17179869184"; # 16 GiB(默认吃 50% = 32 G)不可逆点(建盘前必须一次定对;标 ZFS|的四项仅在选 ZFS 时适用)
| 项 | 当前选择 | 定错能改吗 |
|---|---|---|
| ZFS|加密 | 开 / 不开 | 不可逆:2.4 原生加密必须建 dataset 时开,明文不能转 |
| ZFS|ashift | 12(4K,NVMe 必须) | 建池定死 |
| ZFS|pool 名 + dataset 划分 | 见布局 | 拆分容易,合并要 send/receive 重写 |
| ZFS|recordsize(每 dataset) | 按用途分(VM 大块 / DB 小块) | 只对之后新写入的文件生效 |
| root 与数据盘的容量切分 | 256 GiB / 1.32 TiB | 事后不便宜 |
待定
- p4 root 用 ext4 还是 ZFS(判断倾向 ext4)
- p5 /s500data 用 ext4 还是 ZFS(判断倾向 ZFS:快照 / zfs send / 校验正是数据层缺的)
- 若选 ZFS:加密开不开(必须建 dataset 时定,事后不可逆)
- 盘1 的 295 GiB s500win 分区保不保(倾向保留)
- 待实测:盘1 那块 2 TB 的实际读写性能(决定「数据放这块盘」是升级还是降级)
ntfs,ext4,zfs,raid的分析
四种的定位
| 名称 | 定位 | 快照 | 校验 | 缩容 | 跨机可修 |
|---|---|---|---|---|---|
| ntfs | Windows 文件系统,日志 + ACL + 压缩 + 卷影副本 | 卷影副本 | 无端到端校验和 | 能 | Windows 原生,Linux 需 ntfs-3g |
| ext4 | Linux 通用日志文件系统 | 无 | 无 | 能(离线 resize2fs + fsck) | 任何 Linux 直接 mount |
| zfs | 存储池管理 + 文件系统 + 卷管理三合一 | 有,O(1) | 有,每块数据带校验和 | 只能长,永不能缩 | 需 ZFS 2.4+ 用户态 |
| raid | 把 N 块盘的地址空间映射成一个逻辑地址空间的存储虚拟化,本身不是文件系统 | 无 | 无(parity 只保证可读,不保证语义正确) | 不适用 | 不适用 |
ZFS 一体两面:机制 · 收益 · 代价
| 机制 | 收益面 | 代价 / 边界 |
|---|---|---|
| 「数据不会丢」(宣称) | 这条不成立 | 单盘 ZFS = 单盘风险,和 ext4 一样会丢。它的真实收益在时间维度与可见性,不在 durability |
| 冗余(mirror / raidz) | 部分盘失效仍可读 | 本机不启用 —— 内部没有第二块盘位,单盘无从谈起 |
| 快照 | 有,O(1),这是普通文件系统没有的时间维度 | 不是备份:同池快照跟池一起死,zpool destroy = 快照全没 |
| zfs send / receive | 把「另一份数据在另一个介质上」变成可增量、可校验、可自动化 | 依赖另置介质 + 定期任务;nixos-rebuild 不管 dataset,快照计划 / 保留策略 / scrub 定时全要自己搭,不搭 = 白装 |
| 端到端校验和 | 每块数据带校验和 | 单盘上只能发现不能修 = 可见性,不是安全;看到 checksum error 的正确反应是换盘 + 从备份恢复 |
| 空间池化 / dataset quota | 池内空间共享,管理粒度比分区细 | 只能长,永不能缩 —— 交给它的空间拿不回来,划多少必须一次定对 |
| 建池参数(ashift / 加密 / features) | 可精调扇区对齐、可原生加密 | 建池那一次几乎不可逆;recordsize、compression 只对之后新写入的文件生效,全量改要 send/receive 重写 |
| 透明压缩 | 1.5–2x 常见 | CPU 代价低到可忽略 —— 但压缩率不是宣传的那么夸张 |
| 内核耦合 | ZFS 2.4.4 对内核 6.18 有包(属性名 zfs_2_4) | 树外内核模块,内核跑太快就构建失败或切换后起不来;linuxPackages.zfs 属性名已被 nixpkgs 删除(2025-01),老教程写法直接报错 |
| ARC 缓存 | 用内存换读性能 | 默认上限 = 物理内存 50%,64 G 机上可吃 32 G,与 VM 争抢,必须设 zfs_arc_max |
| COW 写时复制 | 快照 / 回退的基础 | 随机小写比单盘还慢(写放大),数据库、容器 overlay 是弱区 |
| 命令行 | 表达能力完整 | 没有回收站:zpool destroy、zfs destroy -r 不可撤销 |
| 救援面 | — | ext4 任何 Linux U 盘可 mount;ZFS 盘要 ZFS 2.4+ 用户态,老救援盘读不了 |
结论
- ZFS 的增量价值不在冗余:它在普通文件系统之外多给了时间维度(快照 / send)与可见性维度(校验)。
- 单盘机上只应取这两样 —— 「防丢数据」买不到,也不该买。
- 有价值排序:send / 快照 >> 压缩 > 校验。
- 净影响:ZFS 在盘1 上就是「带快照与校验的文件系统」;真正的「不会丢」由 /s500data 定期 zfs send 到移动硬盘(离线、另一个物理介质、可校验)承载 —— 这正好就是备份层要建的东西。