Ядро

Загрузка

Ядро — сердце системы: программа, которая работает с железом напрямую и даёт всем остальным программам единый интерфейс к нему. Ядро загружается загрузчиком (GRUB 2), само инициализирует оборудование и запускает первый пользовательский процесс — systemd.

Всё, что видно дальше — окна, службы, команды в терминале — работает «через ядро». Оно планирует процессы, управляет памятью, файловыми системами, сетью и устройствами.

Что ядро делает при загрузке

  1. Распаковывается в память (образ ядра сжатый) и получает от загрузчика командную строку.
  2. Настраивает память и процессор — страницы, таблицы, прерывания.
  3. Распаковывает initramfs во временную файловую систему и запускает оттуда /init.
  4. Загружает драйверы — из initramfs и из модулей на диске.
  5. Монтирует корневую файловую систему и делает её настоящим корнем (switch_root).
  6. Запускает первый процесс — systemd (он получает PID 1). С этого момента есть пространство пользователя.

Всё, что ядро делает до шага 6, называется ранней загрузкой: если что-то не так, система не дойдёт до логина.

Откуда берутся параметры ядра

Командную строку ядра задаёт загрузчик. В GRUB это строка linux:

grub> linux /boot/vmlinuz-6.1.0-13-amd64 root=UUID=1a2b… ro quiet splash

Постоянные параметры — в /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

Посмотреть, с чем ядро загрузилось сейчас:

cat /proc/cmdline

Правило безопасности: любые эксперименты с параметрами делайте при загрузке (в меню GRUB нажмите e, поправьте строку linux, затем Ctrl+X). Тогда эксперимент разовый, и испортить систему нечем.

Варианты запуска: что попробовать

Ниже — варианты, которые можно задать в строке linux при загрузке. После каждого смотрите, что изменилось.

1. Тихий запуск (обычный)

quiet splash

quiet убирает сообщения ядра, splash включает заставку (Splash). Так грузится большинство дистрибутивов: пользователь видит логотип, а не текст.

2. Подробный запуск

Уберите quiet и добавьте:

loglevel=7 ignore_loglevel plymouth.enable=0

Что увидите: вместо логотипа — поток сообщений ядра о каждом устройстве и драйвере. loglevel=7 включает уровень отладки, ignore_loglevel заставляет печатать всё, plymouth.enable=0 отключает заставку, чтобы она не закрывала текст.

Ещё подробнее:

initcall_debug debug earlyprintk=serial,ttyS0,115200

initcall_debug печатает время каждой инициализации (видно, на каком драйвере система «задумывается»), earlyprintk выводит сообщения на последовательный порт — это спасает, когда видео ещё не работает.

3. Аварийные режимы

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

single

Однопользовательский режим: система доводит загрузку до минимума и даёт оболочку. В systemd single — псевдоним rescue.target.

systemd.unit=rescue.target

То же явно: корень смонтирован на запись, подняты базовые службы, сети и графики нет.

systemd.unit=emergency.target

Ещё минимальнее: корень смонтирован только для чтения, служб нет вовсе. Оболочка — единственное, что работает.

init=/bin/bash

Ядро запускает bash вместо systemd, то есть как процесс с PID 1. Оболочка без служб и без логина; корень смонтирован так, как указано в root=. Полезно, чтобы поправить конфиг:

mount -o remount,rw /
# ... правки ...
exec /sbin/init

Без remount,rw записать ничего не получится — корень при ro только для чтения.

rd.break

Остановка внутри initramfs, до перехода на настоящий корень (в dracut; в Debian у initramfs-tools — break=premount). Настоящий корень при этом лежит в /sysroot:

mount -o remount,rw /sysroot
chroot /sysroot
# ... правки ...
exit
exit

Первый exit выходит из chroot, второй — продолжает загрузку.

4. Другой корень

root=UUID=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
root=/dev/sda2
rootfstype=ext4

root= — корневая файловая система для ядра. Надёжнее указывать UUID: имена дисков могут поменяться. rootfstype= задаёт файловую систему явно (нужно, если ядро её не угадало).

5. Переключатели железа

Параметр Что делает Когда нужен
nomodeset не загружать драйвер режимов видео чёрный экран после загрузки (часто с NVIDIA)
acpi=off отключить ACPI диагностика, если загрузка падает из-за ACPI
noapic, nolapic отключить APIC старые/проблемные платы
maxcpus=1 использовать одно ядро CPU диагностика проблем с многоядерностью
mem=1G ограничить память до 1 ГБ проверка поведения при нехватке памяти
mitigations=off отключить защиты от Spectre/Meltdown ускорение (снижает безопасность)
noresume не пытаться выйти из гибернации зависание на «resume»
fsck.mode=force принудительная проверка ФС подозрение на повреждение

Сценарии сбоя: воспроизвести и понять

Все сценарии безопасны, если менять параметры при загрузке (в GRUB по e) — после перезагрузки всё вернётся.

Сценарий 1. Неверный корень

