Как контролировать рейд файловой системы BTRFS на наличие ошибок?

11

Я видел некоторую документацию по демону, который может выполнить программу / скрипт для различных событий BTRFS, но я больше не могу его найти.

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

Ioan
источник
1
Почему вы хотите, чтобы система отключала raid1 при сбое диска? Это лучше, чем цель? Я имею в виду, что у вас может быть какая-то причина для этого, но по умолчанию этого не должно быть
Петр
У меня был RAID5, два диска выходили из строя за короткое время друг от друга. Я пытался настроить новую систему, используя функцию зеркального наведения BTRFS и быстро реагировать на проблемы с диском (не обязательно сбой диска), чтобы уменьшить вероятность дальнейшего повреждения и предоставить время для устранения первоначальной причины. Я надеюсь, что N-way зеркало BTRFS когда-нибудь будет работать хорошо.
Иоан
@Ioan: Вот почему RAID-5 не всегда рекомендуется, и вместо него следует использовать RAID-6. Resilver создаст большое напряжение для всех дисков, что может привести к сбою второго диска, который может скоро испортиться, во время этого процесса. В отличие от RAID-5, RAID-6 может справиться с этим (вы также можете перемонтировать его только для чтения и обновить резервную копию перед заменой второго диска).
basic6

Ответы:

18

В дополнение к обычной системе ведения журналов, BTRFS имеет команду stats , которая отслеживает ошибки (в том числе ошибки чтения, записи и ошибки / контрольные суммы) для каждого диска:

# btrfs device stats /
[/dev/mapper/luks-123].write_io_errs   0
[/dev/mapper/luks-123].read_io_errs    0
[/dev/mapper/luks-123].flush_io_errs   0
[/dev/mapper/luks-123].corruption_errs 0
[/dev/mapper/luks-123].generation_errs 0

Таким образом, вы можете создать простой корневой cronjob:

MAILTO=admin@myserver.com
@hourly /sbin/btrfs device stats /data | grep -vE ' 0$'

Это будет проверять положительный счет ошибок каждый час и отправит вам электронное письмо. Очевидно, что вы должны протестировать такой сценарий (например, вызвать повреждение или удалить grep), чтобы убедиться, что уведомление по электронной почте работает.

Кроме того, с такими продвинутыми файловыми системами, как BTRFS (которые имеют контрольную сумму), часто рекомендуется планировать очистку каждые пару недель для обнаружения тихого повреждения, вызванного неисправным диском.

@monthly /sbin/btrfs scrub start -Bq /data

-BВариант будет держать куст на переднем плане, так что вы увидите результаты в электронных хронах посылают вам. В противном случае, он будет работать в фоновом режиме, и вам придется помнить, чтобы проверить результаты вручную, поскольку они не будут в электронной почте.

Обновление : улучшен grep в соответствии с предложением Михаэля Кьёрлинга, спасибо.

Обновление 2 : Дополнительные примечания по сравнению с обычными операциями чтения (это относится не только к BTRFS):
Как указал Иоан, очистка может занять много часов, в зависимости от размера и типа массива (и других факторов), в некоторых случаях даже больше, чем день. И это активное сканирование, оно не будет обнаруживать будущие ошибки - цель скраба - найти и исправить ошибки на ваших дисках в тот момент. Но, как и в других системах RAID, рекомендуется планировать периодические очистки. Это правда, что типичная операция ввода-вывода, такая как чтение файла, действительно проверяет, действительно ли прочитанные данные верны. Но рассмотрим простое зеркало: если первая копия файла повреждена, возможно, из-за диска, который вот-вот умрет, но вторая копия, которая является правильной, фактически читается BTRFS, тогда BTRFS не будет знать, что существует повреждение на одном из дисков. Это просто потому, что запрошенные данные были получены,Это означает, что даже если вы специально прочитали файл, который, как вы знаете, поврежден на одном диске, нет гарантии, что эта операция чтения обнаружит повреждение.
Теперь давайте предположим, что BTRFS только когда-либо читает с хорошего диска, не выполняется очистка, которая бы выявила повреждение на плохом диске, а затем хороший диск тоже испортился - результатом была бы потеря данных (по крайней мере, BTRFS знал бы какие файлы все еще правильны и все еще позволят вам прочитать те). Конечно, это упрощенный пример; на самом деле BTRFS не всегда читает с одного диска и игнорирует другой.
Но дело в том, что периодические операции очистки важны, потому что они будут находить (и исправлять) ошибки, которые не всегда будут обнаруживаться регулярными операциями чтения.

Неисправные диски . Поскольку этот вопрос довольно популярен, я хотел бы отметить, что это «решение по мониторингу» предназначено для выявления проблем с возможно плохими дисками (например, умирающий диск вызывает ошибки, но все еще доступен).

С другой стороны, если диск внезапно пропал (отсоединен или полностью мертв, а не умирает и выдает ошибки), это будет неисправный диск (ZFS пометит такой диск как ОШИБКА). К сожалению, BTRFS может не осознавать, что диск отключен во время монтирования файловой системы, как указано в записи списка рассылки от 09/2015 (возможно, это было исправлено):

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

