Unraid 7.3.2 ZFS 池创建失败排查实录:mountpoint '/mnt/zfs' exists and is not empty
最近在折腾 Unraid 7.3.2,组了一台 NAS,配置是 5 块希捷 4TB 机械盘(ST4000HKVS002)加一块 SSD(YSSDJQB-1TSQ)做缓存。数据盘准备用 ZFS raidz1,SSD 做独立的 cache 池。
结果 ZFS 池死活创建不了,折腾了好一阵子,最终定位到一个很隐蔽的配置问题。把整个过程记录下来,希望能帮到遇到同样坑的朋友。
问题现象
在 WebUI 中配置好 ZFS 池,点击 Start 启动阵列后,页面提示:
存在无法挂载的磁盘:
Zfs • ST4000HKVS002-3FC104
Zfs 2 • ST4000HKVS002-3FC104
Zfs 3 • ST4000HKVS002-3FC104
Zfs 4 • ST4000HKVS002-3FC104
Zfs 5 • WDC_WD40EJRX-89AKWY0_WD
Zfs~cache • YSSDJQB-1TSQ_2K23D2711323110 (sdb)
去看系统日志,关键报错如下:
文本
1Aug 25 16:14:54 Server emhttpd: creating volume: zfs (zfs)
2...(中间是对5块盘逐一执行wipefs、sgdisk分区的过程,均成功)...
3Aug 25 16:15:05 Server emhttpd: shcmd (2419): /usr/sbin/zpool create -f -o ashift=12 -O dnodesize=auto -O acltype=posixacl -O xattr=sa -O utf8only=on -m /mnt/zfs zfs raidz1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdc1
4Aug 25 16:15:05 Server root: mountpoint '/mnt/zfs' exists and is not empty
5Aug 25 16:15:05 Server root: use '-m' option to provide a different default
6Aug 25 16:15:05 Server emhttpd: shcmd (2419): exit status: 1
7Aug 25 16:15:05 Server emhttpd: mounting /mnt/zfs
8Aug 25 16:15:05 Server emhttpd: zfs: no pool uuid
9Aug 25 16:15:05 Server emhttpd: zfs: mount error: wrong or no file system错误链路很清晰:
emhttpd 对 5 块盘逐一执行
wipefs和sgdisk分区,全部成功执行
zpool create -m /mnt/zfs时报错:挂载点/mnt/zfs已存在且非空池创建失败,没有生成 pool UUID
后续挂载流程因为找不到 UUID 直接放弃
排查过程
第一轮:以为是残留数据
第一反应是磁盘上有旧的 ZFS 标签没清干净。执行了 zpool labelclear,删除 /mnt/zfs 目录,然后重新启动阵列——依然失败。
第二轮:手动命令行创建
想着绕过 WebUI,直接在终端里手动 zpool create。结果手动创建成功了,但只要一回 WebUI 点 Start,emhttpd 又会重新走一遍创建流程,再次报同样的错。
这才意识到:问题不在磁盘,而在 emhttpd 执行 zpool create 之前,/mnt/zfs 目录就已经被某个进程创建并填充了内容。
第三轮:分析配置文件
既然手动创建没问题,问题一定出在 Unraid 的池配置上。检查 /boot/config/pools/ 目录下的配置文件:
bash
1cat /boot/config/pools/zfs.cfg输出中注意到两个异常:
文本
1diskUUID=""
2diskSize="0"所有磁盘的 diskSize 都是 0,diskUUID 为空——说明池从未成功创建过,这些字段一直没有被回写。
接着看 cache 池的配置:
bash
1cat /boot/config/pools/zfs~cache.cfg输出:
文本
1diskSpindownDelay="-1"
2diskSpinupGroup=""
3diskFsProfile=""
4diskFsWidth="1"
5diskFsGroups=""
6diskId="YSSDJQB-1TSQ_2K23D2711323110"
7diskIdSlot="-"
8diskSize="0"关键发现:zfs~cache.cfg 缺少 diskFsType="zfs" 字段!
对比正常的 zfs.cfg,里面有 diskFsType="zfs",而 cache 池的配置里压根没有这一行。这很可能导致 emhttpd 在处理 cache 池时行为异常,进而在创建主池之前就创建了 /mnt/zfs 目录并往里面写了东西。
解决方案
修复 zfs~cache.cfg,补上缺失的字段:
bash
1cat > /boot/config/pools/zfs~cache.cfg << 'EOF'
2diskFsType="zfs"
3diskUUID=""
4diskAutotrim="on"
5diskCompression="on"
6diskSpindownDelay="-1"
7diskSpinupGroup=""
8diskFsProfile=""
9diskFsWidth="1"
10diskFsGroups=""
11diskId="YSSDJQB-1TSQ_2K23D2711323110"
12diskIdSlot="-"
13diskSize="0"
14diskShareEnabled="yes"
15diskSecurity="public"
16EOF然后清理残留:
bash
1rm -rf /mnt/zfs回到 WebUI 点击 Start,ZFS 池和 cache 池一次性创建成功。
根因分析
zfs~cache.cfg 缺少 diskFsType="zfs" 字段,导致 emhttpd 在启动阵列时无法正确识别 cache 池的文件系统类型。这个异常使得 emhttpd 在处理池创建顺序时出了问题——在调用 zpool create 之前就提前创建了 /mnt/zfs 挂载点目录,导致后续 zpool create -m /mnt/zfs 检测到目录非空而拒绝执行。
本质上这是一个配置文件不完整引发的连锁反应:cache 池配置缺失 → emhttpd 处理逻辑异常 → 提前创建挂载点 → 主池创建失败。
经验总结
Unraid 的池配置存储在
/boot/config/pools/目录下,每个池对应一个.cfg文件。如果池创建异常,优先检查这些配置文件是否完整。diskFsType是关键字段,缺少它会导致 emhttpd 无法正确判断文件系统类型,进而引发一系列连锁问题。日志是最好的调试工具。
zpool create的报错信息非常明确地指出了问题方向,顺着日志一步步排查就能定位根因。手动命令行操作只能作为辅助排查手段,不能替代 WebUI 的启动流程。因为每次点 Start,emhttpd 都会重新执行完整的创建流程,手动创建的池会被覆盖。
如果你也遇到了类似的 "mountpoint exists and is not empty" 错误,建议先检查
/boot/config/pools/下所有.cfg文件,确认diskFsType字段是否存在且正确。