存储架构不合理,越用越痛苦。这次让 AI 帮我 1 分钟搞定新方案。
目录
- 旧架构的痛:TrueNAS + ZFS 的不合理
- 新方案:mdadm + btrfs RAID5
- AI Agent 的 8 步部署
- 为什么是 mdadm + btrfs 而不是纯 btrfs RAID5
- 文件共享:LXC 容器跑 SMB/NFS
- 总结
旧架构的痛
用 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 方案。
存储这件事,简单就是最好的。
版权属于:一名宅。
本文链接:https://zhaiyiming.com/archives/78.html
转载时须注明出处及本声明