如何导入不同主机上损坏的 zpool 镜像的子镜像?

如何导入不同主机上损坏的 zpool 镜像的子镜像?

我有一块闲置的硬盘,它曾经属于 Ubuntu 12.04 服务器上的 3 磁盘 ZFS 镜像池,名为d510。该磁盘已正确分离,但其文件系统tank0未导出。

我现在想通过将此磁盘安装到另一个 Xubuntu 14.04 桌面系统来恢复一些文件。在此桌面系统上,磁盘显示为:

$ ls /dev/disk/by-id/
...
ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701
ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701-part1
ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701-part9
...

part1由于数据量part9非常小,因此数据似乎只存在于分区中。但是,该zdb命令显示,这个特定的磁盘分区曾经是子分区 2,在 Ubuntu 12.04 服务器上的叫法不同,即scsi-SATA_WDC_WD10EADS-00_WD-WCAV51264701-part1

$ sudo zdb -l /dev/disk/by-id/ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701-part1
--------------------------------------------
LABEL 0
--------------------------------------------
    version: 5000
    name: 'tank0'
    state: 0
    txg: 0
    pool_guid: 8764435549195071605
    hostname: 'd510'
    top_guid: 4212287141343472152
    guid: 10584802241354722513
    vdev_children: 1
    vdev_tree:
        type: 'mirror'
        id: 0
        guid: 4212287141343472152
        metaslab_array: 31
        metaslab_shift: 33
        ashift: 12
        asize: 1000189984768
        is_log: 0
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 4518508443267048848
            path: '/dev/disk/by-id/scsi-SATA_WDC_WD10EARS-00_WD-WCAV56475795-part1'
            whole_disk: 1
            DTL: 118
            create_txg: 4
            resilvering: 1
        children[1]:
            type: 'disk'
            id: 1
            guid: 12490123066008148558
            path: '/dev/disk/by-id/scsi-SATA_WDC_WD10EARS-00_WD-WCAV56524564-part1'
            whole_disk: 1
            DTL: 120
            create_txg: 4
            resilvering: 1
        children[2]:
            type: 'disk'
            id: 2
            guid: 10584802241354722513
            path: '/dev/disk/by-id/scsi-SATA_WDC_WD10EADS-00_WD-WCAV51264701-part1'
            whole_disk: 1
            DTL: 126
            resilvering: 1
    features_for_read:
    create_txg: 0
--------------------------------------------
LABEL 1
--------------------------------------------
...

因为这个id名称的差异,我创建了以下软链接:

sudo ln -s ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701 scsi-SATA_WDC_WD10EADS-00_WD-WCAV51264701
sudo ln -s ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701-part1 scsi-SATA_WDC_WD10EADS-00_WD-WCAV51264701-part1
sudo ln -s ata-WDC_WD10EADS-00M2B0_WD-WCAV51264701-part9 scsi-SATA_WDC_WD10EADS-00_WD-WCAV51264701-part9

不过,与以前不太复杂的尝试一样,文件系统不会导入(也不会导出):

$ sudo zpool import -o rdonly=on -d . -D -f -X -R /mnt 8764435549195071605
no pools available to import

关于如何在这个不同的主机上导入这个孤立的 ZFS 镜像磁盘有什么建议吗?

我是否应该为指向此单个驱动器的其他驱动器和分区创建更多软链接?

数据肯定仍可在磁盘上使用,但 Linux 上的 ZFS 似乎对允许导入的内容相当挑剔。ZFS 池在创建这些池的系统上非常棒,但这种行为似乎严重阻碍了恢复和升级方案。

摘自 Oracle Solaris 文档

创建池后,它本质上与主机系统绑定在一起。主机系统会维护有关池的信息,以便能够检测池何时不可用。来源

但仍然

如果您没有明确导出池,而是手动移除磁盘,您仍然可以将生成的池导入另一个系统。但是,您可能会丢失最后几秒钟的数据事务,并且由于设备不再存在,池将在原始系统上显示为故障。来源

答案1

一些想法:

  • 根据手册页,-D 仅导入已被销毁的池。也许您的池从未被销毁,因此不会显示?

  • 也许这些选项可以帮到你?

    -F
        Recovery mode for a non-importable pool.
        Attempt to return the pool to an importable
        state by discarding the last few transactions.
        Not all damaged pools can be recovered by
        using this option. If successful, the data
        from the discarded transactions is
        irretrievably lost. This option is ignored if
        the pool is importable or already imported.
    
    
     -n
        Used with the -F recovery option. Determines
        whether a non-importable pool can be made
        importable again, but does not actually
        perform the pool recovery. For more details
        about pool recovery mode, see the -F option,
        above.
    

相关内容