Runlevel в Unix/Linux

Runlevel в Unix/Linux

Уровень запуска — это программная конфигурация системы, которая позволяет запускать только выбранную группу процессов на определенном этапе.

Обычная последовательность загрузки в Linux состоит из нескольких этапов:

Этапы загрузки системы в Linux ОС

Init процесс:

  • Завершает процедуру загрузки.
  • Имеет процесс с номером 1 (ID1).
  • Запускает системные процессы (как описано в /etc/inittab).
  • Не является частью ядра, он принадлежит пользовательскому пространству (/sbin/init).
  • Никогда не умирает: он управляет жизненным циклом операционной системы (например -перезагрузка, выключение).

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

При построении, эти проекты генерируют процесс init и набор общих инструментов, таких как telinit или initctl.

При загрузке init проверяет файл конфигурации inittab для параметра runlevel. Это значение изменяется от 0 до 6, и для каждого из них выполняется определенный набор действий. Данные уровни можно переопределить, но об этом немного позже.

Сейчас, init программа может юзать 10 уровней инициализации, но больше всего используются следующии сем:

  • 0 — Используется для выключение ОС.
  • 1 — Однопользовательский режим (single user mode). Служит для различных административных действий по восстановлению системы. На 1-м уровне выполнения,  ОС сконфигурирована полностью, но при этом, не запущен ни один из сервисов, а из юзеров — работает только root-юзер.
  • 2 — Данный левел не юзается, но настроен как уровень выполнения 3. В rpm ОС, даный уровень сконфигурирован как уровень 3, но без поддержки сетевых файловых систем. В deb ОС используется как многопользовательский режим.
  • 3 — Многопользовательский режим (multiuser mode). Нормальный режим работы сервера.
  • 4 — В Slackware Linux настроен для графического входа в ОС. В rpm — не сконфигурирован вообще.
  • 5 — В deb и rpm системах, данный уровень предназначен для графического входа в систему, но Slackware Linux не сконфигурирован вообще.
  • 6 — Используется для перезагрузки ОС.

-=== INIT ===-

В зависимости от установки уровня инициализации по умолчанию система будет выполнять программы из одной из следующих папок (касательно Linux, но Unix — не уверен. На Mac OS X — нет таких папок):

  • Запуск на 0 уровне: /etc/rc.d/rc0.d
  • Запуск на 1 уровне: /etc/rc.d/rc1.d
  • Запуск на 2 уровне: /etc/rc.d/rc2.d
  • Запуск на 3 уровне: /etc/rc.d/rc3.d
  • Запуск на 4 уровне: /etc/rc.d/rc4.d
  • Запуск на 5 уровне: /etc/rc.d/rc5.d
  • Запуск на 6 уровне: /etc/rc.d/rc6.d

В этих каталогах имена программ начинаются с S или K, за которыми следуют порядковый номер и имя программы.
Программы, которые начинающиеся с S, выполняются в системе Start, а программы начинающиеся с K, выполняются в системе Kill. Номер последовательности указывает, когда программа будет выполнена.

-=== SYSTEMD ===-

В последних версиях Linux-систем, таких как RHEL 7, Ubuntu 16.04 LTS, концепция уровней запуска была заменена с init на systemd. Вот список целей (targets) Systemd в дистрибутивах Linux, которые были распространены вместе с Systemd в качестве менеджера по умолчанию:

  • runlevel0.target, poweroff.target – Выключение ОС.
  • runlevel1.target, rescue.target – Однопользовательский режим (single user mode).
  • runlevel2.target, multi-user.target – Не используется.
  • runlevel3.target, multi-user.target –Многопользовательский режим (multiuser mode). Нормальный режим работы сервера.
  • runlevel4.target, multi-user.target –Не используется.
  • runlevel5.target,graphical.target – Уровень запуска графического интерфейса.
  • runlevel6.target,reboot.target – Перезапуск ОС.

Перейдем к примерам.

Использование/Переключение runlevel в Unix/Linux

Приведу примеры использования в init и systemd.

-=== INIT ===-

