Причина

Причина

У меня был диск на 500 ГБ с BTRFS на моем NAS. Недавно я получил диск на 4 ТБ и хотел использовать только новый диск, без простоя. Поэтому я запустил btrfs replace start 1 /dev/sdb ., подождал, пока он завершится, и отключил диск на 500 ГБ.

Теперь, когда я потерял доступ к диску на 4 ТБ, я хочу восстановить все данные с замененного диска на 500 ГБ, но раздел BTRFS на нем больше не распознается как таковой. Я пытался смонтировать его обычным образом, с помощью -o degraded, -o recovery,ro, я даже пробовал btrfs restoreи btrfs check, но все это не удалось. Какие у меня есть варианты?

решение1

Это старый вопрос, но я столкнулся с такой же ситуацией и отвечу.
Я запустил btrfs replaceфайловую систему RAID1 на Debian Bullseye (5.10.0-13-amd64) и восстановил на Manjaro (5.13.19-2) с помощью следующей процедуры.

Причина

По крайней мере для версии ядра 5.10 btrfs replaceкоманда в конечном итоге вызывает btrfs_scratch_superblocksфункцию в этом месте:GitHub
Эта функция удаляет «магическую строку» на суперблоках исходного диска.

Фактически в моей среде я получил следующие результаты:

# btrfs inspect-internal dump-super -F /dev/sdb1
superblock: bytenr=65536, device=/dev/sdb1
---------------------------------------------------------
csum_type       0 (crc32c)
csum_size       4
csum            0x7d4435b9 [DON'T MATCH]
bytenr          65536
flags           0x1
            ( WRITTEN )
magic           ........ [DON'T MATCH]

Согласноbtrfs Вики, "magic" (= "волшебная строка") должно быть _BHRfS_M.

Процедура восстановления

Ссылаясь What if I don't have wipefs at hand?наbtrfs Вики, выполните следующее в оболочке.
Вероятно, безопаснее запустить его на другом ПК, чем тот, к которому подключен замененный диск.

Пожалуйста, перепишите устройство и местоположение точки монтирования для вашей среды.
(В моей среде это удалось сделать как /dev/sdb1 !)

# # backup magic strings just in case
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024+64)) of=~/magic1
# dd bs=1 count=8 if=/dev/sdb skip=$((64*1024*1024+64)) of=~/magic2
# dd bs=1 count=8 if=/dev/sdb skip=$((256*1024*1024*1024+64)) of=~/magic3

# # write magic string
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((64*1024*1024+64))
# echo "_BHRfS_M" | dd bs=1 count=8 of=/dev/sdb seek=$((256*1024*1024*1024+64))

# btrfs device scan
# mkdir -p /mnt/before_replace
# mount -o degraded,ro /dev/sdb /mnt/before_replace

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

Связанный контент