Запуск системи¶
У цьому розділі ви дізнаєтесь, як запускається система.
Цілі: у цьому розділі майбутні адміністратори Linux дізнаються про:
Різні етапи процесу завантаження;
Як Rocky Linux підтримує це завантаження через GRUB2 і systemd;
Як захистити GRUB2 від атаки;
Як керувати послугами;
Як отримати доступ до журналів з journald
.
користувачі
Знання:
Складність:
Час читання: 20 хвилин
Процес завантаження¶
Важливо розуміти процес завантаження Linux, щоб мати можливість вирішити проблеми, які можуть виникнути.
Процес завантаження включає:
Запуск BIOS¶
BIOS (базова система вводу/виводу) виконує POST (самотестування при включенні), щоб виявити, протестувати та ініціалізувати апаратні компоненти системи.
Потім завантажується MBR (головний завантажувальний запис).
Головний завантажувальний запис (MBR)¶
Головний завантажувальний запис — це перші 512 байт завантажувального диска. MBR виявляє завантажувальний пристрій і завантажує bootloader GRUB2 у пам'ять і передає йому керування.
Наступні 64 байти містять таблицю розділів диска.
GRUB2 bootloader¶
Bootloader за умовчанням для дистрибутива Rocky 8 є GRUB2 (GRand Unified Bootloader). GRUB2 замінює старий завантажувач GRUB (також званий GRUB legacy).
Файл конфігурації GRUB 2 знаходиться під /boot/grub2/grub.cfg
, але цей файл не слід редагувати безпосередньо.
Налаштування конфігурації меню GRUB2 розташовано в /etc/default/grub
і використовуються для створення файлу grub.cfg
.
# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
Якщо внесено зміни до одного чи кількох із цих параметрів, необхідно запустити команду grub2-mkconfig
, щоб повторно створити файл /boot/grub2/grub.cfg
.
[root] # grub2-mkconfig –o /boot/grub2/grub.cfg
- GRUB2 шукає стислий образ ядра (файл
vmlinuz
) у каталозі/boot
. - GRUB2 завантажує образ ядра в пам’ять і витягує вміст файлу зображення
initramfs
у тимчасову папку в пам’яті за допомогою файлової системиtmpfs
.
Ядро¶
Ядро запускає процес systemd
з PID 1.
root 1 0 0 02:10 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
systemd
¶
Systemd є батьківським для всіх системних процесів. Він зчитує посилання target-a /etc/systemd/system/default.target
(наприклад, /usr/lib/systemd/system/multi-user.target
) для визначення target системи за замовчуванням. Файл визначає служби, які потрібно запустити.
Потім Systemd переводить систему в стан target-defined, виконуючи наступні завдання ініціалізації:
- Встановлення назви машини
- Ініціалізація мережі
- Ініціалізація SELinux
- Відображення банера привітання
- Ініціалізація апаратного забезпечення на основі аргументів, наданих ядру під час завантаження
- Монтування файлових систем, включаючи віртуальні файлові системи, такі як /proc
- Очищення каталогу в /var
- Запуск віртуальної пам'яті (swap)
Захист завантажувача GRUB2¶
Навіщо захищати завантажувач паролем?
- Запобігання доступу до режиму одного користувача - якщо зловмисник може завантажитися в режимі одного користувача, він стає користувачем root.
- Заборонити доступ до консолі GRUB. Якщо зловмиснику вдається скористатися консоллю GRUB, він може змінити її конфігурацію або зібрати інформацію про систему за допомогою команди
cat
. - Запобігання доступу до незахищених операційних систем. Якщо в системі є подвійне завантаження, зловмисник може вибрати під час завантаження операційну систему, наприклад DOS, яка ігнорує елементи керування доступом і дозволи на файли.
Щоб захистити паролем завантажувач GRUB2:
-
Видаліть
-unrestricted
з основного оператораCLASS=
у файлі/etc/grub.d/10_linux
. -
Якщо користувача ще не налаштовано, скористайтеся командою
grub2-setpassword
, щоб надати пароль для користувача root:
# grub2-setpassword
Буде створено файл /boot/grub2/user.cfg
, якщо його ще немає. Він містить хешований пароль GRUB2.
Примітка
Ця команда підтримує конфігурації лише з одним користувачем root.
[root]# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.CC6F56....A21
- Повторно створіть файл конфігурації за допомогою команди
grub2-mkconfig
:
[root]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f9725b0c842348ce9e0bc81968cf7181
Found initrd image: /boot/initramfs-0-rescue-f9725b0c842348ce9e0bc81968cf7181.img
done
- Перезапустіть сервер і перевірте.
Усі записи, визначені в меню GRUB, тепер вимагатимуть введення користувача та пароля під час кожного завантаження. Система не завантажить ядро без безпосереднього втручання користувача з консолі.
- Коли запитується користувач, введіть
root
; - Коли запитується пароль, введіть пароль, наданий у команді
grub2-setpassword
.
Щоб захистити лише редагування пунктів меню GRUB і доступ до консолі, достатньо виконати команду grub2-setpassword
. Можуть бути випадки, коли у вас є вагомі причини робити лише це. Це може бути особливо вірним у віддаленому центрі обробки даних, де введення пароля під час кожного перезавантаження сервера або важко, або неможливо.
Systemd¶
Systemd — це менеджер служб для операційних систем Linux.
Він розроблений для:
- сумісництва зі старими сценаріями ініціалізації SysV,
- забезпечення багатьох функцій, наприклад, паралельний запуск системних служб під час запуску системи, активацію демонів на вимогу, підтримку моментальних знімків або керування залежностями між службами.
Примітка
Systemd є системою ініціалізації за замовчуванням, починаючи з RedHat/CentOS 7.
Systemd представляє концепцію системних одиниць.
Тип | Розширення файлу | Функціональність |
---|---|---|
Service unit | .service |
Системний сервіс |
Target unit | .target |
Група системних одиниць |
Mount unit | .automount |
Автоматична точка монтування файлової системи |
Важливо
Існує багато типів юнітів (units): Device unit, Mount unit, Path unit, Scope unit, Slice unit, Snapshot unit, Socket unit, Swap unit, Timer unit.
-
Systemd підтримує знімки стану системи та відновлення.
-
Точки монтування можна налаштувати як systemd targets.
-
Під час запуску systemd створює сокети прослуховування для всіх системних служб, які підтримують цей тип активації, і передає ці сокети цим службам, щойно вони запускаються. Це дає змогу перезапустити службу, не втрачаючи жодного повідомлення, надісланого до неї мережею під час її недоступності. Відповідний сокет залишається доступним, а всі повідомлення ставляться в чергу.
-
Системні служби, які використовують D-BUS для зв’язку між процесами, можуть бути запущені на вимогу під час першого використання клієнтом.
-
Systemd зупиняє або перезапускає лише запущені служби. Попередні версії (до RHEL7) намагалися зупинити служби напряму, не перевіряючи їх поточний статус.
-
Системні служби не успадковують жодного контексту (наприклад, змінні середовища HOME та PATH). Кожна служба працює у власному контексті виконання.
Для всіх операцій сервісного блоку встановлено тайм-аут за замовчуванням у 5 хвилин, щоб запобігти зависанню системи через несправну службу.
Управління системними службами¶
Службові блоки закінчуються розширенням файлу .service
і мають подібне призначення до сценаріїв ініціалізації. Команда systemctl
використовується для системних служб display
, start
, stop
, restart
:
systemctl | Опис |
---|---|
systemctl start name.service | Запускає службу |
systemctl stop name.service | Зупиняє служби |
systemctl restart name.service | Перезапускає службу |
systemctl reload name.service | Перезавантажує конфігурації |
systemctl status name.service | Перевіряє, чи працює служба |
systemctl try-restart name.service | Перезапускає служби, лише якщо вона запущена |
systemctl list-units --type service --all | Відображає стан всіх послуг |
Команда systemctl
також використовується для ввімкнення (enable)
або вимкнення (disable)
системної служби та відображення пов’язаних служб:
systemctl | Опис |
---|---|
systemctl enable name.service | Активує послуги |
systemctl disable name.service | Вимикає служби |
systemctl list-unit-files --type service | Перелічує всі служби та перевіряє, чи вони запущені |
systemctl list-dependencies --after | Перелічує служби, які починаються перед вказаним unit'om |
systemctl list-dependencies --before | Перелічує служби, які починаються після вказаного unit'a |
Приклади:
systemctl stop nfs-server.service
# or
systemctl stop nfs-server
Щоб отримати список усіх завантажених юнітів:
systemctl list-units --type service
Для перегляду списку усіх юнітів, щоб перевірити, чи вони активовані:
systemctl list-unit-files --type service
systemctl enable httpd.service
systemctl disable bluetooth.service
Приклад файлу .service для служби postfix¶
postfix.service Unit File
Нижче наведено вміст файлу блоку /usr/lib/systemd/system/postfix.service, який зараз надається пакетом postfix:
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
Використання системних таргетів (targets)¶
У Rocky8/RHEL8 концепцію рівнів запуску було замінено таргетами Systemd.
Таргети Systemd представлені target units. Target units закінчуються розширенням файлу .target
і їхня єдина мета — групувати інші блоки Systemd у ланцюжок залежностей.
Наприклад, модуль graphical.target
, який використовується для запуску графічного сеансу, запускає системні служби, такі як менеджер відображення GNOME (gdm.service
) або сервіс облікових записів (accounts-daemon.service
), а також активує блок multi-user.target
.
Так само модуль multi-user.target
запускає інші важливі системні служби, такі як NetworkManager (NetworkManager.service
) або D- Bus (dbus.service
) і активує іншу target unit під назвою basic.target
.
Target Units | Опис |
---|---|
poweroff.target | Закриває систему та вимикає її |
rescue.target | Активує аварійну оболонку (rescue shell) |
multi-user.target | Активує багатокористувацьку систему без графічного інтерфейсу |
graphical.target | Активує багатокористувацьку систему з графічним інтерфейсом |
reboot.target | Вимикає та перезавантажує систему |
Target за умовчанням¶
Щоб визначити, який target використовується за замовчуванням:
systemctl get-default
Ця команда шукає target символічного посилання, розташованого за адресою /etc/systemd/system/default.target
, і відображає результат.
$ systemctl get-default
graphical.target
Команда systemctl
також може надати список доступних таргетів:
systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Encrypted Volumes
getty.target loaded active active Login Prompts
graphical.target loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target loaded active active Paths
remote-fs.target loaded active active Remote File Systems
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
timers.target loaded active active Timers
Щоб налаштувати систему на використання іншого таргету за замовчуванням:
systemctl set-default name.target
Приклад:
# systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
Щоб переключитися на інший target unit в поточному сеансі:
systemctl isolate name.target
Режим відновлення забезпечує просте середовище для відновлення вашої системи у випадках, коли неможливо виконати нормальний процес завантаження.
У режимі відновлення
система намагається змонтувати всі локальні файлові системи та запустити кілька важливих системних служб, але не вмикає мережевий інтерфейс і не дозволяє іншим користувачам підключатися до системи одночасно.
У Rocky 8 режим порятунку
еквівалентний старому режиму одного користувача
та потребує пароля root.
Щоб змінити поточний target і перейти в режим відновлення
в поточному сеансі:
systemctl rescue
Аварійний режим забезпечує максимально мінімалістичне середовище та дозволяє відремонтувати систему навіть у ситуаціях, коли система не може перейти в режим відновлення. В аварійному режимі система монтує кореневу файлову систему лише для читання. Він не намагатиметься змонтувати будь-яку іншу локальну файлову систему, не активуватиме жодного мережевого інтерфейсу та запустить деякі важливі служби.
Щоб змінити поточний target і перейти в екстрений режим у поточному сеансі:
systemctl emergency
Вимкнення, призупинення та сплячий режим¶
Команда systemctl
замінює кілька команд керування живленням, які використовувалися в попередніх версіях:
Стара команда | Нова команда | Опис |
---|---|---|
halt |
systemctl halt |
Призупиняє систему. |
poweroff |
systemctl poweroff |
Вимикає систему. |
reboot |
systemctl reboot |
Перезавантажує систему. |
pm-suspend |
systemctl suspend |
Призупиняє систему. |
pm-hibernate |
systemctl hibernate |
Переводить систему в сплячий режим. |
pm-suspend-hybrid |
systemctl hybrid-sleep |
Переходить у сплячий режим і призупиняє систему. |
Процес journald
¶
Окрім rsyslogd
, файлами журналу також може керувати демон journald
, який є компонентом systemd
.
Демон journald
фіксує повідомлення системного журналу, повідомлення журналу ядра, повідомлення з початкового диска RAM і від початку завантаження, а також повідомлення, записані в стандартний вивід і стандартний вивід помилок усіх служб, а потім індексує їх і робить доступними для користувача.
Формат власного файлу журналу, який є структурованим і проіндексованим двійковим файлом, покращує пошук і забезпечує швидшу роботу, він також зберігає метадані, такі як мітки часу або ідентифікатори користувачів.
Команда journalctl
¶
Команда journalctl
відображає файли журналу.
journalctl
Команда містить список усіх файлів журналу, згенерованих у системі. Структура цього виводу подібна до тієї, що використовується в /var/log/messages/
, але пропонує деякі покращення:
- пріоритет записів позначається візуально;
- часові позначки перетворюються на місцевий часовий пояс вашої системи;
- відображаються всі зареєстровані дані, включаючи журнали, що обертаються;
- початок старту позначається спеціальною лінією.
Використання безперервного відображення¶
При постійному відображенні повідомлення журналу відображаються в режимі реального часу.
journalctl -f
Ця команда повертає список із десяти останніх рядків журналу. Потім утиліта journalctl продовжує працювати та чекає нових змін, перш ніж негайно їх відобразити.
Фільтрування повідомлень¶
Можна використовувати різні методи фільтрації для отримання інформації, яка відповідає різним потребам. Повідомлення журналу часто використовуються для відстеження помилкової поведінки в системі. Щоб переглянути записи з вибраним або вищим пріоритетом:
journalctl -p priority
Необхідно замінити пріоритет одним із таких ключових слів (або числом):
- debug (7),
- info (6),
- notice (5),
- warning (4),
- err (3),
- crit (2),
- alert (1),
- emerg (0).