Пользователь root (суперюзверь), может выполнить следующую команду для выключения сервера:

# init 0

Пользователь root (суперюзверь), может выполнить следующую команду для перезагрузки сервера:

# init 6

Собственно, таким образом сожно переключатся между init-уровнями.

-=== SYSTEMD ===-

Если вы хотите изменить RunLevel, например на runlevel3.target, установите его, как показано ниже:

# systemctl set-default runlevel3.target

Или, чтобы установить multi-user.target по умолчанию, используйте следующую команду:

# systemctl set-default multi-user.target

Вы используете команду systemctl isolate для изменения цели. Например, измените на multi-user.target (уровень запуска 3):

# systemctl isolate multi-user.target

Или, чтобы перейти в другой таргет (цель или target), только в текущем сеансе, выполните следующую команду:

# systemctl isolate runlevel3.target

И чтобы вернуться к графический режим (уровень 5-го уровня):

# systemctl isolate graphical.target

Редактирование runlevel в Unix/Linux

Приведу примеры использования в init.

-=== INIT ===-

Для этого, открываем файл:

# vim /etc/inittab

Найдите и отредактируйте запись «initdefault» на уровень выполнения по вашему выбору. Скажем, например, чтобы установить уровень запуска в многопользовательский графический режим (runlevel 5), измените его, как показано ниже:

id:5:initdefault:

Сохраните и закройте файл. Перезагрузите свою систему, чтобы войти в свой новый уровень запуска.

Дополнительные сведения вы можете получить:

$ man runlevel

Проверка runlevel в Unix/Linux

Приведу примеры использования в init и systemd.

-=== INIT ===-

Чтобы проверить уровень запуска вашей ОС, вы можете использовать команду runlevel без аргументов (Только для Linux ОС):

$ runlevel

Или, можно использовать:

$ /sbin/runlevel

Еще один способ проверить ваш уровень запуска — использовать следующую команду (Работает в Unix/Linux):

$ who -r

Чтобы узнать, какие службы запущены на каком из уровнях, вы можете использовать:

# chkconfig

Или с использование параметра:

# chkconfig --list

-=== SYSTEMD ===-

В системах Linux, которые используют Systemd в качестве сервис-менеджера по умолчанию, вы можете найти ран-левел с помощью команды:

$ systemctl get-default

Вывод:

graphical.target

Используйте следующую команду, чтобы проверить runlevel:

# systemctl status default.target

Чтобы узнать, какие службы запущены на каком из уровнях, вы можете использовать:

# 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-pre.target     loaded active active Network (Pre)
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-pre.target   loaded active active Remote File Systems (Pre)
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

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

21 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Вышеуказанная команда покажет только активные цели.

Чтобы просмотреть все загруженные объекты (активные и неактивные), запустите:

# systemctl list-units --type target --all

Проверьте статус конкретной службы, например, демон SSH:

# systemctl status ssh?

Проверьте, активна ли служба(работает ли она), на пример с SSH:

# systemctl is-active sshd
active

Для использования помощи, используйте:

# man systemd

Идем дальше.

Добавить сервис/службу в runlevel в Unix/Linux

Приведу примеры использования в init и systemd.

-=== INIT ===-

Например, вам нужно добавить службу (сервис) nginx на 2-й уровень, для этого вы можете выполнить:

# chkconfig --add nginx 2

Не сильно сложно, верно?

-=== SYSTEMD ===-

Включим службу в автозапуск при запуске ОС, например для SSH:

# systemctl enable sshd

Проверьте, включена ли она в автозапуск следующей командой:

# systemctl is-enabled sshd
enabled

Чтобы убрать службу (пример с SSH) выполните:

# systemctl disable sshd

Для оставновки службы:

# systemctl stop ssh

Чтобы предотвратить запуск службы вручную, используйте подкоманду:

# systemctl mask ssh

Маскированные службы не могут быть запущены с помощью команды запуска systemctl до тех пор, пока она не будет открыта:

# systemctl unmask ssh

Как-то так. А на этом, у меня все — статья «Runlevel в Unix/Linux» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.