· 15 мин чтения

Восстановление RAID5 в офисе: реальный кейс с WD Red Pro и Seagate IronWolf

Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15 лет работы с офисными серверами малого и среднего бизнеса в Москве я разбирал десятки развалившихся RAID-массивов — от простых отказов одного диска до жёстких ситуаций, когда в пятницу вечером одновременно умирают два. Расскажу про свежий кейс: юридическая фирма на 24 рабочих места, файловый сервер с RAID5 из четырёх WD Red Pro, умершие диски, документы клиентов за 11 лет и то, как мы всё это собрали обратно.

Ситуация: RAID5 из 4 дисков WD Red Pro по 4 ТБ

Звонок поступил в пятницу в 16:20. Руководитель юридической фирмы «Правовой актив» (21 сотрудник + 3 стажёра, офис на Большой Лубянке) сообщил: файловый сервер выдаёт «ошибку сетевого пути», работать нельзя, клиенты ждут документы. Уже на месте через час я увидел типовую картину.

Конфигурация сервера HP ProLiant ML350 Gen10, поставленного в 2019 году:

Диагностика mdadm --detail /dev/md0 показала: массив в состоянии inactive, два диска (/dev/sda и /dev/sdc) помечены как faulty. Два оставшихся (/dev/sdb, /dev/sdd) ещё живы. RAID5 штатно выдерживает отказ одного диска — два отказа ведут к остановке массива.

Бэкапы делались... в отдельную папку того же RAID5. Классика. Директор уточнил: «Мы думали, RAID — это и есть бэкап». Это не бэкап. RAID — это защита от единичного отказа железа, но не от шифровальщиков, удаления по ошибке, пожара и — главное в нашем случае — одновременного отказа нескольких дисков.

Шаг 1: SMART по всем дискам — что умерло, а что живо

Прежде чем что-то пробовать, я всегда собираю SMART-отчёты по всем дискам массива. Две важные причины: (1) понять, какой из «умерших» дисков читается лучше, (2) оценить состояние оставшихся «живых» — вдруг они на грани.

# Проверяем SMART всех дисков в массиве
for d in sda sdb sdc sdd; do
  echo "=== /dev/$d ==="
  sudo smartctl -H /dev/$d | grep -E "SMART overall|result"
  sudo smartctl -A /dev/$d | grep -E "Reallocated_Sector|Current_Pending|Offline_Uncorrectable|Power_On_Hours"
  echo
done

Результаты по четырём дискам WD Red Pro 4 ТБ (WD4003FFBX):

ДискМодельSMARTReallocatedPendingЧасы работыОценка
/dev/sdaWD Red Pro 4TB (WD4003FFBX)FAILING2 84741256 120Читается частично, критично
/dev/sdbWD Red Pro 4TB (WD4003FFBX)PASSED4056 118Живой, здоровый
/dev/sdcWD Red Pro 4TB (WD4003FFBX)FAILED18 2049 11256 122Тяжёлый случай, много bad blocks
/dev/sddWD Red Pro 4TB (WD4003FFBX)PASSED0056 117Живой, идеальный

56 тысяч часов — это 6.4 года непрерывной работы. Ресурс MTBF у WD Red Pro заявлен 1 млн часов, но это статистика, а не гарантия для каждого экземпляра. Более того — диски одной партии часто отказывают в близкие временные окна, потому что произведены из одного материала в одной смене. Это та самая причина, по которой я рекомендую покупать диски разных партий или разных производителей в один массив.

Хорошая новость — диск /dev/sda читается на 99.3 % по предварительному замеру. Этого достаточно, чтобы пересобрать RAID5. Диск /dev/sdc в плохом состоянии, но нам он и не нужен — достаточно одного из двух «мёртвых».

Шаг 2: посекторные образы через ddrescue

Главное правило работы с умирающими дисками — никогда не работать с оригиналами. Каждая попытка чтения с повреждённого диска может ухудшить ситуацию: сектор, который сейчас читается с 10-й попытки, через час не прочитается вообще. Поэтому все дальнейшие действия делаем с посекторными копиями на отдельном хранилище.