https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg46598.html

К тому времени в dmesg будет множество сообщений об ошибках, поэтому grepping dmesg может быть ненадежным.
Для сервера, использующего BTRFS, может быть целесообразно иметь пользовательскую проверку (задание cron), которая отправляет предупреждение, если по крайней мере один из дисков в массиве RAID отсутствует, т. Е. Больше не доступен ...

basic6
источник
1
Разве что-то не grep -vE ' 0$'будет лучше?
CVn
@ MichaelKjörling: Хорошая идея, я обновил свой ответ, спасибо!
basic6
Это хорошая идея, и я делаю это как регулярную проверку целостности. Однако проверка всех данных может занять намного больше часа. Не говоря уже об износе оборудования, если он работает постоянно, чтобы выявить ошибки. BTRFS выполняет контрольное суммирование всех нормальных операций файловой системы, и это будет более эффективным способом немедленной реакции на них.
Иоан
@loan: Вы правы, скраб может работать в течение многих часов, так что это, очевидно, создает большую нагрузку на диски. Но это делается для обнаружения бесшумного повреждения, так что вы можете заменить плохой диск, прежде чем другой тоже выйдет из строя. Безмолвное повреждение не происходит во время нормальной работы fs, поэтому вы не будете получать автоматическую информацию.
basic6
@ basic6: Абсолютно, и это отлично подходит для этого. Тем не менее, он ничего не делает для обнаружения ошибок во время нормальной работы, такой как ухудшенный массив BTRFS, до следующей очистки. С молчаливой коррупцией можно справиться, используя ежемесячный скраб для эффективности, но это слишком долго для других ошибок.
Иоан
4

Начиная с btrfs-progs v4.11.1 stats имеет параметр --check, который будет возвращать ненулевое значение, если любое из значений не равно нулю, что устраняет необходимость в регулярном выражении.

статистика устройства -c /

Ник Майер
источник
3

Я бы не стал полагаться на команду stats для уведомления об ошибках, потому что эта команда не возвращает ошибок, если диск внезапно исчезает. Вы можете проверить это, отсоединив кабель sata или вытащив диск - не рекомендуется с важной файловой системой.

btrfs device stats /

После перезагрузки btrfs показывает отсутствующие диски, но это может быть слишком поздно.

btrfs fi show
Чарльз Янг
источник
2

Похоже, что нет демона или утилиты, которая официально сообщает о событиях BTRFS для обработки пользователем. Ближайшая альтернатива - отслеживать системный журнал на наличие сообщений от BTRFS и реагировать соответствующим образом.

http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html

Приведенная выше ссылка содержит более подробную информацию о настройке сценария ( secпакета в Debian или SEC ), предназначенного для мониторинга журналов общего назначения, для обработки неожиданных сообщений журнала, касающихся BTRFS. Это также зависит от наличия регулярной очистки файловой системы для проверки на наличие битов и создания записей журнала в качестве упреждающей меры. Ниже приведена выдержка из сценария SEC:

Как настроить sec, коррелятор событий для сообщения об ошибках или предупреждениях файловой системы btrfs

После установки sec.pl (apt-get install sec на debian или http://simple-evcorr.sourceforge.net/ ) установите 2 файла конфигурации ниже.

Это не является надежным, оно опирается на регулярные выражения известных сообщений, которые в порядке, и сообщает обо всех неизвестных. При необходимости вы можете расширить отрицательное регулярное выражение.

polgara:~\# cat /etc/default/sec  
\#Defaults for sec  
RUN_DAEMON="yes"  
DAEMON_ARGS="-conf=/etc/sec.conf -input=/var/log/syslog -pid=/var/run/sec.pid -detach -log=/var/log/sec.log"

polgara:~# cat /etc/sec.conf  
\# http://simple-evcorr.sourceforge.net/man.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article-part2.html  
type=SingleWithSuppress  
ptype=RegExp  
pattern=(?i)kernel.*btrfs: (?!disk space caching is enabled|use ssd allocation|use .* compression|unlinked .* orphans|turning on discard|device label .* devid .* transid|detected SSD devices, enabling SSD mode|has skinny extents|device label|creating UUID tree|checking UUID tree|setting .* feature flag|bdev.* flush 0, corrupt 0, gen 0)  
window=60  
desc=Btrfs unexpected log  
action=pipe '%t: $0' /usr/bin/mail -s "sec: %s" root
Ioan
источник
1

Похоже, задача для мониторинга системы. Существует проверка, которая реализует API подключаемого модуля Nagios, которая называется: check_btrfs . Как вы можете видеть в исходном коде, у него есть функция, check_dev_statsкоторая проверяет статистику устройства и станет критической, если какое-либо из значений будет ненулевым. Он также проверяет наличие проблем с распределением. Остается неясным, как ведет себя проверка, если один диск отсутствует или отключается .

PS: плагин упакован в Debian: monitor-plugins-btrfs

YPID
источник