BTRFS - ремонт RAID


https://lore.kernel.org/linux-btrfs/20200627032414.GX10769@hungrycats.org/
https://arstechnica.com/gadgets/2021/09/examining-btrfs-linuxs-perpetually-half-finished-filesystem/

В общем, наткнулся на то, что btrfs-raid5 из трёх дисков посыпался.

Как обнаружил:

Сначала определяем, с чем работаем:

# btrfs filesystem show
# btrfs device usage /dev/sda
# btrfs subvolume show /data
# btrfs subvolume list -a /dev/sda

Затем смотрим ошибки

# btrfs device stat /data

[/dev/sdd].write_io_errs    0
[/dev/sdd].read_io_errs     0
[/dev/sdd].flush_io_errs    0
[/dev/sdd].corruption_errs  6
[/dev/sdd].generation_errs  0
[/dev/sde].write_io_errs    0
[/dev/sde].read_io_errs     0
[/dev/sde].flush_io_errs    0
[/dev/sde].corruption_errs  0
[/dev/sde].generation_errs  0
[/dev/sdf].write_io_errs    0
[/dev/sdf].read_io_errs     0
[/dev/sdf].flush_io_errs    0
[/dev/sdf].corruption_errs  22
[/dev/sdf].generation_errs  0

Далее попробовал scrub:

# btrfs scrub start -Bdr /data

Scrub device /dev/sdd (id 1) done
Scrub started:    Fri Oct 15 18:59:20 2021
Status:           finished
Duration:         12:25:39
Total to scrub:   1.06TiB
Rate:             16.51MiB/s
Error summary:    csum=2
  Corrected:      1
  Uncorrectable:  1
  Unverified:     0

Scrub device /dev/sde (id 2) done
Scrub started:    Fri Oct 15 18:59:20 2021
Status:           finished
Duration:         12:25:38
Total to scrub:   1.06TiB
Rate:             16.51MiB/s
Error summary:    no errors found

Scrub device /dev/sdf (id 3) done
Scrub started:    Fri Oct 15 18:59:20 2021
Status:           finished
Duration:         12:25:33
Total to scrub:   1.06TiB
Rate:             16.51MiB/s
Error summary:    read=16 csum=1
  Corrected:      0
  Uncorrectable:  17
  Unverified:     1
ERROR: there are uncorrectable errors

Scrub сказал, что остаются неисправимые ошибки на дисках sdd, sdf. Нужно понять где они.

# journalctl --dmesg --grep 'checksum error'

окт 16 00:39:22 bigmonster kernel: BTRFS warning (device sdd): checksum error at logical 1081319096320
окт 16 03:00:06 bigmonster kernel: BTRFS warning (device sdd): checksum error at logical 1522947457024

# dmesg -w | grep -i btrfs

BTRFS warning (device sdd): csum failed root 5 ino 1706817 off 16279060480 csum 0x4ae73b4d expected csum 0x322e326b mirror 2

# find /data -inum 1706817

Можно провести проверку контрольных сумм:

# btrfs check --check-data-csum --clear-space-cache v1 -p /dev/disk/by-label/RAID5

Проверяем блоки

# btrfs inspect-internal logical-resolve 1081319096320 /data

/data/VIDEO_TS/VTS_16_1.VO

# btrfs inspect-internal logical-resolve 1522947457024 /data

/data/00000000000000059072.xml

Хорошо, что только два файла.


Что дальше предлагает официальная документация?
===============================================

1. Попробовать сделать дамп на USB-диск. Пока никакого ремонта не происходит

# btrfs restore /dev/sda1 /mnt/usbdisk

2. Попробовать восстановить супер-блок из копий. (Не мой случай - у меня не загрузочный диск)

# btrfs inspect-internal dump-super -a /dev/sda1 (проверка)
# btrfs rescue super-recover /dev/sda1

3. Если файловая система не монтируется - прибить журнал btrfs (У меня монтируется, не нужно)

Сначала так:
# mount -o recovery,ro,nospace_cache,clear_cache /dev/sda1 /mnt

А потом так:
# btrfs rescue zero-log /dev/sda1

4. ОЧЕНЬ медленная (и последняя) операция по восстановлению чанков

# btrfs rescue chunk-recover /dev/sda1

5. На этом шаге RESTORE нужно сделать ОБЯЗАТЕЛЬНО (см. п.1), т.к. далее будет разрушающая операция

# btrfs restore /dev/sda1 /mnt/usbdisk

После можно проверить контрольные суммы:

# rsync --dry-run -ri --delete --checksum /data/ /mnt/usbdisk/

6. Жёсткий ремонт (Описывается как "русская рулетка")

# btrfs check —repair /dev/sda1


Последняя доступная мне безопасная команда "btrfs rescue chunk-recover" - зависла. Число ошибок при этом увеличилось. 
Поэтому решено было купить еще один диск и перейти к п.5,6 (или же сделать резервный rsync всей доступной инфы)




Выводы и наставления "Как работать с btrfs-raid"
================================================

1. Создавать RAID5 нужно _только_ так:

# wipefs --all /dev/sda /dev/sdb /dev/sdc
# mkfs.btrfs -L mydata -m raid1 -d raid5 -f /dev/sda /dev/sdb /dev/sdc

Важно, чтобы метаданные - зеркалировались, а данные - распределялись по чётности. Так надёжнее.

2. Сразу после создания и монтирования raid5 нужно делать subvolume - это тоже обязательно

# btrfs subvolume create /btrfs/sub1

иначе поврежденная btrfs имеет тенденцию "повреждать всё вокруг повреждения". subvolume от этого немного защищают.

3. После записи массива данных на диск хотя бы один раз нужно сделать снимок

# btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1x


Для замены диска в raid5 нужно выполнить:

# btrfs device remove /dev/sdX /mnt/YYYYYY
# btrfs device add /dev/sdX /mnt/YYYYYY
# btrfs balance start /dev/sdX /mnt/YYYYYY

Если "btrfs filesystem show" показывает, что уже "Some devices missing", то нужно сделать немного иначе:

# mount -o degraded /dev/sda3 /mnt
# btrfs replace start 3 /dev/sdf1 /mnt
# btrfs replace status /mnt

3 - это devid, который показывает "btrfs filesystem show"

Предпочтительным способом - является именно "btrfs replace" - 
и после ее выполнения обязательно ВРУЧНУЮ делать "btrfs balance"
т.к. сам btrfs этого не делает!!!

И еще момент: чем больше диски - тем больше ненужного хлама, который лучше зажимать:

# btrfs property get /data/hlam/ compression
# btrfs property set /data/hlam/ compression lzo

#