У меня есть HP MicroServer G8, работающий под управлением Debian 10. Он имеет встроенное псевдо-аппаратное управление массивом под названием B120i, но это в основном не имеет значения.
У него было 2 диска по 2 ТБ и один диск на 4 ТБ, настроенный как массив BTRFS RAID1. Один из дисков емкостью 2 ТБ начал работать около 6 месяцев назад с 2 Текущие нечитаемые (ожидающие) сектора а совсем недавно резко подскочило до 126 секторов.
Я купил новый диск емкостью 4 ТБ и выключил сервер, используя halt
. Конечно, как всегда (ПОЧЕМУ ???), HP BIOS или B120i портят систему. В результате система не загружалась и диски были отключены.
Я снова включил их в BIOS и загрузился, но этого не произошло! Мне пришлось подключить системный диск (еще один) к другому компьютеру, оказалось, что GPT испортился. Я восстановил его с помощью testdisk
и с тех пор загружается ядро, но не система.
Оказывается, массив BTRFS испорчен, и это блокирует полную загрузку системы (systemd). Причина видимо в том, что неисправный диск умер. Это небольшой сюрприз, я ожидал, что он будет работать немного больше, но я не возражаю, поскольку это RAID1.
Я перемонтировал массив btrfs в деградированном режиме и добавил новый диск 4 ТБ как sdd
. Думаю, мне, наверное, следовало сделать btrfs device replace
вместо этого, но поскольку я делаю это только раз в пару лет, когда диск выходит из строя, я забыл об этом ... Это заняло некоторое время, и через пару часов данные были скопированы на новый диск. Вот результат:
# btrfs fi df /mnt/raid
Data, RAID1: total=2.24TiB, used=2.24TiB
System, RAID1: total=32.00MiB, used=368.00KiB
Metadata, RAID1: total=6.00GiB, used=5.24GiB
GlobalReserve, single: total=512.00MiB, used=0.00B
# btrfs fi show /mnt/raid
Label: none uuid: a3739311-2cf6-424d-87f8-cf28b87094e7
Total devices 4 FS bytes used 2.24TiB
devid 1 size 1.82TiB used 1.82TiB path /dev/sdb
devid 3 size 3.64TiB used 876.00GiB path /dev/sda
devid 4 size 3.64TiB used 1.39TiB path /dev/sdd
*** Some devices missing
# btrfs fi usage /mnt/raid
Overall:
Device size: 10.92TiB
Device allocated: 4.49TiB
Device unallocated: 6.42TiB
Device missing: 1.82TiB
Used: 4.49TiB
Free (estimated): 3.21TiB (min: 3.21TiB)
Data ratio: 2.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Data,RAID1: Size:2.24TiB, Used:2.24TiB
/dev/sda 873.00GiB
/dev/sdb 1.81TiB
/dev/sdd 1.38TiB
missing 436.00GiB
Metadata,RAID1: Size:9.00GiB, Used:7.83GiB
/dev/sda 3.00GiB
/dev/sdb 6.00GiB
/dev/sdd 9.00GiB
System,RAID1: Size:32.00MiB, Used:368.00KiB
/dev/sdb 32.00MiB
/dev/sdd 32.00MiB
Unallocated:
/dev/sda 2.78TiB
/dev/sdb 1.99GiB
/dev/sdd 2.24TiB
missing 1.39TiB
Причина, по которой btrfs не монтируется, заключается в том, что сломанный диск скопировал UUID с другого диска! Вот идентификаторы блоков:
# blkid
/dev/sda: UUID="a3739311-2cf6-424d-87f8-cf28b87094e7" UUID_SUB="8d1d6b0a-e437-4520-a6f4-ae84e1171d2d" TYPE="btrfs"
/dev/sdb: UUID="a3739311-2cf6-424d-87f8-cf28b87094e7" UUID_SUB="38affcfe-52a3-4a00-9587-6cdbb796531a" TYPE="btrfs"
/dev/sdc: UUID="a3739311-2cf6-424d-87f8-cf28b87094e7" UUID_SUB="8d1d6b0a-e437-4520-a6f4-ae84e1171d2d" TYPE="btrfs"
/dev/sdd: UUID="a3739311-2cf6-424d-87f8-cf28b87094e7" UUID_SUB="a0a3dd6b-6608-4444-ac56-9ed1c3dc0214" TYPE="btrfs"
/dev/sde1: UUID="9695d0d9-fecb-4d3f-8e36-fefbe8691034" TYPE="ext4"
/dev/sde2: UUID="e2aa3a60-6da1-48fb-8917-87ba6e12dc1a" TYPE="swap"
Сломанный диск sdc
и скопировал UUID из sda
. Пытался восстановить UUID (в некоторых логах был), но не получается:
# btrfstune -U ed8f61f6-3673-48d6-a61e-864f768a3d6e /dev/sdc
warning, device 2 is missing
checksum verify failed on 4017467949056 found 004A064E wanted 7D414141
checksum verify failed on 4017467949056 found 004A064E wanted 7D414141
checksum verify failed on 4017467949056 found 004A064E wanted 7D414141
bad tree block 4017467949056, bytenr mismatch, want=4017467949056, have=3261806292089676715
ERROR: cannot read chunk root
ERROR: open ctree failed
Я пробовал эту операцию на другом компьютере, с sdc
снял с сервера и подключил к компу (самостоятельно). Это все равно не изменит UUID, поэтому я предполагаю, что диск в плохом состоянии.
Я пытался восстановить куски с помощью этого, но это тоже не сработало:
# btrfs rescue chunk-recover -v /dev/sdc
All Devices:
Device: id = 4, name = /dev/sdd
Device: id = 1, name = /dev/sdb
Device: id = 3, name = /dev/sdc
Scanning: DONE in dev0, DONE in dev1, DONE in dev2
DEVICE SCAN RESULT:
Filesystem Information:
sectorsize: 4096
nodesize: 16384
tree root generation: 429587
chunk root generation: 429056
All Devices:
Device: id = 4, name = /dev/sdd
Device: id = 1, name = /dev/sdb
Device: id = 3, name = /dev/sdc
All Block Groups:
Block Group: start = 0, len = 4194304, flag = 2
Block Group: start = 4194304, len = 8388608, flag = 4
All Chunks:
Chunk: start = 0, len = 4194304, type = 2, num_stripes = 1
Stripes list:
[ 0] Stripe: devid = 1, offset = 0
Chunk: start = 4194304, len = 8388608, type = 4, num_stripes = 1
Stripes list:
[ 0] Stripe: devid = 1, offset = 4194304
Chunk: start = 12582912, len = 8388608, type = 1, num_stripes = 1
Stripes list:
[ 0] Stripe: devid = 1, offset = 12582912
[...]
Chunk: start = 4015320465408, len = 1073741824, type = 11, num_stripes = 2
Stripes list:
[ 0] Stripe: devid = 3, offset = 371515719680
[ 1] Stripe: devid = 2, offset = 1508641865728
No block group.
No device extent.
Chunk: start = 4016394207232, len = 1073741824, type = 11, num_stripes = 2
Stripes list:
[ 0] Stripe: devid = 3, offset = 372589461504
[ 1] Stripe: devid = 1, offset = 2218786816
No block group.
No device extent.
Total Chunks: 1738
Recoverable: 2
Unrecoverable: 1736
Orphan Block Groups:
Orphan Device Extents:
Couldn't map the block 5818218266624
No mapping for 5818218266624-5818218283008
Couldn't map the block 5818218266624
bad tree block 5818218266624, bytenr mismatch, want=5818218266624, have=0
Couldn't read tree root
open with broken chunk error
Chunk tree recovery failed
Получается, что диск действительно напортачил. Теперь я хочу удалить его из массива и отказаться от него, я выполнил следующее, но не работает (у меня нет журнала, но я думаю, что «на устройстве не осталось места»):
# btrfs device delete /dev/sdc /mnt/raid
Я думаю, что это не удается, потому что UUID такой же, как /dev/sda
.
Как теперь удалить этот диск? Я попытался остановить машину, физически удалить диск и перезагрузить компьютер, но btrfs по-прежнему не монтируется из-за отсутствия диска.
Могу ли я физически удалить диск и btrfs device remove
это после? Я потеряю какие-то данные?
В настоящее время данные выглядят нормально:
# du -sh /mnt/raid/
2.4T /mnt/raid/
У меня нет той же информации до первоначальной проблемы, но это кажется точным. Я просмотрел данные (при повторной установке как деградировавшие) и не увидел отсутствующих файлов.