存储架构不合理,越用越痛苦。这次让 AI 帮我 1 分钟搞定新方案。


目录


旧架构的痛

用 TrueNAS + ZFS 跑了一年家庭存储,问题越来越多:

1. ZFS 太吃内存

ZFS 的 ARC 缓存机制号称"用内存换性能",但对家庭场景来说是用性能换内存。64GB 内存的机器,ZFS 动不动吃掉 30-40GB,其他 VM/LXC 被挤得喘不过气。调 zfs_arc_max ?调低了性能拉胯,调高了 OOM 杀进程。

2. 直通整个 HBA 给 VM = 宿主机变瞎子

TrueNAS 需要直接管理硬盘,于是我把 LSI SAS3008 阵列卡整个 PCIe passthrough 给了 TrueNAS VM。结果:

  • 宿主机(PVE)完全看不到硬盘——想在宿主机做备份?没门
  • 宿主机的备份只能写进 TrueNAS VM 的 NFS/SMB——备份目标本身就是需要被保护的对象,逻辑上就是个死循环
  • HBA 拔插要改 VM 配置、重启、等 IOMMU 重新绑定——每次折腾 10 分钟

3. 关机关不掉

PVE 关机时要先 umount 所有 NFS share。但如果 TrueNAS VM 先被 shutdown 了,NFS server 已经不存在了,umount 就会卡死在那里。每次关机都要 SSH 进去手动 umount -f -l,或者等 systemd 超时(90 秒起步)。

总结:一个家庭存储,搞得像在运维一个小型数据中心。


新方案

直接在 PVE 宿主机上跑 mdadm + btrfs RAID5,干掉 TrueNAS 这一层:

旧架构:
  PVE → TrueNAS VM (HBA 直通) → ZFS RAIDZ1 → NFS → 各 VM/LXC
  问题: 宿主机瞎、ZFS 吃内存、关机卡死

新架构:
  PVE → mdadm RAID5 → btrfs → 各 VM/LXC (本地挂载)
  优点: 宿主机直接管理、不吃内存、无关机问题

硬件:

  • 6× WDC Ultrastar HC550 18TB SAS(7200rpm)
  • LSI SAS3008 HBA
  • Debian 13 (trixie) / PVE 内核

AI Agent 的 8 步部署

这次部署全程由 AI Agent 执行。我只做一件事:看命令,说 yes

流程:

Agent: "第 N 步:执行 xxx 命令,确认?"
  ↓
我: "yes"
  ↓
Agent: 执行 → 返回结果 → "✅ 完成,下一步:..."
  ↓
重复

第 1 步:安装 mdadm

apt update && apt install -y mdadm

Agent 远程 SSH 执行,我确认。30 秒搞定。

第 2 步:确认磁盘设备名

lsblk -d -o NAME,SIZE,MODEL,SERIAL | grep WDC

确认 6 块盘的设备名和序列号,这步不能跳过——搞错盘 = 数据丢失。

sdc      16.4T WDC WUH721818ALE6L4  XXXXXXXX
sdd      16.4T WDC WUH721818ALE6L4  XXXXXXXX
sde      16.4T WDC WUH721818ALE6L4  XXXXXXXX
sdf      16.4T WDC WUH721818ALE6L4  XXXXXXXX
sdg      16.4T WDC WUH721818ALE6L4  XXXXXXXX
sdh      16.4T WDC WUH721818ALE6L4  XXXXXXXX

第 3 步:清除旧签名

wipefs -a /dev/sd[c-h]

盘从旧机器上拆过来,上面有 ZFS 分区和签名。wipefs -a 清除所有文件系统签名,让盘变成白纸。

第 4 步:创建 RAID5

mdadm --create /dev/md0 --level=5 --raid-devices=6 \
  --chunk=512K --assume-clean /dev/sd[c-h]

关键参数:

  • --chunk=512K:大文件顺序读写的甜点值
  • --assume-clean:跳过初始 resync。盘是全新的,不需要校验,省掉 100+ 小时的等待

创建后立即可用,状态 [6/6] [UUUUUU]

md0 : active raid5 sdh[5] sdg[4] sdf[3] sde[2] sdd[1] sdc[0]
      87890979840 blocks super 1.2 level 5, 512k chunk, algorithm 2 [6/6] [UUUUUU]

