NixOS 存储与文件系统:分区、LVM、Btrfs 与磁盘管理

NixOS 存储管理实战:磁盘分区与挂载、swap 配置、LVM 逻辑卷、Btrfs 子卷/快照/压缩、ZFS 集成、挂载选项与 fstab 声明式管理、磁盘配额与监控、故障恢复。

引言

存储是系统的地基——分区错了、挂载选项不当、文件系统选错,都会在数据量与故障面前付出代价。NixOS 把存储也做成声明式:分区、挂载、swap、LVM、文件系统选项全在配置里声明,nixos-rebuild switch 统一生效。本文从分区讲到 Btrfs 快照与 ZFS,覆盖服务器最常见的存储场景。

前置:/nixos-configuration/(配置基础)、/nixos-services-containers/(服务与数据卷)、/nixos-network-firewall/(系统网络)。


目录


1. 声明式存储的哲学

1.1 传统 vs NixOS

传统NixOS
fdisk/mkfs 手工fileSystems/swapDevices 声明
手写 /etc/fstabNixOS 自动生成
挂载失败难回滚配置回退
文件系统版本漂移统一声明

1.2 核心模块

fileSystems    # 挂载点与选项
swapDevices    # swap
boot.initrd    # 早期根挂载

记忆:NixOS 存储全声明在 fileSystems/swapDevices 等模块,自动生成 fstab、rebuild 生效可回滚。


2. 分区与基本挂载

2.1 根文件系统挂载

fileSystems."/" = {
  device = "/dev/disk/by-uuid/xxx";   # 用 UUID 而非 /dev/sda
  fsType = "ext4";
};

2.2 常见分区方案

# /boot(EFI 系统分区)
fileSystems."/boot" = {
  device = "/dev/disk/by-uuid/yyy";
  fsType = "vfat";
  options = [ "fmask=0022" "dmask=0022" ];
};
# 数据盘
fileSystems."/data" = {
  device = "/dev/disk/by-uuid/zzz";
  fsType = "xfs";
  options = [ "noatime" ];   # 关闭 atime 提升 IO
};

2.3 用 UUID 而不是设备名

设备名(/dev/sda)会漂移,UUID 稳定。lsblk -f 查看 UUID。

记忆:根/数据盘用 fileSystems 声明、挂载用 UUID(防设备名漂移);/boot 用 vfat、数据盘按需选 xfs/btrfs。


3. swap 配置

3.1 交换分区或文件

# swap 分区
swapDevices = [{
  device = "/dev/disk/by-uuid/swap";
}];
# 或 swap 文件
swapDevices = [{
  device = "/swapfile";
  size = 8192;   # MB,创建/调整用声明管理
}];

3.2 swap 调优

boot.kernelParams = [ "swapaccount" ];    # 需要时启用
# 系统参数:swappiness(内存压力换出倾向)
systemd.services.set-swappiness = { ... };   # 或声明 sysctl

记忆:swap 分区用 UUID、swap 文件用 size 声明自动创建;swappiness 等调优可加内核参数或 sysctl。


4. 挂载选项与 fstab 声明

4.1 常用挂载选项

选项作用
noatime关闭访问时间,降 IO
relatime相对时间,默认
errors=remount-ro出错只读保护
noexec禁止执行(安全)
discardSSD TRIM(仅适合 SSD)

4.2 完整示例

fileSystems."/var/lib/postgresql" = {
  device = "/dev/mapper/vg-pgdata";
  fsType = "xfs";
  options = [ "noatime" "nobarrier" ];
};

4.3 挂载依赖

fileSystems."/var/lib/postgresql" = {
  device = ...;
  fsType = "xfs";
  depends = [ "/dev/mapper/vg-pgdata" ];   # 先激活 LVM
};

记忆:挂载选项按场景加(noatime 降 IO、errors=remount-ro 保护);有依赖的设备用 depends 声明先后。


5. LVM 逻辑卷管理

5.1 声明 LVM

# 激活 LVM 卷组(PV 列表)
boot.initrd.lvm.enable = true;
# LVM 卷组由系统自动发现(pvscan/vgscan)

5.2 挂载逻辑卷

fileSystems."/data" = {
  device = "/dev/mapper/vg-data";
  fsType = "ext4";
};

5.3 创建/扩容逻辑卷(一次性操作)

# 在首次安装/维护时执行
pvcreate /dev/sdb
vgcreate vg /dev/sdb
lvcreate -L 100G -n data vg
mkfs.ext4 /dev/mapper/vg-data
# 扩容:lvextend + resize2fs/xfs_growfs

记忆:LVM 逻辑卷按 /dev/mapper/- 声明挂载;PV/VG/LV 创建与扩容是一次性操作,挂载是声明式。


