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 #
Linux/Windows Справочник v0.05 © 2007-2024 Igor Salnikov aka SunDoctor