Назад | Перейти на главную страницу

Как импортировать дочерний элемент сломанного зеркала zpool на другой хост?

У меня есть жесткий диск, который когда-то принадлежал зеркальному пулу ZFS с 3 дисками на сервере Ubuntu 12.04, который называется 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
--------------------------------------------
...

Из-за этой разницы в имени идентификатора я создал следующие программные ссылки:

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 на этот другой хост?

Должен ли я, возможно, создать еще больше программных ссылок для других дисков и разделов, указывающих на этот единственный диск?

Данные наверняка все еще доступны на диске, однако ZFS в Linux кажется довольно разборчивым в том, что разрешено импортировать. Пулы ZFS отлично подходят для системы, в которой они созданы, но сценарии восстановления и обновления, похоже, серьезно затруднены из-за этого поведения.

Из документации Oracle Solaris

Когда пул создается, он внутренне привязан к хост-системе. Хост-система хранит информацию о пуле, чтобы она могла определить, когда пул недоступен. источник

но все равно

Если вы не экспортируете пул явно, а вместо этого удаляете диски вручную, вы все равно можете импортировать полученный пул в другую систему. Однако вы можете потерять последние несколько секунд транзакций с данными, и в исходной системе окажется, что пул неисправен, поскольку устройств больше нет. источник

Некоторые мысли:

  • Согласно странице руководства, -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.