Рейтинг:3

Правильная загрузка программного RAID1 с отсутствующим или неисправным диском

флаг gf

тл; др. Есть ли способ правильно загрузить программный RAID1 с отсутствующим или неисправным диском (который сначала не был поврежден пользователем)?

Для ясности, загрузка программного RAID1 без жесткого диска возможна. ЕСЛИ вы должным образом выходите из строя диск перед перезагрузкой. Я знаю, что это субъективно, но это не похоже ни на правдоподобное решение, ни на приемлемый ответ. Например; Объект получает удар по питанию, и жесткий диск выходит из строя в то же время, когда отключается электричество. Попытка загрузиться с поврежденного жесткого диска, который не был «правильно» поврежден, приведет к тому, что система перейдет в аварийный режим.

Я прочитал много сообщений здесь и на других форумах, в которых рекомендовалось установить grub на все разделы или пересобрать grub вручную, добавить безошибочно к /etc/fstab варианты или другие, казалось бы, простые решения; но реальность такова, что ни одна из этих рекомендаций не сработала.

Хотя я смирился с тем, что это невозможно, что-то в этом не так просто. Итак, я смотрю, есть ли у кого-нибудь еще эта проблема или есть ли решение этой проблемы.

Моя среда:

У меня более старая материнская плата, которая не поддерживает UEFI, поэтому у меня загружается устаревший режим/MBR.
ОПЕРАЦИОННЫЕ СИСТЕМЫ:

кошка /etc/redhat-релиз
Red Hat Enterprise Linux Workstation версии 7.6 (Maipo)

Ядро:

uname r
3.10.0-957.el7.x86_64

мдадм:

mdadm — версия
mdadm — v4.1-rc1 22 марта 2018 г.

Мой RAID - это RAID1 на трех дисках. (сда, сдб, сдк) и есть 4 раздела

md1 - / загрузка
md2 - /дом
мд3 - /
md4 - поменять местами

Я установил grub на все разделы и убедился, что все загрузочные разделы имеют флаг загрузки. fdisk /dev/sd[a,b,c] все показывают * в поле загрузки рядом с соответствующим разделом
-- и --
grub2-установить /dev/sd[a,b,c] (в виде отдельных команд с результатом «успешно установлено»).

Воспроизведение проблемы:

  1. Выключите систему со всеми дисками, назначенными для RAID, и RAID полностью заработает.
  2. Удалить жесткий диск
  3. Система питания включена

Результаты: Система загрузится после grub. Gdm попытается отобразить экран входа в систему, но примерно через 20 секунд он потерпит неудачу и перейдет к аварийной консоли. В «нормальной» системе отсутствует много частей. Например; /boot и /etc не существуют. Похоже, что нет никаких сообщений о панике ядра или проблем, отображаемых в dmesg.

Опять же, ключ здесь; RAID должен быть полностью собран, выключен и удален диск. Если вы правильно выведете диск из строя и удалите его из RAID, вы сможете загрузиться без диска.

Пример:
mdadm --manage /dev/md[1,2,3,4] --fail /dev/sda[1,2,3,4] (как отдельные команды)
mdadm --manage /dev/md[1,2,3,4] --remove /dev/sda[1,2,3,4] (как отдельные команды)

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

Будем очень признательны за любую помощь, вклад или предложения.

Рейтинг:6
флаг ca

Booting up a failed MD RAID1 array is surely possible - at least if the BIOS skips the failed disk (if not, you can simply manually boot from the surviging disk).

For your specific issue, you are probably hitting this bug. An excerpt (but reading all the bug report would be a good idea):

RHEL 7.6 dracut-iniqueue script has a default value of 180 seconds (as defined in the RDRETRY variable), which is higher than systemd root mount service (90 seconds). This can lead to unbootable system when root resides on a degraded software RAID1 device (user is dropped to emergency shell). See https://bugzilla.redhat.com/show_bug.cgi?id=1451660# for an example of the problem. Note that this only happen when the RAID device expects itself to be healthy, but it unexpectedly found the array degraded during boot.

Passing "rd.retry=30" at boot time fixes the degraded array boot problem, as the array is forced started before the systemctl root mount service times out. Moreover, the long dracut rd.retry timeout is inconsistent with dracut.cmdline(7) man page, where it is stated the timeout should be 30 seconds.

...

Additional info: I traced the problem to how mdadm --incremental, dracut timeout (rd.retry) and systemctl default timeout interact:

  • mdadm --incremental will not start/run an array which is unexpectedly found degraded;
  • dracut should force-start the array after 2/3 of the timeout value passed. With current RHEL default, this amount to 180/3*2 = 120s;
  • systemctl expect to mount the root filesystem in at most 90s. If it does not succeed, it abort the dracut script and drop to an emergency shell. Being 90s lower than dracut timeout, it means that dracut does not have a chance to force-start the array. Lowering rd.retry timeout (setting as the man page suggests) enables dracut to force-start the array, allowing the systemctl service to succeed.

As the bug should be fixed in recent RHEL/CentOS 7 point releases, I strongly suggest to update your system if you can. Otherwise, try passing rd.retry=30 as kernel boot option.

Will Roberts avatar
флаг gf
шоданшок. Спасибо! Это была именно проблема, и изменение параметра md.raid заставляет RAID перестраиваться до истечения времени ожидания и позволяет системе правильно загружаться.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.