第 5 步:格式化 btrfs

mkfs.btrfs -L storage -f /dev/md0

btrfs 单设备模式(RAID 由 mdadm 管理)。输出:

Label:              storage
UUID:               xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Node size:          16384
Sector size:        4096
Filesystem size:    81.85TiB
Block group profiles:
  Data:             single
  Metadata:         DUP
  System:           DUP

第 6 步:挂载

mkdir -p /mnt/storage
mount -o compress=zstd /dev/md0 /mnt/storage

compress=zstd 是 btrfs 的杀手特性——zstd 压缩对文本、日志、数据库文件能省 30-50% 空间,CPU 开销很低。

Filesystem      Size  Used Avail Use% Mounted on
/dev/md0         82T  5.8M   82T   1% /mnt/storage

82TB 可用。一步到位。

第 7 步:持久化 mdadm 配置

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

确保重启后 md 设备自动组装。

第 8 步:添加 fstab

echo '/dev/md0 /mnt/storage btrfs compress=zstd,nofail 0 0' >> /etc/fstab

nofail 防止磁盘故障时系统卡在启动。


为什么是 mdadm + btrfs 而不是纯 btrfs RAID5

btrfs 原生支持 RAID5/6,为什么还要加一层 mdadm?

维度 mdadm RAID5 + btrfs 纯 btrfs RAID5
稳定性 ✅ 生产级,20 年历史 ⚠️ 实验性,write hole 未解决
数据恢复 mdadm 管理坏盘替换 btrfs rebalance(慢且不可控)
换盘操作 mdadm --replace 手动控制 btrfs device delete/add 自动
校验和 btrfs 提供(检测但不自愈) btrfs 提供(检测 + 自愈)
适用场景 固定盘数、不扩容 需要灵活扩缩容

btrfs RAID5 的 write hole 问题 至今没有完美解决。对一个存放 50TB+ 数据的存储池来说,稳定性 > 一切花哨功能

mdadm 管 RAID,btrfs 管文件系统——各司其职,简单可靠


文件共享:LXC 容器跑 SMB/NFS

存储搞定之后,下一个问题是:怎么让其他机器访问这些数据?

方案是在 PVE 上开一个 LXC 容器,专门跑文件共享服务。把宿主机的 btrfs 存储通过 bind mount 映射进容器,SMB/NFS 直接读写底层磁盘,零性能损耗。

PVE 宿主机
├── /mnt/storage (mdadm RAID5 + btrfs, 82T)
│
└── LXC 100 (pve-nas)
    ├── /mnt/storage → bind mount 映射宿主机目录
    ├── smbd (SMB/CIFS)
    ├── nfsd (NFS)
    └── 其他共享服务

为什么用 LXC 而不是直接在宿主机装 Samba?

维度 LXC 容器 宿主机直接装
隔离性 ✅ Samba 崩了不影响宿主机 ❌ 服务故障可能影响 PVE
升级风险 ✅ 容器内随意 apt upgrade ❌ 宿主机升级可能炸 PVE
备份/恢复 ✅ pct backup 一键快照 ❌ 要手动备份配置
性能 ✅ bind mount 零损耗

SMB/Samba

SMB 是最常用的文件共享协议,Windows/macOS/Linux 原生支持。

apt install -y samba samba-common-bin

配置 /etc/samba/smb.conf

[global]
   workgroup = WORKGROUP
   server string = NAS
   security = user
   map to guest = Bad User
   dns proxy = no

[share]
   path = /mnt/storage/share
   browsable = yes
   writable = yes
   guest ok = no
   valid users = @nasusers
   create mask = 0664
   directory mask = 0775
   force group = nasusers
   vfs objects = recycle
   recycle:repository = .recycle
   recycle:keeptree = yes
   recycle:versions = yes

[homes]
   path = /mnt/storage/homes/%S
   browsable = no
   writable = yes
   guest ok = no
   valid users = %S
   create mask = 0664
   directory mask = 0775
   vfs objects = recycle
   recycle:repository = .recycle
   recycle:keeptree = yes
   recycle:versions = yes

