Skip to content

Работа с SysVinit. Основы управления системой инициализации в Linux

SysVinit — это классическая система инициализации (init), используемая в большинстве дистрибутивов Linux на протяжении многих лет. Она основана на подходе System V от Unix и отвечает за запуск всех процессов при загрузке системы, управление уровнями выполнения (runlevels) и корректное завершение работы. Несмотря на то, что сегодня большинство современных дистрибутивов перешли на более современные системы инициализации, такие как systemd, понимание работы SysVinit остаётся важным для администраторов, особенно при работе со старыми системами, встраиваемыми устройствами или специализированными средами.


1. Что такое SysVinit?

SysVinit — это реализация системы инициализации, основанная на стандарте System V от AT&T. Её основная задача — стать первым процессом, запущенным ядром (с PID 1), и последовательно запускать другие процессы и службы в соответствии с конфигурацией системы.

Система работает на основе уровней выполнения (runlevels) и скриптов инициализации, расположенных в каталоге /etc/init.d/. Управление происходит с помощью символических ссылок в каталогах /etc/rcX.d/, где X — номер уровня выполнения.


2. Уровни выполнения (Runlevels)

Каждый уровень выполнения определяет состояние системы и набор запускаемых служб. Основные уровни:

Уровень Назначение
0 Выключение системы
1 Однопользовательский режим (аварийный)
2 Многопользовательский режим без сети (в некоторых дистрибутивах)
3 Многопользовательский режим с сетью (текстовый интерфейс)
4 Зарезервировано (пользовательское использование)
5 Многопользовательский режим с графическим интерфейсом
6 Перезагрузка системы

⚠️ Примечание: точное поведение уровней может отличаться в зависимости от дистрибутива (например, в Debian и Ubuntu runlevel 2–5 часто идентичны).


3. Структура каталогов SysVinit

/etc/init.d/

Содержит скрипты инициализации для каждого сервиса (например, apache2, ssh, cron). Эти скрипты принимают аргументы: start, stop, restart, status.

Пример вызова:

sudo /etc/init.d/apache2 start

или (через service):

sudo service apache2 start

/etc/rcX.d/ (где X — уровень выполнения)

Содержит символические ссылки на скрипты из /etc/init.d/. Имена ссылок имеют формат:

[SN]NNname
  • S — запустить (start)
  • K — остановить (kill)
  • NN — порядковый номер (от 00 до 99)
  • name — имя сервиса

Например: - S20ssh — запустить SSH после всех с номерами ниже 20 - K80apache2 — остановить Apache на 80-м шаге при выключении

🔁 При переходе на уровень выполнения система запускает все скрипты, начинающиеся с S, в порядке возрастания номера. При переходе с уровня — останавливает через K.


4. Управление сервисами

Запуск/остановка сервиса

sudo /etc/init.d/имя_сервиса start
sudo /etc/init.d/имя_сервиса stop
sudo /etc/init.d/имя_сервиса restart
sudo /etc/init.d/имя_сервиса status

Использование команды service

sudo service ssh start
sudo service apache2 restart

Включение/отключение сервиса для уровня выполнения

Для управления автозапуском используются утилиты: - update-rc.d (в Debian/Ubuntu) - chkconfig (в RHEL/CentOS)

Пример (Debian/Ubuntu):

# Включить автозапуск Apache на уровнях 2-5
sudo update-rc.d apache2 defaults

# Отключить автозапуск
sudo update-rc.d -f apache2 remove

Пример (RHEL/CentOS):

# Включить ssh
sudo chkconfig sshd on

# Отключить
sudo chkconfig sshd off

# Проверить статус
sudo chkconfig --list sshd

5. Переключение уровней выполнения

Изменить текущий уровень выполнения можно командой:

sudo telinit X

где X — нужный уровень (например, telinit 3 — переход в многопользовательский режим без GUI).

Также можно использовать:

sudo init 5

⚠️ Будьте осторожны: init 0 — выключение, init 6 — перезагрузка.


6. Создание собственного скрипта инициализации

Чтобы добавить свой сервис, создайте скрипт в /etc/init.d/:

sudo nano /etc/init.d/myservice

Пример содержимого:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start myservice
# Description:       My custom service
### END INIT INFO

case "$1" in
  start)
    echo "Starting myservice..."
    # Ваша команда запуска
    ;;
  stop)
    echo "Stopping myservice..."
    # Ваша команда остановки
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

Сделайте скрипт исполняемым:

sudo chmod +x /etc/init.d/myservice

Добавьте в автозагрузку:

sudo update-rc.d myservice defaults

7. Преимущества и недостатки SysVinit

Преимущества: - Простота и прозрачность - Хорошо документирован - Лёгкий для отладки - Подходит для встраиваемых систем

Недостатки: - Последовательный запуск (медленная загрузка) - Отсутствие параллелизации - Нет встроенного отслеживания зависимостей - Ограниченная поддержка современных функций (логирование, сокеты, cgroups)


8. Современный контекст

Сегодня systemd стал стандартом для большинства дистрибутивов (Ubuntu, Fedora, Debian, CentOS и др.). Однако SysVinit всё ещё используется: - В легковесных дистрибутивах (например, Devuan, antiX) - В встраиваемых системах - Для совместимости

Многие системы поддерживают гибридный режим: systemd может запускать скрипты SysVinit, обеспечивая обратную совместимость.


Рекомендации: - Изучайте скрипты в /etc/init.d/ — они наглядно показывают, как запускаются службы. - Используйте update-rc.d или chkconfig для управления автозагрузкой. - Будьте осторожны при ручном редактировании /etc/rcX.d/. - В новых проектах рассмотрите переход на systemd, если это возможно.