Вопрос или проблема
Я начинаю собирать коллекцию компьютеров дома, и для их поддержки у меня есть мой “сервер” на Linux с работающим RAID-массивом.
В настоящее время это mdadm
RAID-1
, который превратится в RAID-5
, когда у меня будет больше дисков (а затем, я надеюсь, RAID-6
). Однако я слышал разные истории о повреждении данных на одном диске, которое остается незамеченным из-за использования другого диска, до того момента, когда первый диск выходит из строя, и вы обнаруживаете, что ваш второй диск также испорчен (и третий, четвертый, пятый диск).
Очевидно, что резервное копирование важно, и я также об этом забочусь, однако я знаю, что видел ранее скрипты, которые утверждают, что помогают против этой проблемы и позволяют проверять ваш RAID во время его работы. Однако, ища эти скрипты снова, я нахожу, что трудно найти что-то похожее на то, что я запускал раньше, и у меня складывается ощущение, что я устарел и не понимаю, что изменилось.
Как бы вы проверили работающий RAID, чтобы убедиться, что все диски работают нормально?
Я мониторю SMART на всех дисках и также настроил mdadm
на отправку мне email в случае сбоя, но хотел бы знать, чтобы мои диски иногда сами “проверялись”.
Цель RAID с избыточностью – чтобы он продолжал работать, пока это возможно, но, очевидно, он обнаружит ошибки, которые переведут его в деградированный режим, такие как сбой диска. Вы можете показать текущий статус массива с помощью mdadm --detail
(сокращённо как mdadm -D
):
# mdadm -D /dev/md0
<snip>
0 8 5 0 active sync /dev/sda5
1 8 23 1 active sync /dev/sdb7
Кроме того, код возврата mdadm -D
будет ненулевым, если возникла какая-либо проблема, такая как отказавший компонент (1 указывает на ошибку, которую компенсирует режим RAID, а 2 указывает на полную неисправность).
Вы также можете получить краткую информацию о состоянии всех RAID-устройств, просмотрев /proc/mdstat
. Вы можете получить информацию о RAID-устройстве в /sys/class/block/md*/md/*
; см. admin-guide/md.html
в документации ядра. Некоторые записи /sys
также доступны для записи; например, вы можете запустить полную проверку md0
с помощью echo check >/sys/class/block/md0/md/sync_action
.
В дополнение к этим проверкам, mdadm может уведомить вас, как только произойдет что-то плохое. Убедитесь, что у вас в /etc/mdadm.conf
есть MAILADDR root
(некоторые дистрибутивы, например Debian, настраивают это автоматически). Тогда вы получите уведомление по электронной почте, как только произойдет ошибка (деградированный массив).
Убедитесь, что вы получаете почту, отправленную на root на локальном компьютере (некоторые современные дистрибутивы упускают это, потому что считают, что вся почта отправляется через внешних провайдеров — но получение локальной почты необходимо для любого серьезного системного администратора). Проверьте это, отправив root письмо: echo hello | mail -s test root@localhost
. Обычно правильная настройка электронной почты требует двух вещей:
-
Запустить MTA на вашем локальном компьютере. MTA должен быть настроен как минимум для локальной доставки почты. Все дистрибутивы поставляются с подходящими MTA, выберите любой (но не nullmailer, если вы хотите, чтобы почта доставлялась локально).
-
Переадресовать почту, отправляемую на системные аккаунты (по крайней мере
root
), на адрес, который вы регулярно читаете. Это может быть ваша учетная запись на локальном компьютере или внешняя почтовая адреса. В большинстве MTA адрес можно настроить в/etc/aliases
; у вас должна быть строка, такая какroot: djsmiley2k
для локальной доставки, или
root: [email protected]
для удаленной доставки. Если вы выберете удаленную доставку, убедитесь, что ваш MTA настроен для этого. В зависимости от вашего MTA, возможно, вам потребуется выполнить команду
newaliases
после редактирования/etc/aliases
.
Вы можете принудительно проверить весь массив, пока он находится в сети. Например, чтобы проверить массив на /dev/md0
, выполните команду от имени root:
echo check > /sys/block/md0/md/sync_action
У меня также есть задача cron, которая выполняет следующую команду раз в месяц:
tar c /dir/of/raid/filesystem > /dev/null
Это не полная проверка самого диска, но она заставляет систему периодически проверять, что (почти) каждый файл можно успешно прочитать с диска. Да, некоторые файлы будут читаться из кэша памяти вместо диска. Но я считаю, что если файл находится в кэше памяти, то он успешно считан с диска недавно или будет записан на диск, и обе эти операции также выявят ошибки диска. В любом случае, выполнение этой задачи тестирует самый важный критерий RAID-массива (“Могу ли я успешно прочитать мои данные?”), и за три года работы моего массива, единственный раз, когда у меня возникла проблема с диском, эта команда обнаружила ее.
Одно небольшое предупреждение: если ваша файловая система большая, то выполнение этой команды займет много времени; моя система занимает около 6 часов на TiB. Я запускаю ее с помощью ionice
, чтобы остальная система не останавливалась во время проверки диска:
ionice -c3 tar c /dir/of/raid/filesystem > /dev/null
Пакет ‘mdadm’ в Debian и Ubuntu содержит файл
/etc/cron.d/mdadm
который запускает команду в первое воскресенье каждого месяца
/usr/share/mdadm/checkarray --cron --all --idle --quiet
которая проверяет все ваши массивы на консистентность (если вы не установили AUTOCHECK в false в /etc/default/mdadm). Отчет будет отправлен пользователю ‘root’ (убедитесь, что вы получаете такие сообщения).
Я использую эту простую функцию для проверки /proc/mdstat
:
#Здоровье RAID-массива
raid() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' /proc/mdstat; }
Я добавил это в свою командную строку, создав /etc/profile.d/raid_status.sh:
raid_prompt() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' /proc/mdstat | awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}'; }
Затем установил PS1 на:
PS1='$(raid_prompt)\n[\u@\h \W]\$ '
Это выводит имя массива и статус участников зеленым цветом, если все участники включены. Если участник выходит из строя, статус выводится красным цветом.
Я сделал несколько улучшений кода awk, используя
этот ответ от jasonwryan – версия 1
и этот ответ от Karl Peterson – версия 2
версия 3 со списком элементов RAID-массивов и их статусами
awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {printf "%s %s =%s\n", $(NF-1), $NF, line}' /proc/mdstat
пример вывода 3
md121: [1/1] [U] = active raid1 sdj6[2]
md122: [2/2] [UU] = active raid1 sdh5[2] sdi5[3]
md123: [2/2] [UU] = active raid1 sdf4[0] sdg4[1]
md124: [2/2] [UU] = active raid1 sdd3[0] sde3[1]
md125: [2/1] [_U] = active raid1 sdc2[1]
md126: [2/1] [_U] = active raid1 sdb1[1]
md127: [2/1] [_U] = active raid1 sda[1]
версия 4 со списком элементов RAID-массивов с их размером и статусами, понятными для человека
awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {total=$1; total_units="K"; if (total >= 1024*1024*1024) { total_units="T" ; total/= 1024*1024*1024;} else if (total >= 1024*1024) { total_units="G" ; total/= 1024*1024;} else if (total >= 1024) { total_units="M" ; total/= 1024;}; total_ident = total < 100 ? ( total < 10 ? "" : " " ) : ""; total_show = substr((total_ident total), 1, 5); printf "%s %s = %s %s =%s\n", $(NF-1), $NF, total_show, total_units"iB", line}' /proc/mdstat
пример вывода 4
md121: [1/1] [U] = 3.756 TiB = active raid1 sdj6[2]
md122: [2/2] [UU] = 1.456 TiB = active raid1 sdh5[2] sdi5[3]
md123: [2/2] [UU] = 543.2 GiB = active raid1 sdf4[0] sdg4[1]
md124: [2/2] [UU] = 23.4 GiB = active raid1 sdd3[0] sde3[1]
md125: [2/1] [_U] = 432.1 GiB = active raid1 sdc2[1]
md126: [2/1] [_U] = 69.7 GiB = active raid1 sdb1[1]
md127: [2/1] [_U] = 2.834 TiB = active raid1 sda[1]
и версия 5 является комбинацией версии 4 и версии 2
awk '/^md/ {printf "%s: ", $1; line=""; n=3; for (;n<=NF;n++) line=line" "$n;}; /blocks/ {total=$1; total_units="K"; if (total >= 1024*1024*1024) { total_units="T" ; total/= 1024*1024*1024;} else if (total >= 1024*1024) { total_units="G" ; total/= 1024*1024;} else if (total >= 1024) { total_units="M" ; total/= 1024;}; total_ident = total < 100 ? ( total < 10 ? "" : " " ) : ""; total_show = substr((total_ident total), 1, 5); printf "%s %s = %s %s =%s\n", $(NF-1), $NF, total_show, total_units"iB", line}' /proc/mdstat | awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}'
пример вывода 5 – такой же, как вывод 4, но с цветовой кодировкой
от Karl Peterson
Это выводит имя массива и статус участников зеленым цветом, если все участники включены. Если участник выходит из строя, статус выводится красным цветом.
Ответ или решение
Теория: Проверка RAID-массивов с использованием mdadm
Обслуживание RAID-массивов на вашем сервере — важная часть обеспечения надежности и доступности данных. Поскольку ваше текущее решение основано на mdadm
для управления RAID-массивом, необходимо регулярно проверять состояние всех дисков в массиве. Это особенно важно, поскольку даже при использовании RAID могут возникнуть ситуации, когда повреждения данных на одном из дисков не обнаруживаются до тех пор, пока не происходит отказ другого диска. Таким образом, необходимость регулярной диагностики очевидна.
mdadm
предлагает несколько способов мониторинга состояния массива, как через командную строку, так и через автоматизированные уведомления. Основные инструменты проверки включают команду mdadm --detail
, просмотр файла /proc/mdstat
, а также использование директории /sys/class/block/md*/md/*
для запуска синхронизаций и проверок.
Пример: Как проверить состояние RAID-массива
-
Мануальная проверка с помощью
mdadm --detail
:Используя команду
mdadm -D /dev/md0
, вы можете получить детальную информацию о состоянии вашего массива/dev/md0
. Выход данной команды покажет состояние каждого диска, например, делает ли диск синхронизацию или находится в активном состоянии. Обратите внимание на возвращаемый код команды: ненулевой код указывает на наличие проблемы.mdadm -D /dev/md0
-
Использование
/proc/mdstat
:Файл
/proc/mdstat
предоставляет краткое резюме статуса всех RAID-массивов. Этот метод особенно полезен для быстрого взгляда на состояние всех ваших массивов сразу:cat /proc/mdstat
-
Инициирование проверки через
/sys/class/block/md*/md/*
:Вы можете инициировать проверку или синхронизацию массива в
/dev/md0
, используя следующую команду:echo check > /sys/class/block/md0/md/sync_action
-
Автоматизированное оповещение об ошибках:
Добавьте
MAILADDR root
в/etc/mdadm.conf
, чтобы получать уведомления на почту в случае возникновения ошибок. Убедитесь, что почта для пользователяroot
перенаправляется на ваш актуальный рабочий адрес. -
Создание скриптов для регулярной проверки:
Вы можете написать скрипт, который будет регистрировать состояние /proc/mdstat и отправлять уведомления в случае обнаружения проблем. Один из таких скриптов можно интегрировать в вашу оболочку, чтобы выводить состояние массива при каждом входе в систему:
raid_prompt() { awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' /proc/mdstat | awk '/\[U+\]/ {print "\033[32m" $0 "\033[0m"}; /\[.*_.*\]/ {print "\033[31m" $0 "\033[0m"}' }
И интегрируйте его в PS1, например, так:
PS1='$(raid_prompt)\n[\u@\h \W]\$ '
Применение: Поддержание надежности RAID-массива
Для долгосрочного мониторинга и управления вашим RAID, следует не только полагаться на автоматические уведомления о сбоях, но и регулярно проводить ручную проверку. Внедрение скриптов для мониторинга, автоматических проверок и уведомлений позволяет создать многоуровневую систему контроля над вашим RAID, что значительно снижает риск не замеченных сбоев и потери данных. Регулярно обновляйте свои бэкапы и интегрируйте проверки RAID в повседневные задачи администрирования, чтобы обеспечивать стабильность и безопасность ваших данных.