Машина не загружается одним прыжком. От нажатия кнопки до приглашения в терминале проходит цепочка из четырёх-пяти звеньев, и каждое передаёт управление следующему. Когда сервер не поднялся, админ обязан знать, на каком именно звене он застрял: прошивка не нашла диск, загрузчик не показал меню, ядро запаниковало, initramfs не смонтировал корень или systemd завис на какой-то службе. Этот урок собирает всю цепочку в одну картину и учит читать её следы в журналах.

Как это работает
Первой включается прошивка материнской платы. Старый вариант - BIOS: он умеет читать только первые 512 байт диска (MBR), куда влезает крошечный кусок загрузчика, и грузится в режиме совместимости с процессором 1981 года. Современный вариант - UEFI: это полноценная мини-ОС в прошивке, она понимает файловую систему FAT на отдельном разделе ESP (EFI System Partition, обычно смонтирован в /boot/efi), читает оттуда нормальные файлы загрузчиков с расширением .efi и хранит список вариантов загрузки в энергонезависимой памяти NVRAM. На железе 2026 года UEFI - норма, BIOS остался в виртуалках и совсем старых машинах. Сопутствующая UEFI вещь - Secure Boot: прошивка проверяет цифровую подпись загрузчика и ядра, чтобы между ними не вклинился руткит.
Дальше прошивка запускает загрузчик. В мире Linux это почти всегда GRUB 2. Его задача - показать меню, найти образ ядра и initramfs в /boot, загрузить их в память и прыгнуть в ядро, передав ему строку параметров. GRUB - не единственный: на UEFI всё чаще встречается systemd-boot, более простой и быстрый.
Ядро распаковывается, поднимает свои подсистемы, находит процессоры и память. Но вот беда: драйвер вашего дискового контроллера или модуль для LVM, RAID, LUKS-шифрования может лежать на том самом диске, который ещё не смонтирован. Эту курицу-и-яйцо решает initramfs (initrd) - маленький временный корень-в-памяти, архив, который GRUB загрузил рядом с ядром. В нём есть базовые модули и скрипты ровно для одной цели: смонтировать настоящий корневой раздел. Сделав это, initramfs выполняет pivot_root на реальный корень и запускает первый процесс - /sbin/init, который на современных системах является symlink на systemd. С этого момента PID 1 берёт штурвал, активирует цели (targets) и поднимает все службы.
Команды и примеры
Посмотреть строку параметров, с которой реально стартовало текущее ядро:
Код: Выделить всё
cat /proc/cmdline
# ro root=UUID=... quiet splashКод: Выделить всё
# Debian/Ubuntu
sudo nano /etc/default/grub
sudo update-grub # обёртка над grub-mkconfig
# результат: /boot/grub/grub.cfg
# RHEL/Fedora
sudo nano /etc/default/grub
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# результат: /boot/grub2/grub.cfgПересборка initramfs нужна после смены драйверов или crypttab:
Код: Выделить всё
# Debian/Ubuntu (инструмент initramfs-tools)
sudo update-initramfs -u -k all
# RHEL/Fedora (инструмент dracut)
sudo dracut --force
# посмотреть содержимое образа:
lsinitrd /boot/initramfs-$(uname -r).imgКод: Выделить всё
dmesg --level=err,warn # только ошибки и предупреждения
dmesg -T # человекочитаемое времяКод: Выделить всё
journalctl -b # сообщения текущей загрузки
journalctl -b -1 # предыдущая загрузка (если журнал persistent)
journalctl -k # только сообщения ядра (аналог dmesg)
journalctl -p err -b # только ошибки этой загрузки
systemd-analyze blame # кто дольше всех стартовал- Перепутать update-grub (Debian) и grub2-mkconfig (RHEL). На RHEL команды update-grub нет, а путь к конфигу - /boot/grub2/, не /boot/grub/.
- Правят сам grub.cfg руками - и теряют правки при следующем grub-mkconfig. Менять надо /etc/default/grub и шаблоны в /etc/grub.d/, потом пересобирать.
- journalctl -b -1 пуст, потому что журнал по умолчанию в RAM. Нужен persistent: создать /var/log/journal и выставить Storage=persistent в journald.conf.
- После kernel panic с надписью "unable to mount root fs" грешат на ядро, а виноват чаще initramfs - забыли пересобрать после смены контроллера, переноса на новое железо или правки LUKS.
- На RHEL/Fedora параметры ядра по умолчанию живут не только в grub.cfg, а в BLS-записях /boot/loader/entries/*.conf - редактировать их удобнее через grubby, а не руками.
- Secure Boot молча блокирует неподписанное проприетарное ядро или самосборный модуль (NVIDIA) - чёрный экран без внятной ошибки.
- Выполните cat /proc/cmdline и запишите, с какими параметрами загрузилось ваше ядро. Найдите root= и определите, по UUID или по имени устройства монтируется корень.
- Откройте /etc/default/grub, добавьте в GRUB_CMDLINE_LINUX параметр заведомо безвредный (например systemd.show_status=1), пересоберите конфиг командой своего дистрибутива и перезагрузитесь.
- Убедитесь, что параметр приехал: снова cat /proc/cmdline.
- Сравните вывод dmesg --level=err и journalctl -k -p err -b. Найдите хотя бы одно общее сообщение.
- Запустите systemd-analyze blame и systemd-analyze critical-chain, найдите самую долгую службу старта.
- Включите persistent-журнал (mkdir /var/log/journal, перезагрузка) и проверьте, что journalctl -b -1 теперь показывает прошлую загрузку.
- Чем UEFI отличается от BIOS в части того, откуда и как читается загрузчик? Что такое ESP и где он обычно смонтирован?
- Зачем нужен initramfs, если ядро и так умеет монтировать файловые системы? Приведите случай, когда без него корень не смонтируется.
- Какой процесс получает PID 1 на современной системе и кто его запускает?
- Чем вывод dmesg отличается от journalctl -b? Какой параметр journalctl покажет только сообщения ядра?
- Где на Debian и где на RHEL лежит итоговый конфиг GRUB и какой командой он пересобирается в каждом семействе?
- Какой параметр ядра позволит загрузиться в минимальный shell для сброса забытого пароля root?