Восстановление данных из файловой системы ZFS размещённой на VMware

Восстановление данных из файловой системы ZFS размещённой на VMware

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

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

Я скопировал vmfs хранилище на отдельный диск и подключил его к ESXi.
В ESXi создал новую VM и к ней подключил этот диск, как RDM.

Важно размещать локальный системый файл на локальном хранилище (не vSAN) иначе будет ошибка.
{.is-warning}

Установка и настройка

Ставим систему, в конкретно этом примере будет рассмотрена Ubuntu.

Установим необходимые пакеты:

1
2
apt-get update
apt-get install qemu-system-x86 zfsutils-linux

Создаём папку для монтирования диска с данным vmfs-хранилища.

1
mkdir -p /mnt/6tb

Находим наш диск.

1
2
3
4
5
6
7
8
9
10
11
# fdisk -l
Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors
Disk model: HGST HUS726T6TAL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: B74F47F1-208F-2248-90D4-BA9FCAA82DDF

Device Start End Sectors Size Type
/dev/sdb1 2048 11721045134 11721043087 5.5T Linux filesystem

Монтируем к папке.

1
mount /dev/sdb1 /mnt/6tb

Проверяем.

1
2
3
4
5
6
7
8
9
10
11
12
13
# ls -lah
total 3.0T
drwxr-xr-x 3 root root 4.0K Nov 11 23:33 .
drwxr-xr-x 4 root root 4.0K Nov 11 15:26 ..
-rw-r--r-- 1 root root 398 Nov 11 23:33 loggfile
-rw-r--r-- 1 root root 398 Nov 11 23:32 loggfile.bak
drwx------ 2 root root 16K Nov 10 13:54 lost+found
-rw------- 1 root root 1000G Nov 10 19:27 SD-LAN-NAS_1-flat.vmdk
-rw------- 1 root root 538 Nov 10 19:27 SD-LAN-NAS_1.vmdk
-rw------- 1 root root 1000G Nov 10 22:31 SD-LAN-NAS_2-flat.vmdk
-rw------- 1 root root 538 Nov 10 22:31 SD-LAN-NAS_2.vmdk
-rw------- 1 root root 1000G Nov 10 16:41 SD-LAN-NAS-flat.vmdk
-rw------- 1 root root 536 Nov 10 16:41 SD-LAN-NAS.vmdk

Виртуальный диск должен быть доступен в папке /mnt/6tb/xxxx.vmdk, где xxxx — это имя виртуальной машины, которую использовали для запуска. В моем случае это был /mnt/6tb/SD-LAN-NAS_2.vmdk. Прикрепим это к устройству nbd. fdisk -l теперь должен отображать два раздела: раздел подкачки в /dev/nbd1p1 и файловую систему ZFS в /dev/nbd1p2.

1
2
modprobe nbd
qemu-nbd -f vmdk -r -c /dev/nbd1 /mnt/6tb/SD-LAN-NAS_2.vmdk
1
2
3
4
5
6
7
8
9
10
11
12
# fdisk -l

Disk /dev/nbd1: 1000 GiB, 1073741824000 bytes, 2097152000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DD45AC7E-4578-11ED-814C-005056B43E49

Device Start End Sectors Size Type
/dev/nbd1p1 128 4194431 4194304 2G FreeBSD swap
/dev/nbd1p2 4194432 2097151959 2092957528 998G FreeBSD ZFS

Скопируем все устройство на новый диск. Это займет очень много времени, в зависимости от объёма, поскольку копирование побайтовое. status=progress будет отображать ход выполнения копирования.

1
dd if=/dev/nbd1 of=/dev/sdb bs=64k conv=noerror,sync status=progress

В качестве /dev/sdb у меня выступает новый виртуальный диск такого же объёма добавленный в VM.

Важно! Если есть побитые данные, то не факт, что копирование пройдёт успешно и будут ошибки ввода/вывода.
{.is-warning}

В этом случае воспользуемся утилитой ddrescue.

1
2
3
4
ddrescue -f -n /dev/nbd1p2 /dev/sdc2 logfile
ddrescue -d -f -r3 /dev/nbd1p2 /dev/sdc2 logfile
fdisk /dev/sdc2
e2fsck -v -f /dev/sdc2

Предположим, что поврежденный диск - /dev/nbd1p2, и мы копируем его в /dev/sdc2. Первая из приведенных команд копирует как максимально возможное количество данных без повторных попыток. Вторая команда снова работает с поврежденной файловой системой и делает три попытки чтения. Лог-файл находится в корневой файловой системе.

Если у вас есть поврежденные файлы, которые ddrescue не может полностью восстановить, вам понадобятся другие инструменты для их восстановления, такие как Testdisk, Photorec, Foremost или Scalpel. https://www.klennet.com/zfs-recovery/
{.is-info}

Процесс копирования

После завершения fdisk -l покажет ZFS файловую систему на /dev/sdc. Удалим NBD-девайс чтобы не было конфликтов и выполним zpool import, который покажет наш пул.

1
2
rm /dev/nbd1
zpool import
1
2
3
4
5
6
7
8
9
10
11
12
root@rb:/mnt# zpool import
pool: VCD-SHARE
id: 2269506756275748152
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-EY
config:

VCD-SHARE ONLINE
nbd1p2 ONLINE

Импортируем файловую систему ZFS с нового диска, указав, куда монтировать.

1
zpool import -f -F -R /mnt/zpool VCD-SHARE

Теперь пул ZFS должен быть смонтирован, а точка монтирования теперь должна содержать содержимое нашей файловой системы ZFS.