В субботу утром я привёз в офис внешний бокс на 20 ТБ (4 × Seagate IronWolf 6 ТБ в RAID0 — специально на такой случай, стоит у нас в лаборатории). Подключил к серверу по USB 3.1 Gen 2 и начал копирование через ddrescue:

# Копируем самый повреждённый диск в первую очередь
# --no-scrape: первый проход без попыток вычитать плохие сектора
# -d: прямой доступ минуя кеш ядра
# -r3: до 3 попыток чтения при повторных проходах
sudo ddrescue -d --no-scrape /dev/sda /mnt/rescue/sda.img /mnt/rescue/sda.log

# Первый проход занял 8 часов 14 минут
# rescued: 3998.22 GB, errsize: 1.78 GB
# Второй проход — повторные попытки вычитать битые области
sudo ddrescue -d -r3 /dev/sda /mnt/rescue/sda.img /mnt/rescue/sda.log
# После второго прохода: 3999.61 GB rescued, 0.39 GB errors

# Худший диск — пробуем, но без фанатизма (он не критичен)
sudo ddrescue -d --no-scrape /dev/sdc /mnt/rescue/sdc.img /mnt/rescue/sdc.log
# 3.58 TB rescued, остальное — непрерывные bad sectors

# Здоровые диски тоже клонируем — на всякий случай
sudo ddrescue -d /dev/sdb /mnt/rescue/sdb.img /mnt/rescue/sdb.log
sudo ddrescue -d /dev/sdd /mnt/rescue/sdd.img /mnt/rescue/sdd.log

Суммарно копирование всех четырёх дисков заняло 22 часа (до воскресенья утра). Клиенту я в субботу вечером объяснил: «Работы будут делаться с образами, оригинальные диски мы больше не трогаем. В понедельник к обеду скажу, что получилось».

Шаг 3: анализ метаданных и выбор, с какого диска собирать

С образами можно экспериментировать сколько угодно — если что-то пойдёт не так, всегда есть возможность начать сначала. Подключаем образы как loop-устройства и читаем суперблоки mdadm:

# Подключаем образы
sudo losetup /dev/loop0 /mnt/rescue/sda.img
sudo losetup /dev/loop1 /mnt/rescue/sdb.img
sudo losetup /dev/loop2 /mnt/rescue/sdc.img
sudo losetup /dev/loop3 /mnt/rescue/sdd.img

# Читаем метаданные RAID с каждого
for i in 0 1 2 3; do
  echo "=== loop$i ==="
  sudo mdadm --examine /dev/loop$i | grep -E "Events|Array State|Update Time|Role"
done

Ключевой параметр — Events counter. Это внутренний счётчик изменений массива; у «живых» дисков он всегда одинаковый, у выпавших — отстаёт на столько, сколько прошло между отказом и текущим моментом.

Диск (образ)EventsArray StateОбновлён
loop0 (бывший sda)2 148 902AAA.Пт 16:14
loop1 (бывший sdb)2 148 932.AAAПт 16:17
loop2 (бывший sdc)2 148 701AAAAПт 11:28
loop3 (бывший sdd)2 148 932.AAAПт 16:17

Выводы: первым отказал sdc в 11:28 пятницы. Администратор, видимо, этого не заметил (мониторинга не было). Через 4 часа 46 минут выпал второй диск sda, и массив остановился. У sda разрыв всего 30 events от актуального состояния — это значит, что его данные почти полностью свежие и пригодны для пересборки.

Выбор очевиден: собираем RAID5 из трёх дисков (loop0, loop1, loop3), четвёртый слот — missing. Использовать loop2 нельзя — его данные отстают на 9 часов, и при сборке получим битую файловую систему.

Шаг 4: сборка массива в degraded-режиме

Это самая напряжённая часть работы. Один неверный флаг команды mdadm --create — и parity пересчитается поверх актуальных данных, массив превратится в мусор. Поэтому сначала пробуем штатный assemble:

# Пытаемся собрать массив по сохранённым метаданным
sudo mdadm --assemble /dev/md127 /dev/loop0 /dev/loop1 /dev/loop3 --force