6. Btrfs:子卷、快照与压缩

6.1 Btrfs 挂载与子卷

fileSystems."/" = {
  device = "/dev/disk/by-uuid/xxx";
  fsType = "btrfs";
  options = [ "subvol=root" "compress=zstd" "noatime" ];
};

6.2 快照与回滚

# 快照
btrfs subvolume snapshot / /mnt/snap-$(date +%F)
# 回滚(配合 NixOS 配置回退)
nixos-rebuild --rollback   # 配置回退

6.3 压缩与配额

options = [ "subvol=@home" "compress=zstd:3" ];
# 配额:btrfs qgroup 管理(高级)

记忆:Btrfs 用 subvol= 选子卷、compress=zstd 压缩、noatime 降 IO;快照用 btrfs subvolume snapshot,配合 nixos-rebuild –rollback 做系统级回滚。


7. ZFS 集成

7.1 启用 ZFS 模块

boot.zfs.enable = true;
boot.kernelPackages = config.boot.zfs.package;   # 匹配内核

7.2 挂载 ZFS 池

fileSystems."/tank" = {
  device = "tank";
  fsType = "zfs";
  options = [ "zfsutil" ];
};

7.3 创建池(一次性)

zpool create tank mirror /dev/sda /dev/sdb
zfs create tank/data
zfs set compression=lz4 tank/data

记忆:ZFS 挂载用 fileSystems 声明(fsType=zfs);池创建是一次性操作;boot.zfs.enable 加载模块匹配内核。


8. 网络存储与远程挂载

8.1 NFS 客户端

fileSystems."/mnt/nas" = {
  device = "nas.example.com:/export";
  fsType = "nfs";
  options = [ "defaults" "nfsvers=4" "hard" "intr" ];
};

8.2 CIFS/SMB

fileSystems."/mnt/winshare" = {
  device = "//server/share";
  fsType = "cifs";
  options = [
    "username=user" "password=${config.age.secrets.cifs_pass.path}"
    "uid=1000" "gid=1000"
  ];
};

记忆:NFS/CIFS 都在 fileSystems 声明;CIFS 密码用密钥管理(age)引用不写明文。


9. 监控、配额与故障恢复

9.1 磁盘监控

services.duply = { enable = true; };   # 备份(可选)
# 常用命令行监控
# df -h / du -sh / btrfs filesystem usage / zpool status

9.2 配额

# XFS/Ext4 项目配额
# btrfs qgroup 配额
# 简单:services 配 systemd 检查脚本

9.3 故障恢复

根挂载失败 → 进 Live 环境 chroot 修复
文件系统损坏 → fsck / btrfs scrub / zpool scrub
NixOS 配置出错 → nixos-rebuild --rollback 回退

记忆:监控用 df/du、btrfs filesystem usage、zpool status;损坏用 fsck/scrub;配置出错 nixos-rebuild –rollback 一步回退。


10. 速查表与一句话记忆

场景声明/做法
挂载fileSystems.<路径>
swapswapDevices
UUIDlsblk -f
挂载选项options = […]
LVM/dev/mapper/-
Btrfssubvol= + compress=zstd
Btrfs 快照btrfs subvolume snapshot
ZFSfsType=zfs + zpool
NFS/CIFSfsType=nfs/cifs
回滚nixos-rebuild –rollback

一句话记忆:NixOS 存储全声明式——fileSystems 声明挂载点(用 UUID 防设备名漂移)、swapDevices 声明 swap、挂载选项按场景加(noatime/compress=zstd);LVM 逻辑卷按 /dev/mapper/- 挂载(PV/VG 创建是一次性的),Btrfs 用子卷+zstd 压缩、btrfs subvolume snapshot 做快照,ZFS 用 fsType=zfs 挂载池;远程 NFS/CIFS 同样声明、CIFS 密码走 age 密钥;损坏用 fsck/scrub,配置出错 nixos-rebuild –rollback 一步回退。


延伸阅读

  • /nixos-configuration/ — configuration.nix 与模块系统
  • /nixos-services-containers/ — 服务数据卷与容器存储
  • /nix-secrets-management/ — 挂载凭证的密钥管理
  • /nix-deployment-tools/ — 多机存储同步
  • [[linux]] — Linux 文件系统与磁盘管理
  • [[infra]] — 云基础设施与存储
  • [[devops]] — 基础设施运维
  • NixOS 文件系统手册

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「nix」更多文章

  1. NixOS 运维实战:升级、回滚、GC 与日常维护
  2. NixOS 网络与防火墙配置:声明式网络管理实战
  3. NixOS 服务管理实战:systemd 声明、NixOS 容器与常用服务部署