
У меня был диск на 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
Я не очень хорош в английском, так что извините, если это трудно читать. Но я надеюсь, что это поможет другим в такой же ситуации.