# Смотрим состояние
sudo mdadm --detail /dev/md127
# State : clean, degraded
# Active Devices : 3
# Working Devices : 3
# Failed Devices : 0
# Spare Devices : 0
#
# Number  Major  Minor  RaidDevice State
#    0    7      0      0          active sync   /dev/loop0
#    1    7      1      1          active sync   /dev/loop1
#    -    0      0      2          removed
#    3    7      3      3          active sync   /dev/loop3

Массив собрался с первой попытки благодаря метаданным, которые mdadm хранит в конце каждого диска. В случаях, когда assemble отказывает (например, метаданные затёрты), приходится использовать --create --assume-clean с указанием точного порядка дисков, chunk size и layout, и это уже высокий риск. В нашем случае обошлось штатными средствами.

Шаг 5: проверка файловой системы ext4

Массив собран, но он мог остановиться в середине записи — значит, файловая система в неконсистентном состоянии. Запускаем проверку в read-only сначала:

# Только проверка, без изменений
sudo e2fsck -nv /dev/md127

# Результат:
# /dev/md127: Inode 458732 has illegal block(s)
# /dev/md127: Inode 612094 has a bad extent header
# /dev/md127: Group descriptor 18 checksum is invalid
# UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY

# Дальше — полная проверка с исправлением
sudo e2fsck -yfv /dev/md127
# 47 inode issues fixed
# 12 orphan inodes moved to lost+found
# Filesystem has been cleaned

Потеряли 12 файлов, которые попали в lost+found без имён. Позже разобрали их: 9 оказались временными файлами Office (lock-файлы открытых в момент сбоя документов), 2 — валидные документы бухгалтерии (восстановили из кешей Outlook у конкретных пользователей), 1 — бинарный файл непонятного происхождения.

Монтируем в режиме read-only, чтобы ничего случайно не повредить:

sudo mount -o ro /dev/md127 /mnt/restored
cd /mnt/restored
du -sh *
# 2.1T  contracts/
# 1.8T  court_cases/
# 3.4T  scans/
# 892G  correspondence/
# 178G  templates/
# 85G   administration/

find /mnt/restored -type f | wc -l
# 4 218 904 файла

Всё на месте. Для проверки целостности отдельных файлов я прогнал выборку из 500 случайных PDF-файлов через pdfinfo — 498 открылись, 2 повреждённых. Это погрешность в пределах нормы для восстановления после двойного отказа.

Шаг 6: перестройка массива и переход на RAID6

Восстановить данные — это только половина работы. Вторая половина — сделать так, чтобы ситуация не повторилась. В понедельник утром я привёз клиенту на замену 6 новых дисков: 3 × Seagate IronWolf Pro 6 ТБ (ST6000NT001) и 3 × WD Red Pro 6 ТБ (WD6003FFBX). Специально разных производителей — чтобы снизить риск одновременного отказа.

Собрали свежий RAID6 на 6 дисках:

# Создаём RAID6 на 6 дисков
# RAID6 выдерживает отказ ДВУХ дисков одновременно
sudo mdadm --create /dev/md0 --level=6 --raid-devices=6 \
  /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 \
  --chunk=256 --metadata=1.2

# Дополнительно — hot spare на случай отказа
# Добавим позже при расширении

# Полезный объём RAID6 из 6×6ТБ = 24 ТБ (6 - 2 на parity)
sudo mkfs.ext4 -L pravo_data -m 1 -L pravo_data /dev/md0
sudo mount /dev/md0 /mnt/data

# Копируем восстановленные данные обратно
sudo rsync -av --progress /mnt/restored/ /mnt/data/

На перезаливку 8.4 ТБ данных ушло 11 часов. К среде утру сервер работал как раньше, только уже на RAID6.

Шаг 7: мониторинг SMART и mdadm через Zabbix

Чтобы отказ первого диска не остался незамеченным, мы настроили мониторинг. Я использую Zabbix на отдельной виртуалке — он стоит в стойке нашего клиента и следит не только за RAID, но и за всей инфраструктурой. Ключевые метрики, по которым шлются алерты в Telegram:

Минимальная настройка без Zabbix — встроенный mdadm --monitor в daemon-режиме, который пишет email при изменении состояния массива. Стоит настроить за 5 минут, может спасти бизнес:

# /etc/mdadm/mdadm.conf
MAILADDR admin@company.ru
MAILFROM server@company.ru

# Включаем демон мониторинга
sudo systemctl enable mdmonitor
sudo systemctl start mdmonitor

# Тест — должен прийти email
sudo mdadm --monitor --scan --test --oneshot

Сколько это стоило клиенту и сколько стоила бы профилактика

Конкретные цифры по этому кейсу:

Итого — 773 000 руб. Для сравнения: нормальное IT-обслуживание офиса на 24 РМ в тарифе «Стандарт» стоит 78 000 руб./мес, или 936 000 руб./год. В эту сумму входит мониторинг, плановые проверки SMART, грамотные бэкапы, плановая замена дисков при износе. То есть один год нормального обслуживания дороже, чем разовое восстановление, — но в долгосрочной перспективе десятки подобных инцидентов в сумме превышают стоимость обслуживания многократно.

Чек-лист по RAID для офиса до 50 РМ

Сводный список рекомендаций, которые я даю каждому новому клиенту при аудите:

Аудит хранилища до того, как он посыпется

Если на вашем файловом сервере или NAS стоит RAID5, дискам больше 4 лет, и вы не помните, когда последний раз смотрели SMART — пригласите меня на бесплатный аудит. За 2–3 часа я проверю состояние массива, SMART всех дисков, корректность бэкапов, дам письменные рекомендации по переходу на RAID6 и напишу смету, если нужны работы. Это занимает полдня и может сохранить вам от 500 тысяч до нескольких миллионов в случае двойного отказа.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы по восстановлению RAID

Можно ли восстановить RAID5 при отказе двух дисков?
Да, если хотя бы один из отказавших дисков частично читается. Через ddrescue создаётся посекторный образ с пропуском битых секторов, затем массив собирается в degraded-режиме из трёх живых элементов. Если оба диска полностью мертвы (электроника сгорела, головки лежат) — восстановление только в лаборатории за 25 000–120 000 руб. за диск.
Что лучше для офисного файлового сервера — RAID5 или RAID6?
Для массивов из 4 и более дисков по 4 ТБ и больше — только RAID6. RAID5 при ребилде после отказа одного диска работает без избыточности 12–36 часов, и статистически второй диск нередко умирает именно в это окно. RAID6 выдерживает одновременный отказ двух дисков, что критично для бизнес-данных.
Какие диски выбирать для RAID в офисе?
Для NAS/файлового сервера — WD Red Pro, Seagate IronWolf Pro, Toshiba MG-серии. Это диски класса «24×7 для NAS/серверов» с вибростабилизацией и поддержкой TLER. Обычные WD Blue или Seagate Barracuda не подходят — в RAID они вылетают из-за долгого recovery при ошибке чтения. Покупайте диски разных партий и производителей, чтобы снизить риск одновременного отказа.
Как узнать, что RAID на сервере деградировал?
Настройте мониторинг mdadm через email (mdadm --monitor) или Prometheus с node_exporter. Важнее смотреть SMART-атрибуты заранее: Reallocated_Sector_Ct выше 50 — повод заменить диск, 200+ — срочная замена. Также отслеживайте Current_Pending_Sector и Offline_Uncorrectable. Без мониторинга первый умерший диск в RAID5 никто не заметит до второго — и тогда беда.
Сколько стоит восстановление RAID в офисе Москвы?
Наши работы по программному восстановлению (mdadm, ddrescue, fsck, сборка) — 35 000–85 000 руб. в зависимости от размера массива и количества повреждённых дисков. Если нужна замена головок или чистая комната — это уже лаборатория, 60 000–250 000 руб. за массив. Практически всегда дешевле купить хорошие диски WD Red Pro и настроить RAID6 сразу.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.