服务器重启后ZFS存储池丢失引发卷挂载失败及备份故障求助
服务器重启后ZFS存储池丢失引发卷挂载失败及备份故障求助
看起来你分析的完全正确——ZFS存储池storage丢失就是所有问题的根源。咱们一步步拆解和解决:
问题根源梳理
之前你的/storage/backups/revitalis这类目录都是挂载在ZFS池storage下面的,重启后ZFS池未自动加载,这些依赖池的目录自然就消失了:
- 挂载ecryptfs时,因为找不到源目录
/storage/backups/revitalis,所以报No such file or directory错误 - 备份任务因为找不到
/storage/backups/Test/这个目标路径,直接触发rsync的IO错误
优先尝试:恢复现有ZFS池(不要直接重建!)
老服务器更换可用区后,最常见的原因是磁盘设备名发生了变化(比如原来的vdc变成了vdh),ZFS找不到对应的磁盘导致池未自动导入,先按这个思路排查:
- 检查磁盘是否还在系统中
先确认原来组成RAIDZ1的磁盘是否被系统识别:
lsblk # 或者查看更详细的磁盘分区信息 fdisk -l
看看原来的vdc、vdb、vde、vdd、vdf、vdg这些磁盘有没有出现,或者有没有变成其他盘符。
- 尝试手动导入ZFS池
先让系统检测可导入的池:
zpool import
如果能看到storage池的信息,直接执行导入命令:
zpool import storage
如果导入失败(提示找不到磁盘),改用磁盘的持久化ID路径导入(避免盘符变化的影响):
zpool import -d /dev/disk/by-id/ storage
要是池存在轻微损坏的迹象,还可以尝试强制修复导入:
zpool import -F storage
- 设置ZFS池开机自动加载
恢复池后,一定要确保下次重启不会再出现同样问题:
编辑/etc/default/zfs文件,确保以下配置项生效:
ZFS_MOUNT='yes' ZFS_IMPORT='yes'
恢复池后的后续操作
当storage池成功导入后,/storage/backups/xxx这些目录会自动恢复,这时候再尝试挂载ecryptfs卷:
mount /storage/mount-revitalis
此时源目录已存在,挂载应该能正常完成,备份任务也会随之恢复正常。
万不得已才考虑重建ZFS池
如果上面的方法都无法找到storage池,那可能是磁盘硬件故障或者池元数据损坏了:
- 先检查磁盘健康状态:用
smartctl -a /dev/[磁盘名]逐个检查磁盘的SMART信息,排除硬件故障 - 重建池会丢失所有现有数据,一定要确认数据已无法恢复再操作,大致步骤如下:
# 若能识别到损坏的池,先销毁它 zpool destroy storage # 用原来的磁盘重新创建RAIDZ1结构的池 zpool create storage raidz1 /dev/vdc /dev/vdb raidz1 /dev/vde /dev/vdd raidz1 /dev/vdf /dev/vdg # 创建需要的数据集 zfs create storage/backups # 重新配置ecryptfs挂载规则和备份任务
预防下次出现同样问题
因为你手动更换了可用区,云环境下磁盘盘符可能会发生变化,建议以后用磁盘ID路径(/dev/disk/by-id/下的路径)来管理ZFS磁盘,而不是直接用/dev/vdc这类临时盘符,这样即使磁盘枚举顺序变化,ZFS也能正确识别磁盘。
备注:内容来源于stack exchange,提问作者santosh baruah
相关产品推荐
相关产品推荐

