恢复/导入具有重复池名称的 ZFS Linux 池

恢复/导入具有重复池名称的 ZFS Linux 池

今天我做了一件非常愚蠢的事情,试图将第三个镜像添加到名为 的现有 Linux zpool backup。我犯了几个错误,因为除了每隔几年交换磁盘外,我实际上并没有对 ZFS 进行太多管理。在尝试纠正它们时,我误读了在线建议以重新创建池并创建了一个名为 的新池,backup从而破坏了现有池。(是的,我-f在它抱怨后使用了该选项。是的,我是个白痴。现在我知道再也不会这样做了。让我们继续前进。)

从我在网上读到的内容来看,我backup“创建”的原始池很可能无法恢复。这还算可以接受,因为它的名字backup是有原因的——它主要只是存放我大约 15 年前的备份。但是,有些东西最好能找回来(一些我暂时移到那里的非必要数据),还有一些东西需要我花几天时间重新设置,因为它们与驻留在该卷上的备份设置有关。(现在我知道要把这些东西备份到其他地方,所以这将是一次学习经历。)

但是我有备份——今天我正在为几个月前在系统另一次升级(以及操作系统升级)期间移除的驱动器更换第三个镜像。那个驱动器实际上并没有发生故障,但它已经很旧并且已经开始积累几个坏扇区,所以我想我最好当时就把它取出来,而不是等它损坏或发生其他事情。

无论如何,我仍然有那个旧驱动器,所以我想我可以把它放回我的系统中并从那里恢复池数据。我只会丢失过去几个月的备份数据。现在,我从未正式导出该驱动器上的池或任何东西。而且我已经升级了我的操作系统,所以我没想到它会自动检测到该驱动器。(我不知道它是否插入了同一个 SATA 端口,因为我移动了一些驱动器。)

但该zpool import命令似乎无法自动找到任何东西。尝试一些选项后,zpool import可以看到池的第二个版本(现已被破坏)backup,但那只是我在其他两个驱动器上意外创建的空池。

关于如何尝试读取第三块磁盘上的数据,您有什么建议吗?据我所知,几个月前我从机箱中取出它之前,它是 ZFS 池的一个功能完好且最新的镜像。特别是:

  1. 存在已损坏的池这一事实backup是否可能干扰检测并尝试恢复/导入该旧池的能力?有办法解决这个问题吗?
  2. 我的服务器上仍然有旧的操作系统安装,我相信在我使用旧磁盘时它正在运行。我尝试启动它只是为了看看它是否能检测到 ZFS 池,但没有。(同样,驱动器可能没有插入到同一个地方。)但是是否有任何 ZFS 日志文件或其他东西我可以提取出来,其中可能包含有关该旧池的元数据或 ID 号,或者我可能用来强制 ZFS 导入此驱动器上应该是完整的镜像的东西?
  3. 我只是假设前两个磁盘上的池已通过命令被破坏create -f。但如果有人知道我如何能够直接在那里恢复第一个池,那显然会很棒。
  4. ZFS 无法将旧的第三镜像检测为 ZFS 池磁盘还有其他原因吗?如果是,还有其他建议吗?我可以尝试其他恢复工具吗?

谢谢任何帮助或建议。

zdb -l /dev/sdb1编辑:这是(第三个驱动器)的输出

------------------------------------
LABEL 0
------------------------------------
    version: 5000
    name: 'backup'
    state: 0
    txg: 0
    pool_guid: 3936176493905234028
    errata: 0
    hostid: 8323329
    hostname: [omitted]
    top_guid: 14695910886267065742
    guid: 17986383713788026938
    vdev_children: 1
    vdev_tree:
        type: 'mirror'
        id: 0
        guid: 14695910886267065742
        whole_disk: 0
        metaslab_array: 34
        metaslab_shift: 33
        ashift: 12
        asize: 1000197324800
        is_log: 0
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 17914838236907067293
            path: '/dev/sdd1'
            whole_disk: 0
            DTL: 143
            create_txg: 4
        children[1]:
            type: 'disk'
            id: 1
            guid: 17986383713788026938
            path: '/dev/sdb1'
            whole_disk: 0
            DTL: 141
        children[2]:
            type: 'disk'
            id: 2
            guid: 1683783279473519399
            path: '/dev/sdc1'
            whole_disk: 0
            DTL: 145
            create_txg: 4
    features_for_read:
        com.delphix:hole_birth
        com.delphix:embedded_data
    create_txg: 0
    labels = 0 1 2 3 

如果我理解正确,状态 0 表示池应该是完整的。但是当我尝试使用池 GUID 进行导入时zpool import 3936176493905234028,我收到“无法导入...没有可用的池”错误。(我假设我应该使用pool_guid,但我也尝试使用guid和top_guid,但似乎没有任何效果。)

EDIT2:我从该池处于活动状态的原始操作系统中恢复了 zpool.cache 文件并尝试zpool import -c zpool.cache,结果如下:

   pool: backup
     id: 3936176493905234028
  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:

    backup      UNAVAIL  insufficient replicas
      mirror-0  UNAVAIL  insufficient replicas
        sdd1    FAULTED  corrupted data
        sdc1    FAULTED  corrupted data

这在某种程度上是可以预料到的。这两个磁盘的池被我的 create 命令覆盖。但是,sdb1 并未列为潜在驱动器 —— 可能是因为我在取出磁盘后将其从池中移除。尽管如此,我认为我在 sdb1 上拥有完整的旧镜像数据副本,zdb 也同意这一点。为什么它无法导入?

相关内容