Ядро
Ядро — сердце системы: программа, которая работает с железом напрямую и даёт всем остальным программам единый интерфейс к нему. Ядро загружается загрузчиком (GRUB 2), само инициализирует оборудование и запускает первый пользовательский процесс — systemd.
Всё, что видно дальше — окна, службы, команды в терминале — работает «через ядро». Оно планирует процессы, управляет памятью, файловыми системами, сетью и устройствами.
Что ядро делает при загрузке
- Распаковывается в память (образ ядра сжатый) и получает от загрузчика командную строку.
- Настраивает память и процессор — страницы, таблицы, прерывания.
- Распаковывает initramfs во временную файловую систему и запускает оттуда
/init. - Загружает драйверы — из initramfs и из модулей на диске.
- Монтирует корневую файловую систему и делает её настоящим корнем (
switch_root). - Запускает первый процесс —
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) — это инструменты починки, а не «сломанная загрузка».
Комментарии
Пока комментариев нет.