磁盘阵列重新挂载后如何导入ZFS存储池(非系统崩溃场景)
磁盘阵列重新挂载后如何导入ZFS存储池(非系统崩溃场景)
兄弟,这种远程机房没专人值守的情况真的太闹心了!先给你理清楚现状:USB caddy掉电又重新识别后,设备名从sdd/sde变成了sdf/sdg,ZFS还死死认定旧设备上的池是挂载状态,但只要一碰zpool命令就卡壳——因为它还在尝试访问已经失效的sdd/sde节点。好在新设备是正常可读的,咱们就从这点切入解决问题。
给你几个逐步推进的方案,优先试前面的,尽量避开耗时的dd镜像:
第一步:清理卡住的zpool进程
那些卡着的zpool进程会占着资源,先把它们干掉:
ps aux | grep zpool | grep -v grep | awk '{print $2}' | xargs kill -9
第二步:切断ZFS对旧无效设备的访问
ZFS卡壳的核心原因是还在找sdd/sde,咱们先把这些无效的设备节点删掉(确认它们确实已经失效,别删错正常设备!):
rm -f /dev/sdd /dev/sde
第三步:用临时目录限定ZFS扫描的设备范围
为了确保zpool绝对只碰新设备,咱们创建一个临时目录,只把新设备的链接放进去,让ZFS只扫这个目录:
mkdir -p /tmp/zfs_valid_devs ln -s /dev/sdf1 /tmp/zfs_valid_devs/ ln -s /dev/sdg1 /tmp/zfs_valid_devs/
然后用强制导入命令,指定只扫描这个临时目录,并且不自动挂载(避免挂载后出问题):
zpool import -d /tmp/zfs_valid_devs -N -f 旧池名 新池名
这里的参数解释下:
-d:指定扫描设备的目录,只扫咱们的临时目录,彻底避开旧设备-N:导入后不自动挂载,先确保导入成功再处理挂载-f:强制导入,因为原池还被标记为“已挂载”状态
如果还是卡?试试用GUID导入
如果上面的命令还是卡,可能是ZFS缓存了旧的池名称关联,咱们先从新设备里读出池的GUID:
zdb -l /dev/sdf1
输出里找pool_guid那一行的数值,然后用GUID来导入:
zpool import -d /tmp/zfs_valid_devs -N -f 你的pool_guid 新池名
用GUID指定池,能彻底绕开名称缓存的问题。
最后一招:万不得已才用镜像
如果上面的方法都不行,再考虑dd镜像,但可以试试用dd加更大的块大小来提速,比如:
dd if=/dev/sdf of=/path/to/remote/drive/sdf.img bs=1M status=progress dd if=/dev/sdg of=/path/to/remote/drive/sdg.img bs=1M status=progress
然后在本地用loop设备挂载镜像再处理ZFS池,但这确实是下下策,4TB的话确实要很久,优先试前面的方案。
备注:内容来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

