Zpool故障后移除错误添加的磁盘以恢复存储池的技术求助
Zpool故障后移除错误添加的磁盘以恢复存储池的技术求助
兄弟,先别慌!你踩的这个ZFS新手坑我见过不少,先看看你的故障情况:
sudo zpool import -f -d /dev/disk/by-id/ pool: BigTank id: 8888859370501390120 state: FAULTED status: One or more devices contains corrupted data. action: The pool cannot be imported due to damaged devices or data. The pool may be active on another system, but can be imported using the '-f' flag. config: BigTank FAULTED corrupted data raidz2-0 ONLINE ata-ST4000DM000-1F2168_Z304VLYW ONLINE ata-ST4000DM000-1F2168_Z304YPPP ONLINE ata-ST4000DM000-1F2168_W3010A40 ONLINE ata-ST4000DM000-1F2168_W3010AE1 ONLINE ata-ST4000DM000-1F2168_W300ZV1B ONLINE wwn-0x5000c5008bc70a5e ONLINE wwn-0x5000c50086eef044 ONLINE sdd FAULTED corrupted data
问题根源拆解
你原来的BigTank是5块盘组成的RAIDZ2(Raid6)vdev,后来错误地直接添加了3块单盘作为独立vdev(和原RAIDZ2 vdev并列)。ZFS的存储池是条带化分布在所有vdev上的——也就是说数据会分散到每个vdev里,只要有一个vdev故障,整个池就彻底挂掉,这就是这次出问题的核心原因。
一步步恢复操作
1. 仅导入原RAIDZ2 vdev(跳过故障的额外盘)
我们要告诉ZFS只识别原来的5块盘,忽略后来加的3块。执行下面的命令(注意把命令里的5个ata-开头的设备ID换成你原池的对应设备):
sudo zpool import -f -d /dev/disk/by-id/ BigTank ata-ST4000DM000-1F2168_Z304VLYW ata-ST4000DM000-1F2168_Z304YPPP ata-ST4000DM000-1F2168_W3010A40 ata-ST4000DM000-1F2168_W3010AE1 ata-ST4000DM000-1F2168_W300ZV1B
如果运气好,池会以只读或降级状态成功导入,接下来处理额外的磁盘。
2. 移除错误添加的磁盘
首先确认池的当前状态,确保原RAIDZ2 vdev是正常在线的:
sudo zpool status BigTank
然后分步骤移除那三块额外的盘:
- 先处理故障的
sdd:先标记为离线,再执行移除操作
sudo zpool offline BigTank sdd sudo zpool remove BigTank sdd
- 再移除另外两块正常的额外盘:
sudo zpool remove BigTank wwn-0x5000c5008bc70a5e sudo zpool remove BigTank wwn-0x5000c50086eef044
3. 验证恢复结果
再次查看池的状态:
sudo zpool status BigTank
这时候你应该能看到BigTank回到了最初的5盘RAIDZ2结构,状态显示为ONLINE,数据也能正常访问了。
重要避坑提醒
以后千万别再直接给RAIDZ vdev加单盘了!ZFS里RAIDZ vdev是不能直接扩容的,正确的扩容方式只有两种:
- 逐个替换原RAIDZ里的盘为更大容量的,全部替换完成后,用
zpool online -e <池名> <设备名>命令扩展vdev的容量 - 添加一个全新的RAIDZ vdev(比如再组一组5盘RAIDZ2)到池里,这样既能增加总容量,又能保留冗余特性
备注:内容来源于stack exchange,提问作者MIke
相关产品推荐
相关产品推荐

