引言
存储是系统的地基——分区错了、挂载选项不当、文件系统选错,都会在数据量与故障面前付出代价。NixOS 把存储也做成声明式:分区、挂载、swap、LVM、文件系统选项全在配置里声明,nixos-rebuild switch 统一生效。本文从分区讲到 Btrfs 快照与 ZFS,覆盖服务器最常见的存储场景。
前置:/nixos-configuration/(配置基础)、/nixos-services-containers/(服务与数据卷)、/nixos-network-firewall/(系统网络)。
目录
- 1. 声明式存储的哲学
- 2. 分区与基本挂载
- 3. swap 配置
- 4. 挂载选项与 fstab 声明
- 5. LVM 逻辑卷管理
- 6. Btrfs:子卷、快照与压缩
- 7. ZFS 集成
- 8. 网络存储与远程挂载
- 9. 监控、配额与故障恢复
- 10. 速查表与一句话记忆
- 延伸阅读
1. 声明式存储的哲学
1.1 传统 vs NixOS
| 传统 | NixOS |
|---|---|
fdisk/mkfs 手工 | fileSystems/swapDevices 声明 |
手写 /etc/fstab | NixOS 自动生成 |
| 挂载失败难回滚 | 配置回退 |
| 文件系统版本漂移 | 统一声明 |
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 | 禁止执行(安全) |
| discard | SSD 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.<路径> |
| swap | swapDevices |
| UUID | lsblk -f |
| 挂载选项 | options = […] |
| LVM | /dev/mapper/ |
| Btrfs | subvol= + compress=zstd |
| Btrfs 快照 | btrfs subvolume snapshot |
| ZFS | fsType=zfs + zpool |
| NFS/CIFS | fsType=nfs/cifs |
| 回滚 | nixos-rebuild –rollback |
一句话记忆:NixOS 存储全声明式——fileSystems 声明挂载点(用 UUID 防设备名漂移)、swapDevices 声明 swap、挂载选项按场景加(noatime/compress=zstd);LVM 逻辑卷按 /dev/mapper/
延伸阅读
- /nixos-configuration/ — configuration.nix 与模块系统
- /nixos-services-containers/ — 服务数据卷与容器存储
- /nix-secrets-management/ — 挂载凭证的密钥管理
- /nix-deployment-tools/ — 多机存储同步
- [[linux]] — Linux 文件系统与磁盘管理
- [[infra]] — 云基础设施与存储
- [[devops]] — 基础设施运维
- NixOS 文件系统手册
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。