Укажите в строке linux заведомо неправильный корень:

root=/dev/sda99

Что будет: ядро дойдёт до поиска корня и остановится с сообщением

VFS: Cannot open root device "sda99" or unknown-block(0,0)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

Почему: ядру нечем смонтировать корень — такого устройства нет.

Как починить: перезагрузиться и указать правильный корень. Узнать его заранее можно из системы: blkid или lsblk -f — там UUID и типы файловых систем.

Сценарий 2. Опечатка в init=

init=/bin/bashh

Что будет:

Kernel panic - not syncing: No working init found. Try passing init= option to kernel.

Почему: ядро обязано запустить процесс с PID 1, а такого файла нет. Это, кстати, хороший способ понять, что «ядро загрузилось, но система не поднялась» — ядро здесь работает, проблема только в последнем шаге.

Как починить: убрать параметр init= (или указать верный путь).

Сценарий 3. Нет драйвера диска

Заблокируйте драйвер, через который подключён ваш диск (в примере — ahci для SATA; у NVMe это nvme):

modprobe.blacklist=ahci

Что будет: сообщение такое же, как в первом сценарии (Unable to mount root fs) — устройство просто не появилось, и ядру нечего монтировать.

Почему это важно понять: та же ошибка бывает по трём разным причинам — неверный root=, отсутствующий драйвер, повреждённая файловая система. Отличить их помогает подробный запуск: если в логе нет сообщений о диске — драйвер не загрузился; если диск виден, но корень не монтируется — дело в root= или в самой ФС.

Как починить: убрать параметр. Если диск не находится без блокировки — значит, драйвера нет в initramfs: его добавляют в конфиг initramfs и пересобирают (update-initramfs -u, dracut -f, mkinitcpio -P).

Делайте это в виртуальной машине: на реальном компьютере легко остаться без загрузки.

Сценарий 4. Система грузится, но «висит» чёрный экран

Добавьте quiet и уберите nomodeset (или наоборот — на проблемной видеокарте):

quiet

Что будет: система загружается, но на экране ничего не происходит — похоже на зависание. На самом деле ядро работает, а видео не выводится.

Почему: драйвер режимов видео (KMS) не смог настроить видеокарту. Это типичная проблема проприетарных драйверов NVIDIA.

Как починить: загрузиться с nomodeset — тогда ядро не трогает видеорежимы, и появляется обычный текстовый вывод. Затем установить/починить драйвер видео.

Сценарий 5. Ограничение памяти

mem=1G

Что будет: система загрузится, но увидит только 1 ГБ:

free -h

Часть служб может не подняться из-за нехватки памяти. Так проверяют, как система ведёт себя при малом объёме, и воспроизводят нехватку памяти без реального железа.

Как починить: убрать параметр.

Сценарий 6. Одно ядро процессора

maxcpus=1

Что будет: nproc покажет 1, система станет заметно медленнее. Так проверяют, не связана ли проблема с многоядерностью.

Как починить: убрать параметр.

Сценарий 7. Аварийный режим вместо обычной загрузки

systemd.unit=emergency.target

Что будет: вместо логина — приглашение оболочки. Сети нет, графики нет, корень только для чтения. Дальше:

mount -o remount,rw /
# починили, что мешало
systemctl default

systemctl default продолжает загрузку в обычный режим.

Зачем: так чинят сломанный fstab, «упавшую» службу, забытый пароль — не загружаясь в обычную систему.

Что смотреть после загрузки

# с какими параметрами загрузились
cat /proc/cmdline

# сообщения ядра текущей загрузки
sudo journalctl -k -b

# то же, но с фильтром по устройству
sudo journalctl -k -b | grep -i nvme

# сколько памяти и процессоров видит система
free -h
nproc

# какие диски и файловые системы есть
lsblk -f
sudo blkid

# что и сколько грузилось
systemd-analyze blame

Как задать параметры навсегда

В /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

затем:

sudo update-grub

Подробности — в статье GRUB 2.

Что запомнить

  • Ядро — первое, что запускается после загрузчика; оно инициализирует железо и запускает systemd.
  • Параметры ядра задаёт загрузчик; текущие видны в /proc/cmdline.
  • Экспериментируйте в меню GRUB по e — тогда правка действует одну загрузку и ничего не ломает.
  • Одна и та же ошибка Unable to mount root fs бывает от неверного root=, отсутствующего драйвера и повреждённой ФС — различать помогает подробный лог.
  • Аварийные режимы (single, emergency.target, init=/bin/bash, rd.break) — это инструменты починки, а не «сломанная загрузка».

Смотрите также

  • Загрузка — весь процесс по шагам
  • GRUB 2 — как задать параметры и загрузить ядро вручную
  • Initramfs — драйверы и утилиты, с которыми ядро доходит до корня
  • SystemD — что ядро запускает первым
  • Splash — заставка, которая прячет сообщения ядра
Оценка статьи 0

Комментарии

Пока комментариев нет.