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

Как избавиться от неисправного диска в массиве BTRFS

У меня есть 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/

У меня нет той же информации до первоначальной проблемы, но это кажется точным. Я просмотрел данные (при повторной установке как деградировавшие) и не увидел отсутствующих файлов.