Алгоритмы восстановления файловой системы Btrfs
> [!INFO] Применимость > **ALT Linux 10.4–11.x** · `Btrfs` · локальная работа через CLI/TTY · доступ `root` > > Заметка содержит отдельные самодостаточные алгоритмы для Btrfs на: > > - HDD; > - SSD и
[!INFO] Применимость
ALT Linux 10.4–11.x ·Btrfs· локальная работа через CLI/TTY · доступrootЗаметка содержит отдельные самодостаточные алгоритмы для Btrfs на:
- HDD;
- SSD и NVMe;
- собственном многодисковом массиве Btrfs;
- Linux Software RAID;
- LVM;
- Multipath и SAN LUN;
- NFS;
- SMB/DFS.
Перед работой проверить версии:
btrfs version uname -r
Оглавление
- [[#Главные отличия Btrfs|Главные отличия Btrfs]]
- [[#Основные запреты|Основные запреты]]
- [[#Когда Btrfs ремонтировать нельзя|Когда Btrfs ремонтировать нельзя]]
- [[#Алгоритм 1. Btrfs на исправном HDD|Алгоритм 1. Btrfs на исправном HDD]]
- [[#Алгоритм 2. Btrfs на HDD с физическими ошибками|Алгоритм 2. Btrfs на HDD с физическими ошибками]]
- [[#Алгоритм 3. Btrfs на исправном SSD или NVMe|Алгоритм 3. Btrfs на исправном SSD или NVMe]]
- [[#Алгоритм 4. Btrfs на отказывающем SSD или NVMe|Алгоритм 4. Btrfs на отказывающем SSD или NVMe]]
- [[#Алгоритм 5. Ошибки контрольных сумм при наличии избыточной копии|Алгоритм 5. Ошибки контрольных сумм при наличии избыточной копии]]
- [[#Алгоритм 6. Btrfs неожиданно перешла в read-only|Алгоритм 6. Btrfs неожиданно перешла в read-only]]
- [[#Алгоритм 7. Btrfs не монтируется после сбоя журнала|Алгоритм 7. Btrfs не монтируется после сбоя журнала]]
- [[#Алгоритм 8. Btrfs не монтируется из-за повреждённого корня дерева|Алгоритм 8. Btrfs не монтируется из-за повреждённого корня дерева]]
- [[#Алгоритм 9. Повреждены суперблоки Btrfs|Алгоритм 9. Повреждены суперблоки Btrfs]]
- [[#Алгоритм 10. Повреждено дерево чанков|Алгоритм 10. Повреждено дерево чанков]]
- [[#Алгоритм 11. Btrfs заполнена и возвращает ENOSPC|Алгоритм 11. Btrfs заполнена и возвращает ENOSPC]]
- [[#Алгоритм 12. Собственный многодисковый массив Btrfs исправен, но содержит ошибки|Алгоритм 12. Собственный многодисковый массив Btrfs исправен, но содержит ошибки]]
- [[#Алгоритм 13. Отказал участник собственного массива Btrfs|Алгоритм 13. Отказал участник собственного массива Btrfs]]
- [[#Алгоритм 14. Btrfs поверх Linux Software RAID|Алгоритм 14. Btrfs поверх Linux Software RAID]]
- [[#Алгоритм 15. Btrfs поверх LVM|Алгоритм 15. Btrfs поверх LVM]]
- [[#Алгоритм 16. Btrfs поверх Multipath или SAN LUN|Алгоритм 16. Btrfs поверх Multipath или SAN LUN]]
- [[#Алгоритм 17. Каталог подключён по NFS|Алгоритм 17. Каталог подключён по NFS]]
- [[#Алгоритм 18. Каталог подключён по SMB или DFS|Алгоритм 18. Каталог подключён по SMB или DFS]]
- [[#Алгоритм 19. Файловая система не ремонтируется, но данные ещё можно извлечь|Алгоритм 19. Файловая система не ремонтируется, но данные ещё можно извлечь]]
- [[#Алгоритм 20. Крайний случай btrfs check --repair|Алгоритм 20. Крайний случай btrfs check --repair]]
- [[#Проверка после восстановления|Проверка после восстановления]]
- [[#Источники|Источники]]
Главные отличия Btrfs
В Btrfs нет универсального сценария:
размонтировать → запустить fsck → автоматически исправить
Основные механизмы различаются по назначению:
| Инструмент | Для чего используется |
|---|---|
btrfs scrub |
Проверяет контрольные суммы и восстанавливает блоки из исправной копии |
btrfs device stats |
Показывает ошибки ввода-вывода и контрольных сумм |
btrfs check --readonly |
Проверяет структурную целостность деревьев без изменения ФС |
btrfs rescue |
Исправляет отдельные конкретные структуры |
btrfs restore |
Извлекает файлы из немонтируемой ФС без её изменения |
btrfs replace |
Заменяет неисправный участник собственного массива Btrfs |
btrfs balance |
Перераспределяет block group; не является обычным ремонтом |
fsck.btrfs не выполняет полноценную проверку и лечение, аналогичные e2fsck.
Основные запреты
Не использовать btrfs check --repair первым шагом
Нельзя начинать с:
sudo btrfs check --repair <устройство>
Правильный первый шаг:
sudo btrfs check --readonly <устройство>
--repair применяется только после анализа конкретного повреждения и принятия риска потери данных.
Не запускать btrfs check на работающей ФС
Проверить:
findmnt --source <устройство_Btrfs>
Перед структурной проверкой отключить ФС:
sudo umount <точка_монтирования>
Не применять btrfs check --force на обычной работающей ФС.
Для корневой Btrfs загрузиться с установочного носителя ALT Linux в режиме восстановления или Rescue LiveCD.
Не считать scrub аналогом fsck
scrub:
- проверяет контрольные суммы данных и метаданных;
- читает всю используемую область;
- исправляет блок только при наличии другой корректной копии;
- не перестраивает повреждённые B-tree;
- запускается на смонтированной ФС.
На однодисковой Btrfs с профилем Data,single повреждённые данные обычно восстановить неоткуда.
Не запускать scrub на явно умирающем носителе
Не выполнять полный scrub, если обнаружены:
I/O error
critical medium error
SMART FAILED
Current_Pending_Sector > 0
Offline_Uncorrectable > 0
NVMe critical_warning != 0
media_errors > 0
повторяющиеся reset или timeout
исчезновение устройства
Не запускать полный balance для лечения ошибок
Не применять без конкретной причины:
sudo btrfs balance start <точка_монтирования>
Полный balance создаёт большую нагрузку, требует свободного рабочего пространства и не возвращает физически потерянные данные.
Не считать snapshot резервной копией
Snapshot Btrfs обычно использует те же физические блоки. Отказ носителя уничтожает и основную ФС, и snapshots на ней.
Когда Btrfs ремонтировать нельзя
Не выполнять изменяющие команды на исходной ФС, если обнаружено хотя бы одно состояние:
повторяющиеся I/O error
critical medium error
SMART FAILED
Current_Pending_Sector > 0
Offline_Uncorrectable > 0
NVMe critical_warning != 0
media_errors > 0
устройство периодически исчезает
контроллер постоянно сбрасывается
рост read_io_errs или write_io_errs
uncorrectable_errors после scrub
все пути Multipath потеряны
LVM partial
RAID dirty и degraded
неизвестно, смонтирован ли тот же LUN на другом хосте
В этой ситуации:
- прекратить запись;
- не запускать scrub, balance и
btrfs check --repair; - отключить ФС;
- скопировать доступные файлы либо снять образ;
- ремонтировать только копию или исправный клон.
Алгоритм 1. Btrfs на исправном HDD
Применять для однодисковой Btrfs на HDD без физических ошибок.
1. Определить устройство
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
Пример:
Диск: /dev/sda
Btrfs: /dev/sda2
Монтирование: /data
2. Проверить нижний уровень
journalctl -k -b --no-pager | grep -Ei \
'sda|I/O error|Buffer I/O|critical medium|reset|timeout|BTRFS'
sudo smartctl -x /dev/sda
Продолжать лечение на исходном устройстве разрешено, если:
- SMART не сообщает
FAILED; - ожидающие и неисправимые сектора отсутствуют;
- нет повторяющихся I/O-ошибок;
- диск стабильно определяется.
3. Проверить профиль Btrfs
sudo btrfs filesystem usage -T /data
sudo btrfs filesystem show /data
Особенно важны профили:
Data,single
Metadata,DUP
Data,RAID1
Metadata,RAID1
Metadata,DUP хранит две копии метаданных на одном диске, но не защищает от полного отказа диска.
4. Проверить накопленные ошибки
sudo btrfs device stats /data
Проверить поля:
write_io_errs
read_io_errs
flush_io_errs
corruption_errs
generation_errs
Ненулевые значения зафиксировать. Не сбрасывать счётчики до завершения диагностики.
5. Если ФС монтируется в rw
Сначала скопировать наиболее важные данные на другой носитель.
Затем выполнить scrub:
sudo btrfs scrub start -B /data
Проверить итог:
sudo btrfs scrub status /data
Если uncorrectable_errors = 0 и журнал не содержит новых ошибок, перейти к структурной проверке.
Если есть неисправимые ошибки, не считать ФС вылеченной. Скопировать доступные данные и вывести носитель из доверенной эксплуатации.
6. Отключить Btrfs
sudo fuser -vm /data
sudo umount /data
Проверить:
findmnt --source /dev/sda2
7. Сохранить образ метаданных
Сохранять на другой исправный носитель:
sudo btrfs-image /dev/sda2 /mnt/healthy/btrfs-sda2-before.img
btrfs-image сохраняет метаданные, но не пользовательские файлы.
8. Проверить структуру без изменений
sudo btrfs check --readonly /dev/sda2
Проверить код:
echo $?
0 означает успешное завершение. Ненулевой код означает ошибку проверки или обнаруженные проблемы.
9. Действия по результату
Если ошибок нет:
sudo mount -o ro /dev/sda2 /mnt/recovery
Проверить данные и журнал ядра, затем вернуть штатное монтирование.
Если структурные ошибки найдены, но данные читаются:
- не применять
--repair; - извлечь данные через read-only монтирование или
btrfs restore; - пересоздать Btrfs на исправном носителе;
- вернуть данные из копии.
Алгоритм 2. Btrfs на HDD с физическими ошибками
Применять при I/O-ошибках, SMART FAILED, pending/uncorrectable sectors, сбросах или исчезновении HDD.
1. Определить исходный диск
lsblk -d -o NAME,PATH,SIZE,MODEL,SERIAL
2. Немедленно прекратить запись
sudo umount <точка_монтирования>
Для корневой ФС загрузиться в Rescue LiveCD.
Не запускать на исходном диске:
btrfs scrub
btrfs balance
btrfs check --repair
badblocks
длительный SMART self-test
3. Зафиксировать состояние
sudo smartctl -x /dev/sda > /mnt/healthy/smart-sda.txt
journalctl -k -b --no-pager > /mnt/healthy/kernel-storage.txt
4. Подготовить исправный носитель
df -hT /mnt/recovery
command -v ddrescue
5. Снять первичный образ
sudo ddrescue -n \
/dev/sda \
/mnt/recovery/sda.img \
/mnt/recovery/sda.map
6. Второй проход только при стабильном HDD
sudo ddrescue -d -r3 \
/dev/sda \
/mnt/recovery/sda.img \
/mnt/recovery/sda.map
Не выполнять второй проход, если диск исчезает, щёлкает, перегревается или резко замедляется.
7. Отключить исходный HDD
Перед подключением копии исходный диск лучше физически отключить, чтобы ядро не видело две Btrfs с одинаковым FSID.
8. Подключить образ
sudo losetup -Pf --show /mnt/recovery/sda.img
lsblk -f /dev/loop0
9. Сначала извлечь данные
sudo mount -o ro,rescue=nologreplay /dev/loop0p2 /mnt/recovery-btrfs
Если не монтируется:
sudo btrfs restore -D /dev/loop0p2 /mnt/restored
sudo btrfs restore -s -x -m -S -i /dev/loop0p2 /mnt/restored
10. Структурную проверку выполнять только на копии
sudo btrfs check --readonly /dev/loop0p2
Исходный HDD после физических ошибок не возвращать в эксплуатацию.
Алгоритм 3. Btrfs на исправном SSD или NVMe
1. Определить устройство
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
Примеры:
SATA SSD: /dev/sda
Btrfs-раздел: /dev/sda2
NVMe namespace: /dev/nvme0n1
Btrfs-раздел: /dev/nvme0n1p2
2. Проверить аппаратное состояние
SATA SSD:
sudo smartctl -x /dev/sda
NVMe:
sudo smartctl -x /dev/nvme0
При наличии nvme-cli:
sudo nvme smart-log /dev/nvme0
Продолжать разрешено, если critical_warning = 0, media_errors = 0, SMART не сообщает FAILED, а журнал не содержит повторяющихся reset/timeout.
3. Проверить журнал и Btrfs
journalctl -k -b --no-pager | grep -Ei \
'I/O error|Buffer I/O|nvme|reset|timeout|BTRFS'
sudo btrfs device stats <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
4. Скопировать важные данные
До полного scrub сохранить наиболее важные файлы на другой носитель.
5. Выполнить scrub
sudo btrfs scrub start -B <точка_монтирования>
sudo btrfs scrub status <точка_монтирования>
Если uncorrectable_errors > 0, прекратить эксплуатацию и копировать данные.
6. Отключить файловую систему
sudo umount <точка_монтирования>
findmnt --source <устройство_Btrfs>
7. Проверить структуру
sudo btrfs check --readonly <устройство_Btrfs>
Если ошибок нет:
sudo mount -o ro <устройство_Btrfs> /mnt/recovery
Если ошибки повторяются после scrub, скопировать данные и пересоздать ФС.
Алгоритм 4. Btrfs на отказывающем SSD или NVMe
Применять при SMART FAILED, critical_warning != 0, media_errors > 0, аппаратном read-only, I/O timeout или controller reset.
1. Определить устройство копирования
SATA SSD: /dev/sda
NVMe: /dev/nvme0n1
2. Прекратить запись
sudo umount <точка_монтирования>
Не запускать:
scrub
balance
btrfs check --repair
fstrim
nvme device-self-test
длительный SMART self-test
3. Зафиксировать состояние
sudo smartctl -x /dev/sda > /mnt/healthy/smart-ssd.txt
sudo smartctl -x /dev/nvme0 > /mnt/healthy/smart-nvme.txt
journalctl -k -b --no-pager > /mnt/healthy/kernel-storage.txt
4. Создать образ
SATA SSD:
sudo ddrescue -n /dev/sda /mnt/recovery/ssd.img /mnt/recovery/ssd.map
NVMe:
sudo ddrescue -n /dev/nvme0n1 /mnt/recovery/nvme.img /mnt/recovery/nvme.map
Повторный проход выполнять только при стабильном устройстве:
sudo ddrescue -d -r3 <исходное_устройство> <файл_образа> <map-файл>
5. Отключить оригинал и подключить образ
sudo losetup -Pf --show <файл_образа>
lsblk -f /dev/loop0
6. Извлечь данные с копии
sudo mount -o ro,rescue=nologreplay /dev/loop0p2 /mnt/recovery-btrfs
Если не удалось:
sudo btrfs restore -D /dev/loop0p2 /mnt/restored
sudo btrfs restore -s -x -m -S -i /dev/loop0p2 /mnt/restored
Отказывающий SSD/NVMe не возвращать в эксплуатацию.
Алгоритм 5. Ошибки контрольных сумм при наличии избыточной копии
Применять, если нижний уровень исправен, журнал содержит csum failed или checksum verify failed, а профиль содержит DUP, RAID1, RAID10, RAID5 или RAID6.
1. Проверить профиль
sudo btrfs filesystem usage -T <точка_монтирования>
Data,single не является избыточным профилем.
2. Проверить устройства
sudo btrfs filesystem show <точка_монтирования>
sudo btrfs device stats <точка_монтирования>
journalctl -k -b --no-pager | grep -i BTRFS
Если есть физические I/O-ошибки, сначала заменить или скопировать носитель.
3. Скопировать критичные данные
Скопировать наиболее важные данные на независимый носитель.
4. Выполнить scrub
sudo btrfs scrub start -B <точка_монтирования>
5. Проверить результат
sudo btrfs scrub status <точка_монтирования>
sudo btrfs device stats <точка_монтирования>
journalctl -k -b -n 200 --no-pager
Если corrected_errors > 0, а uncorrectable_errors = 0, Btrfs восстановила блоки из другой копии. Причину повреждения всё равно нужно найти.
Если uncorrectable_errors > 0, восстановление из имеющихся копий не удалось. Скопировать читаемые данные и использовать резервную копию.
Алгоритм 6. Btrfs неожиданно перешла в read-only
1. Подтвердить состояние
findmnt -rn -o TARGET,SOURCE,FSTYPE,OPTIONS | grep btrfs
2. Проверить журнал
journalctl -k -b --no-pager | grep -Ei \
'BTRFS|I/O error|Buffer I/O|read-only|reset|timeout'
3. Проверить нижний уровень
HDD/SSD:
sudo smartctl -x <физический_диск>
NVMe:
sudo smartctl -x /dev/nvme0
RAID:
cat /proc/mdstat
sudo mdadm --detail /dev/md0
Multipath:
sudo multipath -ll
Если есть аппаратные ошибки, не возвращать ФС в rw.
4. Скопировать данные из текущего ro
sudo rsync -aHAX --numeric-ids <точка_монтирования>/ <исправный_носитель>/
При отсутствии rsync:
sudo cp -a <точка_монтирования>/. <исправный_носитель>/
5. Отключить Btrfs
sudo fuser -vm <точка_монтирования>
sudo umount <точка_монтирования>
6. Проверить структуру
sudo btrfs check --readonly <устройство_Btrfs>
Если причина ENOSPC, использовать отдельный алгоритм ENOSPC. Если причина log replay, использовать отдельный алгоритм zero-log.
Не применять mount -o remount,rw без устранения причины.
Алгоритм 7. Btrfs не монтируется после сбоя журнала
Применять только при сообщениях open_ctree, replay, recover_log_trees, walk_log_tree или log_tree.
1. Определить устройство
lsblk -e 7 -o NAME,PATH,TYPE,FSTYPE,MOUNTPOINTS
2. Проверить нижний уровень
journalctl -k -b --no-pager | grep -Ei \
'I/O error|Buffer I/O|critical medium|reset|timeout|BTRFS'
При физической нестабильности сначала создать образ.
3. Попытаться монтировать без replay журнала
sudo mount -o ro,rescue=nologreplay <устройство_Btrfs> /mnt/recovery
Если удалось, немедленно скопировать данные и не перемонтировать в rw.
4. Если mount не помог
sudo btrfs-image <устройство_Btrfs> /mnt/healthy/btrfs-before-zero-log.img
5. Очистить дерево журнала
sudo btrfs rescue zero-log <устройство_Btrfs>
Команда может потерять последние неподтверждённые изменения. Использовать только при подтверждённой ошибке replay/log tree.
6. Повторно подключить только для чтения
sudo mount -o ro <устройство_Btrfs> /mnt/recovery
Если данные читаются, сразу скопировать их.
Алгоритм 8. Btrfs не монтируется из-за повреждённого корня дерева
Применять при parent transid verify failed, failed to read tree root, open_ctree failed, bad tree block start без физических I/O-ошибок.
1. Убедиться, что ФС не смонтирована в rw
findmnt --source <устройство_Btrfs>
2. Сохранить метаданные
sudo btrfs-image <устройство_Btrfs> /mnt/healthy/btrfs-before-backup-root.img
3. Проверить резервные корни
sudo btrfs check --readonly --backup <устройство_Btrfs>
4. Попытаться mount с резервным корнем
sudo mount -o ro,rescue=usebackuproot,nologreplay <устройство_Btrfs> /mnt/recovery
Если удалось, скопировать данные. Резервный корень может отражать более раннее состояние ФС.
5. Если mount не работает
sudo btrfs restore -l <устройство_Btrfs>
sudo btrfs restore -D <устройство_Btrfs> /mnt/restored
sudo btrfs restore -s -x -m -S -i <устройство_Btrfs> /mnt/restored
Алгоритм 9. Повреждены суперблоки Btrfs
Применять при bad superblock, no valid Btrfs found, superblock checksum mismatch, cannot read superblock.
1. Проверить правильность устройства
lsblk -e 7 -o NAME,PATH,TYPE,FSTYPE,SIZE,MOUNTPOINTS
Использовать карту Multipath, LV или /dev/md*, если Btrfs находится на соответствующем уровне.
2. Проверить физическое состояние
journalctl -k -b --no-pager | grep -Ei \
'I/O error|Buffer I/O|critical medium|reset|timeout'
При аппаратных ошибках сначала создать образ.
3. Проверить копии суперблока
sudo btrfs inspect-internal dump-super -a <устройство_Btrfs>
Сохранить вывод:
sudo btrfs inspect-internal dump-super -a <устройство_Btrfs> > /mnt/healthy/btrfs-superblocks.txt
4. Сохранить метаданные
sudo btrfs-image <устройство_Btrfs> /mnt/healthy/btrfs-before-super-recover.img
5. Восстановить суперблок из исправной копии
sudo btrfs rescue super-recover <устройство_Btrfs>
Не добавлять -y при первом запуске.
6. Проверить результат
sudo btrfs check --readonly <устройство_Btrfs>
sudo mount -o ro,rescue=nologreplay <устройство_Btrfs> /mnt/recovery
Если данные читаются, скопировать их до дальнейшей эксплуатации.
Алгоритм 10. Повреждено дерево чанков
Применять при cannot read chunk root, failed to read chunk tree, chunk tree corrupted, logical address cannot be mapped.
1. Не запускать на исходном отказывающем устройстве
chunk-recover сканирует устройство целиком и может работать очень долго. При ошибках носителя сначала создать посекторную копию.
2. Убедиться, что нет balance или replace
sudo btrfs balance status <точка_монтирования>
sudo btrfs replace status -1 <точка_монтирования>
3. Работать с исправной копией
sudo btrfs rescue chunk-recover <копия_устройства>
Не применять -y без просмотра изменений.
4. Проверить структуру
sudo btrfs check --readonly <копия_устройства>
5. Попытаться извлечь данные
sudo mount -o ro,rescue=nologreplay <копия_устройства> /mnt/recovery
Если mount не работает:
sudo btrfs restore -s -x -m -S -i <копия_устройства> /mnt/restored
Алгоритм 11. Btrfs заполнена и возвращает ENOSPC
Btrfs может вернуть No space left on device, даже если обычный df показывает свободное место.
1. Проверить фактическое использование
sudo btrfs filesystem usage -T <точка_монтирования>
sudo btrfs device usage <точка_монтирования>
df -hT <точка_монтирования>
2. Проверить журнал
journalctl -k -b --no-pager | grep -Ei 'BTRFS|ENOSPC|No space left|read-only'
3. Проверить snapshots и subvolume
sudo btrfs subvolume list <точка_монтирования>
sudo btrfs subvolume list -s <точка_монтирования>
4. Удалить только подтверждённо ненужные данные
Удалить обычные файлы или ненужный snapshot:
sudo btrfs subvolume delete <путь_к_snapshot>
sync
5. Освободить пустые block group
sudo btrfs balance start -dusage=0 -musage=0 <точка_монтирования>
6. Если места всё ещё недостаточно
sudo btrfs balance start -dusage=10 <точка_монтирования>
sudo btrfs balance start -musage=10 <точка_монтирования>
Проверить:
sudo btrfs balance status <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
Не запускать полный balance.
Если ФС уже стала read-only и не позволяет удалять данные, сначала скопировать данные, затем работать из Rescue-среды или пересоздать ФС.
Алгоритм 12. Собственный многодисковый массив Btrfs исправен, но содержит ошибки
1. Определить участников и профили
sudo btrfs filesystem show <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS
Профили данных и метаданных проверяются отдельно.
2. Проверить каждый физический носитель
sudo smartctl -x /dev/sda
sudo smartctl -x /dev/sdb
Для NVMe:
sudo smartctl -x /dev/nvme0
3. Проверить ошибки Btrfs
sudo btrfs device stats <точка_монтирования>
journalctl -k -b --no-pager | grep -i BTRFS
4. Скопировать важные данные
Перед scrub создать внешнюю копию наиболее важных данных.
5. Выполнить scrub всего массива
sudo btrfs scrub start -B <точка_монтирования>
sudo btrfs scrub status <точка_монтирования>
6. Оценить результат
Если corrected_errors > 0, а uncorrectable_errors = 0, найти источник повреждения и заменить подозрительный носитель.
Если uncorrectable_errors > 0, избыточность не смогла восстановить данные. Не выполнять balance до выяснения состояния всех участников.
7. Структурная проверка
После копирования данных и отключения массива:
sudo btrfs check --readonly <один_из_участников_Btrfs>
btrfs check обнаруживает остальные устройства одной Btrfs, если они доступны системе.
Алгоритм 13. Отказал участник собственного массива Btrfs
1. Определить профиль и допустимость деградации
sudo btrfs filesystem show <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
Проверить отдельно профили Data, Metadata и System.
Если данные имеют профиль single или RAID0, потеря устройства может означать потерю части данных.
2. Если ФС ещё смонтирована
Сразу скопировать важные данные.
sudo btrfs device stats <точка_монтирования>
sudo btrfs scrub status <точка_монтирования>
Не запускать новый scrub на явно умирающем участнике.
3. Подготовить новый носитель
lsblk -d -o NAME,PATH,SIZE,MODEL,SERIAL
Новый носитель должен быть не меньше заменяемого.
4. Заменить доступный участник
sudo btrfs replace start -B <старое_устройство> <новое_устройство> <точка_монтирования>
Если старый диск создаёт много ошибок и зеркала доступны:
sudo btrfs replace start -B -r <старое_устройство> <новое_устройство> <точка_монтирования>
5. Если устройство отсутствует
Определить devid:
sudo btrfs filesystem show <точка_монтирования>
Запустить замену:
sudo btrfs replace start -B <devid> <новое_устройство> <точка_монтирования>
Восстановление возможно только при достаточной избыточности.
6. Проверить статус
sudo btrfs replace status -1 <точка_монтирования>
sudo btrfs filesystem show <точка_монтирования>
sudo btrfs device stats <точка_монтирования>
7. Если ФС не монтируется без участника
sudo mount -o ro,degraded,rescue=nologreplay <доступный_участник> /mnt/recovery
Если удалось, сначала скопировать данные.
Не удалять отсутствующий участник командой btrfs device delete missing, пока данные не сохранены и не подтверждена достаточная избыточность.
8. Ограничение RAID5/RAID6
При native RAID5/6, деградации и нештатном выключении:
- не запускать полный balance;
- не выполнять слепой replace;
- не применять
btrfs check --repair; - сначала создать резервную копию или образы участников;
- при критичных данных передать анализ специалисту по Btrfs.
Алгоритм 14. Btrfs поверх Linux Software RAID
1. Определить структуру
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS
cat /proc/mdstat
sudo mdadm --detail /dev/md0
Правильная цель Btrfs:
/dev/md0
либо LV поверх /dev/md0.
Нельзя запускать Btrfs-инструменты на отдельных участниках mdraid.
2. Определить допустимость лечения
Продолжать разрешено, если массив активен, допустимое число участников присутствует, нет dirty degraded и физических I/O-ошибок.
3. Если RAID деградирован
- скопировать важные данные;
- заменить неисправный участник mdraid;
- дождаться recovery/resync;
- проверить
/proc/mdstat; - только после стабилизации работать с Btrfs.
4. Проверить Btrfs
sudo btrfs device stats <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
sudo btrfs scrub start -B <точка_монтирования>
5. Отключить и проверить структуру
sudo umount <точка_монтирования>
sudo btrfs check --readonly /dev/md0
Если Btrfs находится на LV поверх mdraid, использовать LV.
Алгоритм 15. Btrfs поверх LVM
1. Определить уровни
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS
sudo pvs
sudo vgs
sudo lvs -a -o lv_name,vg_name,lv_attr,lv_size,data_percent,metadata_percent,devices
Правильная цель:
/dev/mapper/<VG>-<LV>
2. Проверить полный состав LVM
Убедиться, что все PV присутствуют, VG/LV не partial, thin pool не заполнен, а нижний уровень стабилен.
Критично:
Data% = 100
Meta% = 100
Переполненный LVM thin pool не лечится средствами Btrfs.
3. Если LVM partial
Не запускать scrub, balance и btrfs check --repair. Сначала восстановить отсутствующий PV или путь.
4. Сохранить конфигурацию LVM
sudo vgcfgbackup -f /mnt/healthy/<VG>-before.conf <VG>
5. Проверить Btrfs на полном LV
sudo btrfs device stats <точка_монтирования>
sudo btrfs scrub start -B <точка_монтирования>
sudo umount <точка_монтирования>
sudo btrfs check --readonly /dev/mapper/<VG>-<LV>
Не создавать LVM snapshot для аварийного лечения без понимания duplicate FSID и свободного места snapshot pool.
Алгоритм 16. Btrfs поверх Multipath или SAN LUN
1. Определить карту Multipath
sudo multipath -ll
lsblk -e 7 -o NAME,PATH,TYPE,SIZE,FSTYPE,MOUNTPOINTS
Правильная цель:
/dev/mapper/mpatha
/dev/mapper/<WWID>
либо LV поверх карты Multipath.
Нельзя использовать отдельные пути /dev/sda, /dev/sdb.
2. Проверить все пути
systemctl is-active multipathd
sudo multipath -ll
Проблемные состояния:
failed
faulty
offline
all paths down
no usable paths
3. Проверить исключительное владение LUN
Btrfs не является кластерной ФС для одновременного обычного rw-монтирования несколькими хостами.
Предупреждение
Тут требуется проверка (отсутствия активного read-write монтирования этого LUN на других серверах и корректного владельца ресурса на стороне кластера или СХД).
4. Проверить SAN
Предупреждение
Тут требуется проверка (состояния HBA, SAN-коммутаторов, портов СХД, контроллеров СХД и доступности LUN по каждому пути).
Если все пути потеряны, Btrfs не ремонтировать.
5. Скопировать данные
Если LUN доступен и Btrfs монтируется, сначала скопировать критичные данные.
6. Проверить Btrfs только через карту
sudo btrfs device stats <точка_монтирования>
sudo btrfs scrub start -B <точка_монтирования>
sudo umount <точка_монтирования>
sudo btrfs check --readonly <карта_или_LV>
7. Контроль
sudo multipath -ll
journalctl -k -b --no-pager | grep -Ei 'multipath|scsi|timeout|offline|I/O error|BTRFS'
Алгоритм 17. Каталог подключён по NFS
NFS-клиент не видит локальное блочное устройство и не может лечить Btrfs сервера.
1. Подтвердить NFS
findmnt --target <каталог>
2. Не запускать локальные Btrfs-инструменты
На клиенте нельзя выполнять btrfs check, scrub или rescue для NFS-каталога.
3. Проверить доступность
ls -la <каталог>
df -hT <каталог>
journalctl -k -b --no-pager | grep -Ei 'nfs|server not responding|stale file handle|I/O error'
4. Если данные читаются
sudo rsync -aHAX --numeric-ids <каталог>/ <локальный_исправный_носитель>/
5. Если NFS возвращает ошибки
Предупреждение
Тут требуется проверка (состояния Btrfs, физических носителей, собственного Btrfs RAID, mdraid, LVM и журналов ядра на NFS-сервере).
6. Восстановление на сервере
Администратор сервера должен остановить запись клиентов, определить нижний уровень, скопировать данные и выполнить подходящий серверный алгоритм Btrfs.
Алгоритм 18. Каталог подключён по SMB или DFS
1. Подтвердить CIFS
findmnt --target <каталог>
2. Не применять Btrfs-инструменты на клиенте
Клиент не знает, какая ФС находится на сервере.
3. Проверить доступность
ls -la <каталог>
df -hT <каталог>
journalctl -k -b --no-pager | grep -Ei 'CIFS|SMB|DFS|reconnect|server|I/O error'
4. Если данные читаются
sudo rsync -aHAX <каталог>/ <локальный_исправный_носитель>/
5. Если DFS или SMB недоступны
Предупреждение
Тут требуется проверка (доступности DFS Namespace, конечного SMB-сервера, целевого ресурса и локальной файловой системы на сервере).
Если конечный сервер хранит ресурс на Btrfs, лечение выполняется только на самом сервере после остановки SMB-доступа.
Алгоритм 19. Файловая система не ремонтируется, но данные ещё можно извлечь
Применять, если Btrfs не монтируется, btrfs check --readonly сообщает серьёзные ошибки, rescue mount не работает или данные важнее восстановления ФС.
1. Работать с копией
При физической нестабильности создать образ через ddrescue.
При исправном носителе сохранить метаданные:
sudo btrfs-image <устройство_Btrfs> /mnt/healthy/btrfs-metadata.img
2. Просмотреть доступные корни subvolume
sudo btrfs restore -l <устройство_или_копия>
3. Выполнить пробный проход
sudo btrfs restore -D <устройство_или_копия> /mnt/restored
4. Извлечь данные
sudo btrfs restore -s -x -m -S -i <устройство_или_копия> /mnt/restored
| Параметр | Назначение |
|---|---|
-s |
Извлекать snapshots |
-x |
Восстанавливать extended attributes |
-m |
Восстанавливать владельцев, права и время |
-S |
Восстанавливать символические ссылки |
-i |
Продолжать после отдельных ошибок |
5. Извлечь конкретный subvolume
sudo btrfs restore -l <устройство_или_копия>
sudo btrfs restore -r <rootid> -x -m -S -i <устройство_или_копия> /mnt/restored
6. Проверить результат
Проверить размер и открытие файлов, контрольные суммы, базы данных средствами приложения, ACL и владельцев.
btrfs restore может извлечь старую или неполную версию файла, если актуальные метаданные повреждены.
Алгоритм 20. Крайний случай btrfs check --repair
Применять только если одновременно выполнены условия:
- физический носитель исправен либо создан полный образ;
- работа выполняется на копии;
- важные данные уже извлечены;
- read-only mount и
btrfs restoreне дали результата; - тип повреждения подтверждён выводом
btrfs check; - получена рекомендация разработчика Btrfs или опытного специалиста;
- допустима окончательная потеря структуры ФС.
1. Зафиксировать состояние копии
sudo btrfs check --readonly <копия_Btrfs> > /mnt/healthy/btrfs-check-before.txt 2>&1
2. Убедиться, что копия не смонтирована
findmnt --source <копия_Btrfs>
3. Запустить repair только на копии
sudo btrfs check --repair <копия_Btrfs>
Не использовать без отдельной точной рекомендации:
--init-csum-tree
--init-extent-tree
--force
4. Проверить результат
sudo btrfs check --readonly <копия_Btrfs>
sudo mount -o ro,rescue=nologreplay <копия_Btrfs> /mnt/recovery
Даже если mount заработал, сначала скопировать данные. Не считать аварийно отремонтированную копию надёжной рабочей ФС.
Проверка после восстановления
1. Проверить нижний уровень
HDD/SSD:
sudo smartctl -x <диск>
NVMe:
sudo smartctl -x /dev/nvme0
RAID:
cat /proc/mdstat
sudo mdadm --detail /dev/md0
Multipath:
sudo multipath -ll
LVM:
sudo pvs
sudo vgs
sudo lvs -a -o +devices
2. Проверить Btrfs
sudo btrfs filesystem show <точка_монтирования>
sudo btrfs filesystem usage -T <точка_монтирования>
sudo btrfs device stats <точка_монтирования>
3. Выполнить scrub только на стабильном носителе
sudo btrfs scrub start -B <точка_монтирования>
sudo btrfs scrub status <точка_монтирования>
Ожидается:
uncorrectable_errors = 0
4. Проверить журнал
journalctl -k -b -n 300 --no-pager
Не должно появляться новых:
BTRFS error
I/O error
csum failed
parent transid verify failed
forced readonly
open_ctree failed
5. Проверить данные
Проверить основные каталоги, snapshots, subvolume, права, критичные документы, архивы и базы данных средствами приложений.
Исправная структура Btrfs не гарантирует логическую целостность содержимого файла.
6. Решить судьбу ФС
ФС следует пересоздать и восстановить из копии, если:
- была серьёзная структурная порча;
- применялся
btrfs check --repair; - использовался
chunk-recover; - есть неисправимые checksum errors;
- ошибки возвращаются после scrub;
- нижний носитель проявлял физическую деградацию.