Возможные проблемы CloudLinux

Материал из ISPWiki
Перейти к: навигация, поиск

В этой статье будут приводиться возможные проблемы при работе с модулем CloudLinux и способы их решения.

С ядром CL сервер не может подключить корневую ФС

Симптомы

При конвертации CentOS в CloudLinux и последующей перезагрузке сервер может остановиться с ошибкой после старта ядра, при этом на экране будет сообщение о невозможности найти корень системы (unable to mount root) и после него будет открыта командная строка с приглашением dracut# . Эта ошибка вызвана тем, что во время установки ядра CloudLinux некорректно прошла генерация initramfs -- минимального образа пользовательского окружения, загружаемого одновременно с ядром Linux и в большинстве случаев необходимого для загрузки ОС.

Что такое initramfs?

В этом образе хранятся модули ядра, которые могут понадобиться при загрузке (драйверы IDE/SATA/SAS/RAID-контроллеров, сетевых карт, MDRAID, LVM, модули поддержки файловых систем, и т.д.) и без которых ядро не сможет запустить устройства, на которых находится корневая файловая система сервера (/), и подключить эту ФС.

Как собирается initramfs?

Как правило, сборка initramfs происходит автоматически при установке\обновлении пакетов ядра. В случае с установкой CloudLinux пакет с ядром может установиться до пакетов с дополнительными модулями и заголовками ядра, из-за чего initramfs соберётся без части необходимых файлов. В CentOS сборка initramfs производится с помощью команды dracut. Вызванный без дополнительных параметров, dracut собирает initramfs общего назначения (с большим числом различных модулей) для ядра, с которого система запущена в данный момент. Если для текущего ядра уже существует initramfs, его можно пересобрать, добавив к dracut опцию -f.

Что делать, если сервер после перезагрузки не видит корневую ФС?

Первым делом надо попробовать загрузиться с помощью стандартного ядра CentOS, которое при установке CloudLinux не удаляется и должно остаться как доступный вариант для выбора в меню загрузчика GRUB. Если загрузка с оригинального ядра прошла удачно, можно приступать к сборке initramfs.

Если стандартного ядра в меню GRUB не оказалось, или при попытке загрузиться с него появилась такая же ошибка, то для восстановления потребуется использовать chroot.


Chroot

chroot -- механизм изменения корневого каталога. Одно из его применений -- доступ к системе, которую не удалось загрузить, с использованием носителя с другой системой (например, как в нашем случае, загрузка с Live-носителя и пересборка initramfs системы, которая перестала загружаться).

Подготовка

Для входа в chroot требуется уже подключенное дерево каталогов, которые будут служить "новым" корнем, поэтому сначала потребуется примонтировать все ФС, которые требуются для работы системы:

  1. Корневая ФС целевой системы (/);
  2. Загрузочный раздел целевой системы (/boot);
  3. Каталог с системными приложениями (/usr, если он находится на отдельном разделе);
  4. Каталоги с файлами устройств и служебными данными от ядра (/proc,/sys,/dev);

Кроме того, если во время работы с chroot планируется использовать сеть, может потребоваться файл /etc/resolv.conf, в котором хранятся адреса используемых серверов имён.

Дерево блочных устройств типовой установки CentOS с MD RAID + LVM

Для того, чтобы правильно "собрать" дерево каталогов, ничего не пропустить и не сломать, нужно составить список ФС и подсистем хранения, которые используются для организации работы корневой (и других) ФС на сервере:

  • Используется ли MD RAID?
  • Используется ли LVM?
  • Используется ли шифрование блочных устройств (dm-crypt,LUKS)?
  • В каком порядке используются эти системы ("диск->LVM->ФС", "диски->MD RAID->ФС", "диски->MD RAID->LUKS->LVM->ФС")?
  • Используются ли ФС, имеющие в себе функции управления дисками и подтомами (ZFS,btrfs)?

