ZFS:zpool 导入 - 无法使用丢失的设备

ZFS:zpool 导入 - 无法使用丢失的设备

在大约一年的时间里,我有一个 debian 服务器,在 zfs(池名称 zdata)下的 dm-crypt/luks 加密硬盘上运行数据,8 个硬盘处于镜像模式,因此 4 个镜像,每个镜像有 2 个硬盘。健康时期的 zpool 状态:

# zpool status  
pool: zdata  
state: ONLINE  
scrub: scrub completed after (blahblah)  
config:  
NAME        STATE     READ WRITE CKSUM  
zdata          ONLINE       0     0     0  
mirror-0       ONLINE       0     0     0  
 dm-name-n8_2  ONLINE       0     0     0  
 dm-name-n8_3  ONLINE       0     0     0  
mirror-1       ONLINE       0     0     0  
 dm-name-n8_0  ONLINE       0     0     0  
 dm-name-n8_1  ONLINE       0     0     0  
mirror-2       ONLINE       0     0     0  
 dm-name-n8_4  ONLINE       0     0     0  
 dm-name-n8_5  ONLINE       0     0     0  
mirror-3       ONLINE       0     0     0  
 dm-name-n8_7  ONLINE       0     0     0  
 dm-name-n8_6  ONLINE       0     0     0  
errors: No known data errors  

(当然,没有备份这 34TB 原始数据。我可以放弃几乎所有数据,但有一些文件我认为对我来说很珍贵。)
两周前升级到稳定版后,我注意到开始有几个读取、写入和校验错误与 dm-名称-n8_2。清理并没有做到这一点,因为 zfs 开始了重新同步,但从未结束它,因为它一遍又一遍地开始。就在那时,镜像中的另一个硬盘 dm-name-n8_3 也出现了同样的错误,我开始意识到,两个 hhd 各自的控制器都快要死了。
我想,比起我做了愚蠢的事情,并不是我现在能理解的一切(矿池历史什么也没显示)。其中,我开始更换“更好”的磁盘。与此同时,我正在研究一台有缺陷的家用电器,导致断电,启动后我无法再次导入池。坏磁盘现在已被删除和替换。最终我无法再次导入池:

# zpool import -f
pool: zdata
id: 1343310357846896221
state: UNAVAIL
status: One or more devices were being resilvered.
action: The pool cannot be imported due to damaged devices or data.
config:

zdata             UNAVAIL  missing device
mirror-0        DEGRADED
 dm-name-n8_2  UNAVAIL
 dm-name-n8_3  ONLINE
mirror-1       ONLINE
 n8_0          ONLINE
 n8_1          ONLINE
mirror-2       DEGRADED
 dm-name-n8_4  ONLINE
 dm-name-n8_5  UNAVAIL
mirror-3       ONLINE
 n8_7          ONLINE
 dm-name-n8_6  ONLINE

# zpool import zdata -f
cannot import 'zdata': one or more devices is currently unavailable

同样与zpool导入zdata -fnF
请注意更改的设备名称。
泳池至少有每个镜像中的设备都在线,为什么它会抱怨丢失设备?
我如何知道缺少哪个设备?有没有办法让池重新上线?我该怎么做?
(我阅读了oracle文档和freebsd手册中关于zfs的章节,学到了一些东西,但没有找到我的问题的答案。)
zdb的输出有点长,可以看出这里

答案1

最终我找到了解决这个混乱问题的方法:我看到了不同的status消息,具体取决于我使用哪些磁盘来再次启动池。我多次尝试使用四个相应磁盘的各种组合来导入处于降级状态的池,最后我得到了以下结果:

NAME                       STATE     READ WRITE CKSUM
zdata                      DEGRADED     0     0     0
  mirror-0                 DEGRADED     0     0     0
    dm-name-n8_2           ONLINE       0     0     0  (resilvering)
    11141007683912581709   UNAVAIL      0     0     0  was     /dev/disk/by-id/dm-name-n8_3
  mirror-1                 DEGRADED     0     0     0
    16620393607066428577   FAULTED      0     0     0  was     /dev/disk/by-id/dm-name-n8_0
    dm-name-n8_0           ONLINE       0     0     0
  mirror-2                 DEGRADED     0     0     0
    replacing-0            DEGRADED    85     0     0
      1051730541091272780  FAULTED      0     0     0  was     /dev/disk/by-id/dm-name-n8_4
      dm-name-n8_6         ONLINE       0     0    85  (resilvering)
dm-name-n8_4           ONLINE       0     0     0  (resilvering)
  mirror-3                 DEGRADED     0     0     0
    dm-name-n8_5           ONLINE       0     0     0
    13833275275194605312   FAULTED      0     0     0  was     /dev/disk/by-id/dm-name-n8_6

这使我能够从损坏的磁盘上抓取几乎所有数据。损失约为 0.1%(>70000 个文件中的 134 个)。

根据我的理解,zfs 在该池的每个设备上存储配置数据,并保持它们同步。也许停电损坏了这个,或者损坏了磁盘?

无论如何,我又高兴了。感谢您的阅读和帮助!

答案2

仅供以后参考。将 I/O 缓冲区 (zfs) 放在不同 I/O 缓冲区(硬件 RAID 控制器)之上总是一个坏主意。这两个人互相忽视并且可能/将会造成各种各样的麻烦。避免这种情况的明智方法是使用网络存储设备。

相关内容