101.3 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
101 Архітектура системи |
Тема: |
101.3 Перемикання рівнів виконання / варіанти завантаження, вимкнення та перезавантаження системи |
Урок: |
1 з 1 |
Вступ
Загальною рисою операційних систем, які дотримуються принципів проектування Unix, є використання окремих процесів для керування різними функціями системи. Ці процеси називаються демонами (або, ширше, службами) і відповідають за розширені функції, що лежать в основі операційної системи, такі як служби мережевих застосунків (HTTP-сервер, спільний доступ до файлів, електронна пошта тощо), бази даних, конфігурація на вимогу тощо. Хоча Linux використовує монолітне ядро, багато низькорівневих аспектів операційної системи піддаються впливу демонів, такі як балансування навантаження та конфігурація міжмережного екрану.
Які демони мають бути активними, залежить від призначення системи. Набір активних демонів також слід змінювати під час виконання, щоб служби можна було запускати та зупиняти без перезавантаження всієї системи. Щоб вирішити цю проблему, кожен базовий дистрибутив Linux пропонує певну форму утиліти керування службами для контролю системою.
Службами можна керувати за допомогою сценаріїв оболонки або програми та допоміжних файлів конфігурації. Перший метод реалізований стандартом SysVinit, також відомим як System V або просто SysV. Другий метод реалізований systemd та Upstart. Історично, менеджери служб на базі SysV найчастіше використовувалися в дистрибутивах Linux. Сьогодні менеджери служб на основі systemd частіше зустрічаються в більшості дистрибутивів Linux. Менеджер служб — це перша програма, яка запускається ядром під час процесу завантаження, тому його PID (ідентифікаційний номер процесу) завжди дорівнює 1
.
SysVinit
Менеджер сервісів, заснований на стандарті SysVinit, надасть попередньо визначені набори станів системи, які називаються рівнями виконання (runlevels), та відповідні файли сценаріїв служби, які потрібно виконати. Рівні виконання нумеруються від 0
до 6
і зазвичай призначаються для наступних цілей:
- Рівень виконання 0
-
Вимкнення системи.
- Рівень виконання 1, s або single
-
Однокористувацький режим, без мережних та інших необхідних можливостей (режим обслуговування).
- Рівень виконання 2, 3 або 4
-
Багатокористувацький режим. Користувачі можуть входити до системи за допомогою консолі або мережі. Рівні виконання 2 і 4 не часто використовуються.
- Рівень виконання 5
-
Багатокористувацький режим. Має всі функції рівня 3, плюс можливість роботи у графічному режимі.
- Рівень виконання 6
-
Перезавантаження системи.
Програма /sbin/init
відповідальна за керування рівнями виконання та пов’язаними демонами/ресурсами. Під час ініціалізації системи програма init
визначає потрібний рівень виконання, визначений параметром ядра або у файлі /etc/inittab
, і завантажує пов’язані сценарії, перераховані там для даного рівня виконання. Кожен рівень виконання може мати багато пов’язаних службових файлів, зазвичай сценаріїв у каталозі /etc/init.d/
. Оскільки не всі рівні виконання є еквівалентними для різних дистрибутивів Linux, короткий опис призначення рівнів виконання також можна знайти в дистрибутивах на основі SysV.
Синтаксис файлу /etc/inittab
використовує такий формат:
id:runlevels:action:process
id
– це загальне ім’я довжиною до чотирьох символів, яке використовується для ідентифікації запису. Запис runlevels
— це список номерів рівнів виконання, для яких слід виконати вказану дію. Термін дія
визначає, як init
виконуватиме процес, зазначений терміном процес
. Доступні дії:
boot
-
Процес буде виконуватися під час ініціалізації системи. Поле
runlevels
ігнорується. bootwait
-
Процес буде виконано під час ініціалізації системи, і
init
буде чекати, поки він завершиться, щоб продовжити. Полеrunlevels
ігнорується. sysinit
-
Процес буде виконано після ініціалізації системи, незалежно від рівня виконання. Поле
runlevels
ігнорується. wait
-
Процес буде виконано для заданих рівнів виконання, і
init
буде чекати, поки він закінчиться, щоб продовжити. respawn
-
Процес буде перезапущений, якщо його зупинити.
ctrlaltdel
-
Процес буде виконано, коли процес ініціалізації отримає сигнал
SIGINT
, який запускається при натисканні комбінації клавіш Ctrl+Alt+Del.
Рівень виконання за замовчуванням — це рівень, який буде обрано, якщо жодного іншого не вказано як параметр ядра — також визначається в /etc/inittab
у записі id:x:initdefault
. x
- це номер рівня виконання за замовчуванням. Це число ніколи не повинно бути 0
або 6
, оскільки це призведе до вимкнення або перезавантаження системи одразу після завершення процесу її завантаження. Типовий файл /etc/inittab
показаний нижче:
# Default runlevel id:3:initdefault: # Configuration script executed during boot si::sysinit:/etc/init.d/rcS # Action taken on runlevel S (single user) ~:S:wait:/sbin/sulogin # Configuration for each execution level l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Action taken upon ctrl+alt+del keystroke ca::ctrlaltdel:/sbin/shutdown -r now # Enable consoles for runlevels 2 and 3 1:23:respawn:/sbin/getty tty1 VC linux 2:23:respawn:/sbin/getty tty2 VC linux 3:23:respawn:/sbin/getty tty3 VC linux 4:23:respawn:/sbin/getty tty4 VC linux # For runlevel 3, also enable serial # terminals ttyS0 and ttyS1 (modem) consoles S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320 S1:3:respawn:/sbin/mgetty -x0 -D ttyS1
Команду telinit q
слід виконувати щоразу після зміни файлу /etc/inittab
. Параметр q
(або Q
) повідомляє init перезавантажити свою конфігурацію. Такий крок важливий, щоб уникнути зупинки системи через неправильну конфігурацію в /etc/inittab
.
Скрипти, які використовує init
для налаштування кожного рівня виконання, зберігаються в каталозі /etc/init.d/
. Кожен рівень виконання має пов’язаний каталог у /etc/
, назви яких /etc/rc0.d/
, /etc/rc1.d/
, /etc/rc2.d/
тощо, зі скриптами, які мають виконуватися, коли запускається відповідний рівень виконання. Оскільки один і той самий сценарій може використовуватися різними рівнями виконання, файли в цих каталогах є лише символічними посиланнями на справжні сценарії в /etc/init.d/
. Крім того, перша літера назви файлу посилання в каталозі рівня виконання вказує, чи потрібно запустити службу або припинити роботу для відповідного рівня виконання. Ім’я файлу посилання, яке починається з літери K
, визначає, що служба буде знищена при вході на рівень виконання (kill). Якщо починається з літери S
, служба буде запущена при вході на рівень виконання (start). У каталозі /etc/rc1.d/
, наприклад, буде багато посилань на мережеві сценарії, які починаються з літери K
, враховуючи, що рівень виконання 1 є рівнем запуску для одного користувача, без підключення до мережі.
Команда runlevel
показує поточний рівень запуску для системи. Команда runlevel
показує два значення, перше - попередній рівень виконання, а друге - поточний рівень виконання:
$ runlevel N 3
Літера N
у виведенні показує, що рівень виконання не змінився з моменту останнього завантаження. У прикладі рівень виконання 3
є поточним рівнем запуску системи.
Та сама програма init
може використовуватися для зміни рівнів виконання в запущеній системі без необхідності перезавантаження. Команду telinit
також можна використовувати для перемикання рівнів виконання. Наприклад, команди telinit 1
, telinit s
або telinit S
змінять систему на рівень виконання 1.
systemd
На даний момент systemd використовується доволі широко і представляє набір інструментів для керування системними ресурсами та службами, які systemd називає юнітами (units). Юніт складається з імені, типу та відповідного конфігураційного файлу. Юнітом для серверного процесу httpd (наприклад, веб-сервер Apache) буде httpd.service
у дистрибутивах на основі Red Hat, а його конфігураційний файл також буде називатися httpd.service
(у дистрибутивах на базі Debian цей юніт називається apache2.service
).
Існує сім різних типів юнітів systemd:
service
-
Найпоширеніший тип юніту для активних системних ресурсів, які можна ініціювати, переривати та перезавантажувати.
socket
-
Socket-юніт може бути сокетом файлової системи або мережевим сокетом. Усі socket-юніти мають відповідний service-юніт, який завантажується, коли сокет отримує запит.
device
-
Device-юніт пристрою пов’язаний з апаратним пристроєм, що ідентифікується ядром. Пристрій буде розглядатися як systemd-юніт, лише якщо для нього існує правило udev. Device-юніт можна використовувати для розв’язання залежностей конфігурації при виявленні певного обладнання, враховуючи, що властивості з правила udev можна використовувати як параметри для device-юніту.
mount
-
Mount-юніт — це визначення точки монтування у файловій системі, подібне до запису в
/etc/fstab
. automount
-
Automount-юніт автоматичного монтування також є визначенням точки монтування у файловій системі, але монтується автоматично. Кожен automount-юніт має відповідний mount-юніт, який запускається при зверненні до точки автоматичного монтування.
target
-
Target-юніт — це група інших юнітів, які керуються як єдина одиниця.
snapshot
-
Snapshot-юніт — це збережений стан менеджера systemd (доступний не в кожному дистрибутиві Linux).
Основною командою для керування systemd-юнітами є systemctl
. Команда systemctl
використовується для виконання всіх завдань, що стосуються активації, деактивації, виконання, переривання, моніторингу тощо. Наприклад, для фіктивного юніту під назвою unit.service
найпоширенішими діями systemctl
будуть:
systemctl start unit.service
-
Запускає
юніт
. systemctl stop unit.service
-
Зупиняє
юніт
. systemctl restart unit.service
-
Перезапускає
юніт
. systemctl status unit.service
-
Показує стан
юніту
, включно з тим, чи він запущений. systemctl is-active unit.service
-
Показує active, якщо
юніт
працює, або inactive в іншому випадку. systemctl enable unit.service
-
Вмикає
юніт
, тобтоюніт
буде завантажуватися під час ініціалізації системи. systemctl disable unit.service
-
Юніт
не стартує з системою. systemctl is-enabled unit.service
-
Перевіряє, чи стартує
юніт
із системою. Відповідь зберігається у змінній$?
. Значення0
вказує, щоюніт
стартує з системою, а значення1
вказує, щоюніт
не стартує з системою.
Note
|
Новіші версії systemd фактично виводять стан конфігурації юніту під час завантаження. Наприклад: $ systemctl is-enabled apparmor.service enabled |
Якщо в системі немає інших юнітів з такою ж назвою, то суфікс після крапки можна відкинути. Якщо, наприклад, є просто один юніт httpd
типу service
, то лише httpd
достатньо як одиничний параметр для systemctl
.
Команда systemctl
також може керувати системними цілями. Наприклад, multi-user.target
-юніт об’єднує всі юніти, необхідні для багатокористувацького системного середовища. Він подібний до рівня виконання 3 у системі, яка використовує SysV.
Команда systemctl isolate
визначає різні цілі. Отже, можемо вручну змінити ціль на multi-user
:
# systemctl isolate multi-user.target
Існують відповідні цілі для рівнів запуску SysV, починаючи з runlevel0.target
до runlevel6.target
. Однак systemd не використовує файл /etc/inittab
. Щоб змінити цільову систему за замовчуванням, параметр systemd.unit
можна додати до списку параметрів ядра. Наприклад, щоб використовувати multi-user.target
як стандартну ціль, параметром ядра має бути systemd.unit=multi-user.target
. Усі параметри ядра можна зробити постійними, змінивши конфігурацію завантажувача.
Інший спосіб змінити ціль за замовчуванням – змінити символічне посилання /etc/systemd/system/default.target
, щоб воно вказувало на потрібну ціль. Перевизначення посилання можна зробити самостійно за допомогою команди systemctl
:
# systemctl set-default multi-user.target
Аналогічно, ви можете визначити, яка ціль завантаження вашої системи за замовчуванням за допомогою такої команди:
$ systemctl get-default graphical.target
Подібно до систем, які використовують SysV, цільова мета за замовчуванням ніколи не має вказувати на shutdown.target
, оскільки вона відповідає рівню виконання 0 (вимкнення комп’ютера).
Файли конфігурації, пов’язані з кожним блоком, можна знайти в каталозі /lib/systemd/system/
. Команда systemctl list-unit-files
містить список усіх доступних юнітів і показує, чи ввімкнено їх запуск під час завантаження системи. Параметр --type
вибере лише параметри для заданого типу, такі як systemctl list-unit-files --type=service
і systemctl list-unit-files --type=target
.
Активні юніти або юніти, які були активні протягом поточного системного сеансу, можна вивести за допомогою команди systemctl list-units
. Як і параметр list-unit-files
, команда systemctl list-units --type=service
вибере лише юніти типу service
, а команда systemctl list-units --type=target
вибере лише юніти типу target
.
systemd також відповідає за запуск і реагування на події, пов’язані з живленням. Команда systemctl suspend
переведе систему в режим низького енергоспоживання, зберігаючи поточні дані в пам’яті. Команда systemctl hibernate
скопіює всі дані пам’яті на диск, тому поточний стан системи можна відновити після вимкнення живлення. Дії, пов’язані з такими подіями, визначаються у файлі /etc/systemd/logind.conf
або в окремих файлах всередині каталогу /etc/systemd/logind.conf.d/
. Однак цю функцію systemd можна використовувати лише тоді, коли в системі не запущено інший менеджер живлення, такий як демон acpid
. Демон acpid
є основним менеджером живлення для Linux і дозволяє точніше коригувати дії після подій, пов’язаних із живленням, наприклад, закриття кришки ноутбука, низький рівень заряду акумулятора або рівень заряду акумулятора.
Upstart
Скрипти ініціалізації, які використовує Upstart, знаходяться в каталозі /etc/init/
. Системні служби можна переглянути за допомогою команди initctl list
, яка також показує поточний стан служб і їх номер PID, якщо він доступний.
# initctl list avahi-cups-reload stop/waiting avahi-daemon start/running, process 1123 mountall-net stop/waiting mountnfs-bootclean.sh start/running nmbd start/running, process 3085 passwd stop/waiting rc stop/waiting rsyslog start/running, process 1095 tty4 start/running, process 1761 udev start/running, process 1073 upstart-udev-bridge start/running, process 1066 console-setup stop/waiting irqbalance start/running, process 1842 plymouth-log stop/waiting smbd start/running, process 1457 tty5 start/running, process 1764 failsafe stop/waiting
Кожна дія Upstart має власну незалежну команду. Наприклад, команду start
можна використати для запуску шостого віртуального терміналу:
# start tty6
Поточний стан ресурсу можна перевірити за допомогою команди status
:
# status tty6 tty6 start/running, process 3282
А переривання служби виконується командою stop
:
# stop tty6
Upstart не використовує файл /etc/inittab
для визначення рівнів запуску, але застарілі команди runlevel
і telinit
все ще можна використовувати для перевірки та перемикання рівнів запуску.
Note
|
Upstart був розроблений для дистрибутива Ubuntu Linux, щоб полегшити паралельний запуск процесів. Ubuntu припинила використовувати Upstart з 2015 року, коли перейшла з Upstart на systemd. |
Вимкнення і перезавантаження
Дуже традиційна команда, яка використовується для вимкнення або перезапуску системи, очікувано називається shutdown
. Команда shutdown
додає додаткові функції до процесу вимкнення живлення: вона автоматично сповіщає всіх користувачів, які ввійшли в систему, повідомленнями попередження під час їх сеансів оболонки, і нові входи не допускаються. Команда shutdown
діє як посередник для процедур SysV або systemd, тобто виконує запит, викликаючи відповідну дію в менеджері служб, який працює в системі.
Після виконання shutdown
всі процеси отримують сигнал SIGTERM
, за яким слідує сигнал SIGKILL
, потім система вимикається або змінює свій рівень виконання. За замовчуванням, коли жоден з параметрів -h
або -r
не використовується, система переходить на рівень запуску 1, тобто однокористувацький режим. Щоб змінити параметри за замовчуванням для shutdown
, команду слід виконати з таким синтаксисом:
$ shutdown [option] time [message]
Потрібен лише параметр time
. Параметр time
визначає, коли буде виконана запитувана дія, приймаючи такі формати:
hh:mm
-
Цей формат визначає час виконання у вигляді годин і хвилин.
+m
-
Цей формат визначає, скільки хвилин потрібно чекати перед виконанням.
now
або+0
-
Цей формат визначає негайне виконання.
Параметр message
– це текст попередження, який надсилається всім термінальним сеансам користувачів, які ввійшли в систему.
Реалізація SysV дозволяє обмежити кількість користувачів, які зможуть перезавантажити комп’ютер, натиснувши Ctrl+Alt+Del. Це можливо, якщо встановити параметр -a
для команди shutdown
у рядку, що стосується ctrlaltdel
файлу в /etc/inittab
. Після цього налаштування, лише користувачі, чиї імена є у файлі /etc/shutdown.allow
, зможуть перезавантажити систему за допомогою комбінації клавіш Ctrl+Alt+Del.
Команду systemctl
також можна використовувати для вимкнення або перезавантаження комп’ютера в системах, що використовують systemd. Щоб перезавантажити систему, слід використати команду systemctl reboot
. Щоб вимкнути систему, слід використати команду systemctl poweroff
. Для виконання обох команд потрібні права root, оскільки звичайні користувачі не можуть виконувати такі процедури.
Note
|
Деякі дистрибутиви Linux використовують $ sudo which poweroff /usr/sbin/poweroff $ sudo ls -l /usr/sbin/poweroff lrwxrwxrwx 1 root root 14 Aug 20 07:50 /usr/sbin/poweroff -> /bin/systemctl |
Не всі заходи з технічного обслуговування вимагають вимкнення або перезапуску системи. Однак, коли необхідно змінити стан системи на однокористувацький режим, важливо попередити користувачів, які ввійшли в систему, щоб вони не постраждали від раптового припинення їхньої діяльності.
Подібно до того, що виконує команда shutdown
під час вимкнення або перезавантаження системи, команда wall
може надсилати повідомлення термінальним сеансам усіх користувачів, які ввійшли в систему. Для цього системному адміністратору потрібно лише надати файл або безпосередньо написати повідомлення як параметр для команди wall
.
Вправи до посібника
-
Як можна використовувати команду
telinit
для перезавантаження системи? -
Що станеться зі службами, пов’язаними з файлом
/etc/rc1.d/K90network
, коли система перейде на рівень виконання 1? -
Як за допомогою команди
systemctl
користувач може перевірити, чи працює модульsshd.service
? -
У системі на основі systemd яку команду потрібно виконати, щоб активувати модуль
sshd.service
під час ініціалізації системи?
Дослідницькі вправи
-
У системі на основі SysV припустимо, що рівень виконання за замовчуванням, визначений у
/etc/inittab
, дорівнює 3, але система завжди запускається на рівні виконання 1. Яка ймовірна причина цього? -
Хоча файл
/sbin/init
можна знайти в системах на основі systemd, він є лише символьним посиланням на інший виконуваний файл. У таких системах на який файл вказує/sbin/init
? -
Як можна перевірити цільову систему за замовчуванням у системі на основі systemd?
-
Як можна скасувати перезавантаження системи, заплановане за допомогою команди
shutdown
?
Підсумки
Цей урок охоплює основні утиліти, які використовуються як менеджери служб у дистрибутивах Linux. Утиліти SysVinit, systemd і Upstart мають власний підхід до керування системними службами та станами системи. Урок розглядає такі теми:
-
Системні служби та їх роль в операційній системі.
-
Концепції та базове використання команд SysVinit, systemd і Upstart.
-
Як правильно запускати, зупиняти та перезапускати системні служби та саму систему.
Розглянуті команди та процедури:
-
Команди та файли, пов’язані з SysVinit, такі як
init
,/etc/inittab
таtelinit
. -
Основна команда systemd:
systemctl
. -
Команди Upstart:
initctl
,status
,start
,stop
. -
Традиційні команди керування живленням -
shutdown
та командаwall
.
Відповіді на вправи до посібника
-
Як можна використовувати команду
telinit
для перезавантаження системи?Команда
telinit 6
буде перемикати на рівень запуску 6, тобто перезавантажувати систему. -
Що станеться зі службами, пов’язаними з файлом
/etc/rc1.d/K90network
, коли система перейде на рівень виконання 1?Служби, які мають
K
на початку назви файлу, будуть зупинені. -
Як за допомогою команди
systemctl
користувач може перевірити, чи працює модульsshd.service
?За допомогою команди
systemctl status sshd.service
абоsystemctl is-active sshd.service
. -
У системі на основі systemd яку команду потрібно виконати, щоб активувати модуль
sshd.service
під час ініціалізації системи?Команду
systemctl enable sshd.service
з правами користувача root.
Відповіді до дослідницьких вправ
-
У системі на основі SysV припустимо, що рівень виконання за замовчуванням, визначений у
/etc/inittab
, дорівнює 3, але система завжди запускається на рівні виконання 1. Яка ймовірна причина цього?Параметри
1
абоS
можуть бути присутніми в списку параметрів ядра. -
Хоча файл
/sbin/init
можна знайти в системах на основі systemd, він є лише символьним посиланням на інший виконуваний файл. У таких системах на який файл вказує/sbin/init
?Основний двійковий файл systemd:
/lib/systemd/systemd
. -
Як можна перевірити цільову систему за замовчуванням у системі на основі systemd?
Символьне посилання
/etc/systemd/system/default.target
вказуватиме на юніт-файл, визначений як цільовий за замовчуванням. Також можна використати командуsystemctl get-default
. -
Як можна скасувати перезавантаження системи, заплановане за допомогою команди
shutdown
?Слід використовувати команду
shutdown -c
.