Управление загрузкой

Процедура загрузки

  • При старте устройства происходит POST (Power-On Self Test), проверяющий работоспособность аппаратных компонентов

  • После этого происходит загрузка BIOS или UEFI в зависимости от системы

  • Независимо от типа загрузки в предыдущей стадии далее загружается GRUB

    • GRUB Bootloader загружает ядро, позволяя через меню при необходимости изменить параметры этой загрузки

  • Ядро загружается вместе с initramfs, который содержит необходимые для пуска системы драйвера

  • После загрузки ядра работу перехватывает systemd, который проходит через две фазы:

    • Старт базовых компонентов (примонтирование девайсов, разделов)

    • Старт сервисов и служб

  • Далее пользователь получает доступ к системе и возможность залогиниться

Grub2 Runtime

  • Runtime - параметры, применяемые только в текущем сеансе, до следующей перезагрузки

  • Из меню Grub2 необходимо нажать "e" для изменения настроек

  • При нажатии "с" совершается переход в командный режим Grub

    • Из командного режима "help" отобразит доступные опции

  • Grub2 по-умолчанию дает возможность выбрать для загрузки три последних ядра

  • Одной из опций является Rescue Kernel - ядро с ограниченном набором модулей, но с максимальной вероятностью безпроблемной загрузки

  • По-умолчанию набор опций следующий:

    • load_video - загрузка видеодрайвера

    • set gfx_payload=keep - режим видео

    • insmod gzio - активация модуля сжатия

    • linux ($root)/<kernel> - ядро для загрузки

    • root=/dev/mapper/rhel-root ro

    • crash/kernel=auto - запись дампа сбоя

    • lvm <volume>

    • rhgb - redhat graphical boot

    • quiet - без вывода информации

    • initrd /dev/initram<name>.img - initram образ

Grub2 Persistent

  • Persistent - настройки, которые сохраняются при перезагрузке

  • Данные параметры настраиваются в /etc/default/grub

  • После внесения изменений в настройки необходимо пересобрать grub.cfg

    • grub2-mkconfig -o /boot/grub2/grub.cfg для BIOS систем

    • grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg для EFI систем

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

Systemd таргеты

  • Таргет systemd - группа файлов инициализации загрузки

  • Часть трагетов - изолируемые (isolatable), они определяют конечное состояние, в котором загружается система

    • emergency.target - для загрузки минимального набора сервисов, используется для отладки проблем

    • rescue.target - также ограниченный набор сервисов, но с большим их числом

    • multi-user.target - обынчый запуск без графики

    • graphical.target - обычный запуск с графикой

  • При активации юнита, он добавляется к определенному таргету

[root@centos8 ~]# systemctl disable dhcpd
Removed /etc/systemd/system/multi-user.target.wants/dhcpd.service.
[root@centos8 ~]# systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
  • Параметры самого таргета можно посмотреть через systemctl

[root@centos8 ~]# systemctl cat multi-user.target
# /usr/lib/systemd/system/multi-user.target
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
  • Все сервисы, которые привязаны к таргету отображаются как симлинки в /etc/systemd/system/<name>.target

[root@centos8 ~]# ls -l /etc/systemd/system/multi-user.target.wants
total 0
lrwxrwxrwx. 1 root root 35 Jan  7 12:28 atd.service -> /usr/lib/systemd/system/atd.service
lrwxrwxrwx. 1 root root 38 Jan  7 12:27 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 44 Jan  7 12:28 avahi-daemon.service -> /usr/lib/systemd/system/avahi-daemon.service
lrwxrwxrwx. 1 root root 39 Jan  7 12:26 chronyd.service -> /usr/lib/systemd/system/chronyd.service
lrwxrwxrwx. 1 root root 37 Jan  7 12:26 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 33 Jan  7 12:27 cups.path -> /usr/lib/systemd/system/cups.path
lrwxrwxrwx. 1 root root 37 Mar 20 22:12 dhcpd.service -> /usr/lib/systemd/system/dhcpd.service
lrwxrwxrwx. 1 root root 43 Jan  7 12:27 dnf-makecache.timer -> /usr/lib/systemd/system/dnf-makecache.timer
lrwxrwxrwx. 1 root root 38 Feb 17 23:23 docker.service -> /usr/lib/systemd/system/docker.service
lrwxrwxrwx. 1 root root 41 Jan  7 12:28 firewalld.service -> /usr/lib/systemd/system/firewalld.service
lrwxrwxrwx. 1 root root 42 Jan  7 12:28 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 37 Jan  7 12:27 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 35 Jan  7 12:26 ksm.service -> /usr/lib/systemd/system/ksm.service
lrwxrwxrwx. 1 root root 40 Jan  7 12:26 ksmtuned.service -> /usr/lib/systemd/system/ksmtuned.service
lrwxrwxrwx. 1 root root 46 Jan  7 12:26 libstoragemgmt.service -> /usr/lib/systemd/system/libstoragemgmt.service
  • Зависимости таргетов доступны в systemctl list-dependencies

[root@centos8 ~]# systemctl list-dependencies
default.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─rtkit-daemon.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
●   ├─atd.service
●   ├─auditd.service
●   ├─avahi-daemon.service
●   ├─chronyd.service
●   ├─crond.service
●   ├─cups.path
<...>
●   ├─vdo.service
●   ├─vmtoolsd.service
●   ├─basic.target
●   │ ├─-.mount
●   │ ├─microcode.service
●   │ ├─paths.target
●   │ ├─slices.target
●   │ │ ├─-.slice
●   │ │ └─system.slice
●   │ ├─sockets.target
●   │ │ ├─avahi-daemon.socket
●   │ │ ├─cockpit.socket
●   │ │ ├─cups.socket
●   │ │ ├─dbus.socket
●   │ │ ├─dm-event.socket
●   │ │ ├─iscsid.socket

Настройка Default таргета

  • systemctl get-default отображает текущий таргет по-умолчанию

[root@centos8 ~]# systemctl get-default 
graphical.target
  • systemctl set-default устанавливает таргет по-умолчанию

  • systemctl start graphical.target - загрузит GUI

  • Загрузка в нужный таргет:

    • В grub2 использовать systemctl.unit=<name>.target в параметрах загрузки

    • В текущей системе systemctl isolate <name>.target

Last updated