概括

概括

概括

由于以下消息,我的一个 ZFS 池无法再导入:

status: One or more devices contains corrupted data.
action: The pool cannot be imported due to damaged devices or data.
...
    data1       UNAVAIL  insufficient replicas

我想了解“副本不足”的含义,以及在提取备份并重建存储池之前是否有任何方法可以安全地从中恢复。

我还想了解造成这种情况的原因以及我可以做些什么来防止这种情况再次发生。我知道 ZFS 很棒,但作为 ZFS 新手,我需要为一些无害的事情(例如从盒子中取出驱动器)提取备份,这让我感到害怕。

背景

我最近关闭了这个盒子的电源并拔出了 SATA sda 磁盘。我 99% 确定在从墙上拔下电源之前我让系统完全关闭了电源,但如果关机时间过长,我可能进行了硬关机。

当重新插入驱动器时,我相信我将其重新插入主板上的同一个 SATA 端口,但也有可能我将其插入了不同的端口。

该盒子还包含一个较旧的 PATA sdb 磁盘,该磁盘上安装了 Debian,作为 ext 分区上唯一的操作系统。

过去,我会启动,然后导入所有池并安装卷。但这次我什么也没得到。

今天

当我启动该机器时,我处于通常的 GDM 登录屏幕,然后意识到我无法登录。后来我发现我没有用户主目录,因为它们都在一个池中。

从命令行我发现了以下内容:

# zfs list
no datasets available

# zpool list
no pools available

# zpool status
no pools available

我的驱动器可用;fdisk 产生了预期的输出,并且我有 /dev/sdaX 和 /dev/sdbX 设备。

zpool import给了我有趣的结果。其他池报告 ONLINE,但有问题的池报告了以下内容:

   pool: ...
     id: ...
  state: UNAVAIL
 status: One or more devices contains corrupted data.
 action: The pool cannot be imported due to damaged devices or data.
    see: http://zfsonlinux.org/msg/ZFS-8000-5E
 config:

        data1       UNAVAIL  insufficient replicas
          sda2      UNAVAIL

此时我能够使用 导入其他池zpool import poolname,然后查看它们是否一切正常zfs list

但这个却不是这样:

# zpool import data1
cannot import 'data1': one or more devices are already in use

zpool import显示该池的相同输出。

我想过删除这个/etc/zfs/zpool.cache文件。我导出了所有内容,然后检查了目录:

# zpool export -a
# ls /etc/zfs

导出后没有 zpool.cache,所以我只是重新启动。(我不知道如果在导入池时删除 zpool.cache 会发生什么,所以我没有尝试。)

重启后结果相同。其他池都正常,但这个池无法导入。

答案1

我想了解“副本不足”是什么意思

这意味着 ZFS 在读取或写入池时遇到错误,随后发现池中没有足够的冗余来修复该问题。由于您似乎为单驱动器池配置了 ZFS,因此这仅仅意味着它遇到了问题,现在无法自行恢复。

在简单情况下,zpool status -v将报告现在已无可挽回地损坏的单个文件。从备份中恢复它们或删除它们将使池恢复到未损坏状态。这是 ZFS 相对于单独的文件系统、逻辑卷管理器和 RAID 子系统的优势之一。影响单个文件的磁盘级别错误可以报告为该特定文件中的错误,而对于 FS + LVM + RAID 组合,较低级别的错误在向上传播堆栈时无法保持语义上下文。

zpool status但是,根据你的问题,不是报告特定文件的问题,这意味着问题池中的单个磁盘出现了更根本的问题。此时,我会考虑诊断磁盘本身:smartctl、、badblocksSpinRite、供应商诊断工具等。

将来,强烈建议至少使用 ZFS 镜像。ZFS 可以在提供一些冗余的情况下为您解决此类问题,或者至少让您勉强应付,直到您可以安排磁盘更换。

在我取出备份之前,有什么方法可以安全地恢复

如果 ZFS 可以做到这一点,它就会这么做。ZFS 不会轻易放弃,但如果它放弃,就意味着您无法安全地使用池中的数据。

此时,您最好的希望是问题在于底层存储介质出现软错误,这将允许 SpinRitebadblocks或类似程序出现并强制磁盘最后一次拉出坏扇区的干净副本并将其复制到备用扇区。

请注意,ZFS 在这方面比其他文件系统更严格,因为它不会接受部分扇区恢复。强大的数据校验和意味着只有完全恢复每个扇区才能使 ZFS 接受文件系统现在已干净。

如果您认为部分数据比没有数据要好,那么这意味着 ZFS 对您来说是个问题。相反,如果您认为不正确的数据就是不正确的,那么 ZFS 正在做您想要它做的事情。

一个或多个设备已在使用中

这不好。

这要么意味着您在 ZFS 到达该磁盘之前让其他内核驱动程序连接到该磁盘,要么意味着 ZFS 通过多条路径找到同一个磁盘。

您最好的希望是您处于第二种情况,并且强制 ZFS 仅通过一条路径搜索磁盘可以让您解决这个问题:

$ sudo ZPOOL_IMPORT_PATH="/dev/disk/by-id" zpool import -a

如果可行,则导出并重新导入问题池可能无需强制,因为 ZFS 通常会记住其 vdev 上次导入的路径。

相关内容