И по этому списку составить порядок действий, которые требуются для правильного построения дерева каталогов, которое будет использвоаться для chroot. Для примера, в этой статье будет использоваться сервер с двумя HDD, собранными в MD RAID1, поверх которого запускается LVM (с группой томов system), в котором живут тома, содержащие файловые системы сервера.

Структура хранилища сервера
Точки монтирования /boot / /var SWAP /home
Логические тома LVM cl-root cl-var cl-swap cl-home
Группы томов LVM /dev/cl
MD RAID-массивы /dev/pv00
Физические разделы /dev/sda1 /dev/sda2 /dev/sdb1
Физические диски /dev/sda /dev/sdb



Загрузка с live-образа, сборка дерева каталогов и вход в chroot

Для восстановления системы из live-образа через chroot в принципе подойдёт любой live-диск (или live-флэшка) Linux, например, SystemRescueCD, Arch Linux, Ubuntu или CentOS. В примерах статьи используется диск CentOS.

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

Для сборки дерева каталогов нам потребуется какой-либо каталог, который будет выполнять роль будущего корня (куда будет подключена корневая ФС целевой системы). Создадим его командой mkdir /mnt/root. Теперь можно приступать к монтированию файловых систем:

  1. Монтируем корневую ФС:
    mount /dev/cl/root /mnt/root;
  2. Монтируем загрузочный раздел и прочие разделы, содержащие дополнительные ФС:
    mount /dev/cl/var /mnt/root/var
    mount /dev/cl/home /mnt/root/home
  3. Монтируем загрузочный раздел (в нём находятся файлы ядра и initramfs):
    mount /dev/sda1 /mnt/root/boot;
  4. Монтируем псевдо-ФС, содержащие служебную информацию от ядра, а так же файлы устройств:
    mount -t proc proc /mnt/root/proc
    mount --rbind /sys /mnt/root/sys
    mount --make-rslave /mnt/root/sys
    mount --rbind /dev /mnt/root/dev
    mount --make-rslave /mnt/root/dev


После того, как все необходимые ФС подключены, можно переходить в chroot. Следующая команда сменит корневой каталог текущего процесса (командной оболочки) на /mnt/root и запустит внутри него командную оболочку bash: chroot /mnt/root /bin/bash Также рекомендуется загрузить переменные окружения, определённые системой: source /etc/profile

После этого можно приступать к сборке initramfs.

Сборка initramfs

Сборкой initramfs в CentOS и других RHEL-подобных дистрибутивах занимается программа dracut. Перед тем, как начинать сборку, нужно посмотреть, какие ядра установлены в системе. Сделать это можно командой ls -la /boot:

Ls-slash-boot.png

Файлы ядра имеют вид vmlinuz-VER.REL.ARCH, где VER -- версия ядра, REL -- релиз ядра (el7 в случае CentOS) и ARCH -- архитектура, для которой предназначено ядро (x86_64 в случае Intel-совместимых 64-битных процессоров). Для каждого ядра должен существовать файл с initramfs, который имеет имя вида initramfs-VER.REL.ARCH.img. Ядра CloudLinux можно отличить по наличию в номере версии слова lve.

В примере рассмотрим единственное ядро, имеющееся на машине -- vmlinuz-3.10.0-514.el7.x86_64. Для того, чтобы собрать для него initramfs, выполним такую команду: dracut -vf --kver 3.10.0-514.el7.x86_64,

где -v: показать подробный вывод (прогресс сборки);
-f: перезаписать существующий initramfs;
--kver VER: собрать initramfs для ядра версии VER.

В выводе следует проверить, включились ли требуемые модули (в примере это dm, mdraid и lvm).

Dracut, если ему не был передан (или указан в конфигурации) параметр -H, соберёт initramfs, пригодный для использования на максимально возможном числе конфигураций (т.е. попытается включить все модули, которые могут понадобиться). Опция -H заставляет dracut собирать initramfs только с теми модулями, которые потребуется для загрузки только этого сервера и только в такой конфигурации. Если Вы не уверены, выключена ли у Вас эта опция, можно передать dracut дополнительный параметр -N, который запретит подобное поведение и заставит dracut собрать образ со всеми возможными модулями.