**101.3** Инициализация системы

Студент должен уметь управлять уровнями выполнения SysV (runlevels) или целями загрузки systemd (boottarget) **.** Также в теме рассматриваются переключение в однопользовательский режим, выключение и перезагрузка системы, предупреждение пользователей, настройки уровня запуска ОС по умолчанию. Также нужно быть знакомыми с инициализацией в стиле upstart.

**Изучаем** :

- установка варианта загрузки по умолчанию;
- переключение между режимами работы;
- включение и выключение ПК;
- уведомление пользователей системы;
- корректное завершение процессов.

**Термины и утилиты:****        **

- /etc/inittab
- shutdown
- init
- /etc/init.d/
- telinit
- systemd
- systemctl
- /etc/systemd/
- /usr/lib/systemd/
- upstart
- inictl
- wall

Инициализация системы это процесс запуска скриптов, подготавливающих ОС к работе. Существует несколько различных стилей инициализации системы, использующиеся в разных семействах и даже в разных релизах ОС.

Классическим методом инициализации ОС является инициализация в стиле **SysV** (в современных OCLinux практически не используется). Ключевым демоном является **init** (/sbin/init), являющийся родительским процессом, запускающим все остальные. Посмотреть дерево процессов и увидеть родительский можно командой pstree (для в centos нужно установить пакет psmisc)

Инициализация в стиле **SysV** оперирует с понятием уровня выполнения ( **runlevel** ), представляющего собой следующие режимы загрузки ОС:

**0** _– выключение;_

**1** _– однопользовательский режим;_

**2** _–_ _Debian __/__ Ubuntu_ _по умолчанию ( __GUI_ _или_ _CUI__ );_

**3** _–_ _RedHat __/__ Suse_ _по умолчанию (режим_ _CUI__);_

**4** _– WildCard (программируемый режим);_

**5** _–_ _RedHat __/__ Suse_ _по умолчанию (режим_ _GUI__);_

**6** _– перезагрузка._

Настройки загрузки по умолчанию указываются в файле **/**** etc ****/**** inittab**(конфигурационный файл инициализации системы), например:

**id**** :3: ****initdefault**** :       ** _(уровень загрузки по умолчанию - третий);_

Все скрипты, использующиеся для запуска служб, располагаются в директории **/**** etc ****/**** init ****.**** d**, например:

**/**** etc ****/**** init ****.**** d ****/**** network ****restart** _        (перезапустить службу сети);_

В каталоге **/**** etc **находятся директории** rc ****0.**** d ****,**  **rc**** 1. ****d** (и т.д.), содержащие в себе наборы скриптов (точнее ссылки на скрипты), использующиеся при переключении в разные режимы работы, например в **rc**** 3. ****d** находятся скрипты выполняющиеся на **runlevel**** 3**.

Некоторые скрипты (имя начинается с &quot;S&quot;) запускают демоны, а некоторые (имя начинается с &quot;K&quot;) – останавливают.

Для работы с уровнями выполнения используют следующие команды:

- **init** или **telinit**         - переключение в режима запуска;
- **runlevel**                 - узнать текущий режим работы;
- **halt**                 - выключить ОС;
- **reboot**                 - перезагрузить ПК;
- **shutdown**         - завершить работу ПК.

Для управления демонами используется команда **service**** имя\_демона** с ключами (не у всех демонов в конфиге могут присутствовать все перечисленные команды, зачастую можно увидеть ленивый скрипт только с командами start и stop):

- **start**         - запустить;
- **status       ** - показать состояние;
- **stop**         - остановить;
- **restart**         - перезапустить;
- **reload**         - перезагрузить конфигурационный файл службы.

\_\_\_

Более современный стилем инициализации является **systemd**. Сейчас он используется на большинстве современных дистрибутивов Linux (Centos 7.0 и выше, Ubuntu 15.10 и выше), засчет ускорения загрузки (распараллеливание запуска демонов) и автоматической отказоустойчивости (отслеживание состояния демонов). Использует понятие модулей (units), которыми могу быть службы (._service_), точки монтирования (._mount_), устройства (._device_) или сокеты (._socket_).

Модули (юниты) создаваемые автоматически после установки пакетов ПО располагаются в директории **/usr/lib/systemd/.** Также можно располагать юниты в директориях **/etc/systemd/system/** (для ОС в целом) или **/etc/systemd/user/** (для пользователей).

Для управления юнитами используется утилита **systemctl** , например:

**systemctl list-units       ** _(показать запущенные юниты);_

**systemctl start network.service       ** _( __запустить__ демон __сети__ );_

**systemctl status crond       ** _(показать статус демона планировщика)._

Вместо **runlevel** в **systemd** используется понятие **target** (цели), только в отличии от уровней выполнения они не пронумерованы, некоторые из них могут быть запущены одновременно. Target обратно совместимы с инициализацией sysV, поэтому можно использовать команду **telinit** для переключения в другой режим выполнения.

 ![](data:image/*;base64,[encoded data, 52832 characters])

_Рисунок 1. Таргеты инициализации_

Для управления режимами работы также используется утилита **systemctl** , например:

**systemctl isolate reboot.target**                 _( __выполнить__ таргет_ _reboot);_

**systemctl set-default -f multi-user.target**         _( __установить__ таргет_ _multi-user_ _в __качестве__ режима __загрузки__ по __умолчанию__ );_

Для управления питаем также можно использовать **systemctl** , например:

**systemctl reboot       ** _        (перезагрузить ПК);_

**systemctl**** poweroff**_        (выключить ПК)._

Важная особенность systemd – гибкая система журналирования **journald** , собирающая информацию из различных источников и привязывающая ее к различным юнитам. Примеры ее использования:

**journalctl –f** _        (просмотр сообщений в режиме реального времени);_

**journalctl -n10** _         (просмотр 10 последних сообщений);_

**journalctl \_UID=70** _        (вывод всех сообщений включающих пользователя с ID=70);_

\_\_\_

В исторической перспективе отмечаем систему инициализации системы является **upstart** , опирающуюся в своей работе на события, происходящие в ОС. Она использовалась в ubuntu с версии 6.10 по 15.04, и во многих других дистрибутивах, которые сейчас уже используют systemd.

Upstart оперирует понятиями **служба** (_service_), поддерживаемая в постоянном режиме работы, и **задача** (_task_), выполняющаяся разово. В процессе инициализации upstart считывает настройки из файлов конфигурации (_заданий -_ _jobs_) в каталоге **/**** etc ****/**** init ****/.**

Каждое задание представляет собой сценарии запуска демонов с различными критериями и условиями выполнения.

Уровни инициализации или режимы работы используется такие же, как и в классическом sysV, так что команды **runlevel** и **telinit** продолжают работать. Синтаксис управления питанием и службами также схож с классическим.

Уровень инициализации по умолчанию указывается в файле **/etc/init/rc-sysinit.conf**

Для управления инициализацией в стиле upstart используется утилита **initctl** , например:

**initctl**** start ****networking** _        (запустить службу сети);_

**initctl**** list**_ __                (вывести перечень служб);_

-----

Для возможности извещения в любых дистрибутивах Linux всех пользователей, работающих в системе, о каких-либо действиях можно воспользоваться командой **wall****&quot;текст\_сообщения&quot;**.