Linux: загрузка и systemd
Последовательность загрузки от включения до логина, BIOS против UEFI, unit и target в systemd, диагностика упавшего сервиса через journalctl.
5 вопросов
JuniorТеорияЧастоЧто такое unit в systemd и какие бывают основные типы unit?
Что такое unit в systemd и какие бывают основные типы unit?
systemd — это система инициализации, которую ядро запускает как PID 1; unit — управляемый ею декларативный объект из конфига. Типы: .service (процесс), .target (группа, заменяющая runlevel SysV), .socket (активация по сокету), .timer (как cron). Всеми управляют через systemctl.
Типичные ошибки
- ✗Думать, что unit — это работающий процесс, а не объект, описанный конфигом
- ✗Считать, что systemd управляет только
.service, а не target/socket/timer - ✗Полагать, что runlevel из SysV остались, а не заменены unit-ами
.target
Уточняющие вопросы
- →Чем на практике
.targetотличается от старого runlevel из SysV? - →Что даёт активация по сокету через
.socketunit во время загрузки?
MiddleТеорияЧастоОпишите последовательность загрузки Linux от включения до приглашения входа.
Опишите последовательность загрузки Linux от включения до приглашения входа.
Прошивка (BIOS или UEFI) проходит POST и передаёт управление загрузчику. GRUB грузит ядро и initramfs и передаёт командную строку ядра. Ядро через initramfs монтирует реальный корень, затем запускает PID 1 — systemd — который стартует unit целевого target в порядке зависимостей до входа.
Типичные ошибки
- ✗Пропускать initramfs, считая, что ядро монтирует реальный корень напрямую
- ✗Думать, что PID 1 и сервисы запускает загрузчик, а не ядро
- ✗Считать, что сервисы стартуют произвольно, а не по зависимостям target
Уточняющие вопросы
- →Зачем вообще нужен initramfs, а не вкомпилированные в ядро драйверы?
- →Что обычно задаёт командная строка ядра, переданная GRUB?
JuniorТеорияИногдаВ чём разница между прошивками BIOS и UEFI при загрузке?
В чём разница между прошивками BIOS и UEFI при загрузке?
Обе — прошивки, что запускаются первыми при включении и передают управление загрузчику. Legacy BIOS читает 512-байтный MBR в 16-битном режиме, ограничивая загрузочные диски 2 ТБ. UEFI читает таблицу GPT, грузит .efi-загрузчик с EFI System Partition и умеет включать Secure Boot.
Типичные ошибки
- ✗Путать порядок — считать BIOS более новой, понимающей GPT прошивкой
- ✗Считать, что UEFI по-прежнему грузится из 512-байтного MBR, как BIOS
- ✗Путать Secure Boot с самим различием между BIOS и UEFI
Уточняющие вопросы
- →Почему GPT-диск держит защитный MBR в самом первом секторе?
- →Что лежит на EFI System Partition и какая на нём файловая система?
MiddleДебаггингИногдаСервис работает после ручного запуска, но пропадает после перезагрузки — найдите причину и почините.
Сервис работает после ручного запуска, но пропадает после перезагрузки — найдите причину и почините.
unit в состоянии disabled, поэтому при загрузке его ничто не подхватило — start запустил его лишь на ту сессию. start запускает сейчас, но не переживает перезагрузку; enable создаёт симлинк WantedBy для автозапуска, но не сейчас. Пустой journalctl -b показывает: он не стартовал. Фикс: systemctl enable --now myapp.
Типичные ошибки
- ✗Путать
start(запустить сейчас) сenable(запускать при загрузке) - ✗Перезапускать
startпосле каждой загрузки вместо однократного enable - ✗Читать пустой
journalctl -bкак падение, а не как «не стартовал»
Уточняющие вопросы
- →Какой симлинк создаёт
systemctl enableи в каком каталоге? - →Чем
maskedunit отличается от простоdisabled?
MiddleКодИногдаДопишите systemd-unit сервиса, который перезапускает демон при сбое.
Допишите systemd-unit сервиса, который перезапускает демон при сбое.
В [Service] добавьте Restart=on-failure, чтобы systemd перезапускал демон при сбое, плюс RestartSec=5. В [Install] добавьте WantedBy=multi-user.target, чтобы enable связал unit с этим target загрузки. Затем выполните systemctl enable --now myapp: enable включает автозапуск, --now запускает сейчас.
Типичные ошибки
- ✗Класть
RestartилиWantedByне в ту секцию unit - ✗Думать, что одного
systemctl startхватает, чтобы unit пережил перезагрузку - ✗Опустить
[Install] WantedBy, и тогдаenableнекуда связать unit
Уточняющие вопросы
- →Что делает
systemctl daemon-reloadпосле правки файла unit? - →Чем
Restart=on-failureотличается отRestart=always?