关键设计:

  • [share]:公共共享目录,所有 nasusers 组成员可读写
  • [homes]:每个用户独立的 home 目录(/mnt/storage/homes/用户名),自动按用户名映射
  • vfs objects = recycle:删除文件自动进回收站(.recycle 目录),防止误删
# 创建用户和组
groupadd nasusers
useradd -M -g nasusers -s /usr/sbin/nologin nas
mkdir -p /mnt/storage/share /mnt/storage/homes/nas
chown nas:nasusers /mnt/storage/homes/nas
chmod 2775 /mnt/storage/homes/nas
(echo '密码'; echo '密码') | smbpasswd -a -s nas

# 启动服务
systemctl enable smbd nmbd
systemctl restart smbd nmbd

连接方式:

Windows:  \\服务器IP\share
macOS:    smb://服务器IP/share
Linux:    mount -t cifs //服务器IP/share /mnt/nas -o username=nas

NFS

NFS 适合 Linux/Unix 环境,性能比 SMB 略好,配置更简单。后续会单独配置。

# 安装
apt install -y nfs-kernel-server

# 配置 /etc/exports
/mnt/storage/share  10.8.28.0/24(rw,sync,no_subtree_check,no_root_squash)
/mnt/storage/homes  10.8.28.0/24(rw,sync,no_subtree_check,root_squash)

# 启动
systemctl enable nfs-kernel-server
systemctl restart nfs-kernel-server

客户端挂载:

mount -t nfs 服务器IP:/mnt/storage/share /mnt/nas

iSCSI

iSCSI 把存储以块设备形式暴露给客户端,客户端看到的是一块本地硬盘,可以格式化成任意文件系统。适合数据库、虚拟机磁盘、需要高性能块级访问的场景。

# 安装 target 端
apt install -y targetcli-fb

# 创建 backstore(后端存储)
targetcli /backstores/fileio create disk0 /mnt/storage/iscsi/disk0.img 100G

# 创建 target
targetcli /iscsi create iqn.2026-06.local.nas:storage

# 绑定 backstore 到 target
targetcli /iscsi/iqn.2026-06.local.nas:storage/tpg1/luns create /backstores/fileio/disk0

# 配置 ACL(允许客户端 IQN)
targetcli /iscsi/iqn.2026-06.local.nas:storage/tpg1/acls create iqn.2026-06.local.client:web01

# 启动
systemctl enable target
systemctl restart target

客户端连接(Linux):

iscsiadm -m discovery -t sendtargets -p 服务器IP
iscsiadm -m node --login
# 之后 /dev/sdX 就是一块新硬盘,格式化挂载即可

其他协议

协议 适用场景 安装
WebDAV 浏览器/移动端直接访问 apt install apache2 启用 mod_dav
FTP/SFTP 传统文件传输 apt install vsftpd 或用 SSH 的 SFTP
rsync daemon 增量同步、备份 apt install rsync 配置 /etc/rsyncd.conf

不再需要 TrueNAS

TrueNAS 把上面这些服务打包进了一个 Web UI。这在手动配命令的时代有价值——点点鼠标就能开 SMB、NFS、iSCSI。但在 AI 时代,部署这些服务就是一句话的事。让 Agent 跑几行命令,比在 TrueNAS 的界面里点来点去还快。而且没有了 TrueNAS 这一层,少了一个需要维护的系统、少了一层虚拟化开销、少了一堆版本升级的风险。

底层存储用 mdadm + btrfs,文件共享用 LXC 装对应服务,AI 负责部署和配置——这就是新架构。


总结

项目 耗时
安装 mdadm 30s
确认磁盘 10s
清除签名 5s
创建 RAID5 10s
格式化 btrfs 5s
挂载 5s
持久化配置 10s
添加 fstab 5s
总计 ~80 秒

8 步,每步我 review 确认后 Agent 执行,前后不到 1 分钟完成了新存储架构的部署

没有 TrueNAS,没有 ZFS 的内存焦虑,没有 HBA 直通的弯弯绕,没有关机卡死的 NFS。PVE 宿主机直接管理硬盘,备份写本地,关机随关随走。

旧的 ZFS 数据准备直接 rsync 同步过来,不走 ZFS 那套 send/recv 的流程了。同步完成后,旧盘也会重建为同样的 mdadm + btrfs 方案。

存储这件事,简单就是最好的。