Система инициализации в Unix/Linux
Иногда интересно какая же инициализация используется на сервере и в моей статье «Система инициализации в Unix/Linux» я расскажу как можно узнать какая система инициализации используется на сервере.
Основные системы инициализации:
- sysvinit — Стиль SysVinit существовал еще со времен SystemV, которая была разработана еще в 1983 году. Это установило стандарт инициализации POSIX систем.
- upstart — система инициализации ОС, которая управляет запуском демонов в течение загрузки системы, их остановку, а также управляет ими во время работы системы. Первоначально была разработана для дистрибутива Ubuntu, но затем стала использоваться и в других дистрибутивах Linux, например в Fedora (впоследствии была заменена systemd), как замена UNIX System V init.
- systemd — это системный менеджер, (демон для инициализации других демонов в Linux), который пришел и почти заменил SysV. Основное отличие — распределенный запуск служб в процессе загрузки системы, что позволяло существенно ускорить запуск операционной системы.
- launchd — система инциализации системы с открытым исходным кодом, используемая в ОС Mac OS X. Процесс имеет PID 1 и занимается тем, что запускает другие процессы и перезапускает их в случае сбоя, то есть выполняет функции init UNIX и Linux (в новых версиях Linux осуществляется переход на systemd).
Команды по системам инициализации в Unix/Linux ОС:
Система инициализации SysVinit
Система инициализации в Unix/Linux
Существует несколько способов проверить это, сейчас я покажу как это сделать.
-=== СПОСОБ 1 — проверка PID процессов==-
Например, Ubuntu до версии 14 использовала систему инициализацию Upstart чтобы проверить это, выполните:
$ ps aux | grep upstart
Или:
$ ps -p 1
Например, Ubuntu 16 и CentOS 7 использовала систему инициализацию SystemD чтобы проверить это, выполните:
$ ps aux | grep systemd
Или если используется Ubuntu 16, можно выполнить:
$ ps -p 1
Еще вариант:
$ ps -s1
Или, другой пример:
$ ps -1
А так же:
$ (ps -eo "ppid,args" 2>/dev/null || echo "ps call error") | awk 'NR==1 || $1==1'
Или (если чтобы было красиво):
$ ps -s1 | awk '{print $4}'| grep -Ev "CMD"
Например, CentOS 6 использовала систему инициализацию Upstart, но с init процессом и чтобы проверить это, выполните:
$ ps aux | grep init
-=== СПОСОБ 2 — проверка файлов==-
Запускаем следующую команду:
$ /sbin/init --version
Если на сервере используется init инициализация, то она отобразится при выводе. В противном случае — скажет что такой команды нет.
Или:
# initctl --version
ИЛИ, можно выполнить:
$ file /sbin/init
Вот вам еще довольно стоящий пример:
# strings /sbin/init | grep -q "/lib/systemd" && echo SYSTEMD # strings /sbin/init | grep -q "upstart" && echo UPSTART # strings /sbin/init | grep -q "sysvinit" && echo SYSVINIT
Соединил воедино:
$ strings /sbin/init | awk 'match($0, /(upstart|systemd|sysvinit)/) { print toupper(substr($0, RSTART, RLENGTH));exit; }'
Не плохо, да?)
-=== СПОСОБ 3 — с помощью ФС==-
Можно запустить следующую команду:
# ls -l /proc/1/exe
Команда что выше, проверяет exe симлинку в папке /proc/1. А собственно «1» – это PID 1-го процесса.
Или:
$ { ls -l /proc/1/fd |grep -q systemd && echo "init: systemd"; } || \ { ls -l /proc/1/fd |grep -q /run/initctl && echo "init: sysvinit"; } || \ { ls -l /proc/1/fd |grep -q upstart && echo "init: upstart"; } || \ { ls -l /proc/1/exe |grep -q busybox && echo "init: busybox"; } || \ echo "unknown init"
-=== СПОСОБ 4 — с помощью готового bash скрипта==-
Создаем скрипт:
# vim INIT.sh
И прописываем в него:
#!/usr/bin/env bash # init process is pid 1 INIT=`ls -l /proc/1/exe` if [[ $INIT == *"upstart"* ]]; then SYSTEMINITDAEMON=upstart elif [[ $INIT == *"systemd"* ]]; then SYSTEMINITDAEMON=systemd elif [[ $INIT == *"/sbin/init"* ]]; then INIT=`/sbin/init --version` if [[ $INIT == *"upstart"* ]]; then SYSTEMINITDAEMON=upstart elif [[ $INIT == *"systemd"* ]]; then SYSTEMINITDAEMON=systemd fi fi if [ -z "$SYSTEMINITDAEMON" ]; then echo "WARNING: Unknown distribution, assuming defaults - this may fail." >&2 else echo "Init system discovered: $SYSTEMINITDAEMON" fi
Можно добавить прав на исполнение:
# chmod +x INIT.sh
И для запуска, юзаем:
# bash INIT.sh
-=== СПОСОБ 5 — с помощью пакетного менеджера==-
Если используете centOS/RedHat/Fedora/Suse, то можно выполнить:
$ rpm -qf /sbin/init
Если используете Debian/Ubuntu/Mint/др, то можно выполнить:
$ dpkg -S /sbin/init
-=== СПОСОБ 6 — с помощью lsof==-
Так же, можно выполнить:
$ ps -eaf| grep -E "[s]ystemd|init|[u]pstart"
-=== СПОСОБ 7 — с помощью ls и which==-
# ls -l `which init`
Вот и все. Если имеются другие примеры проверки инициализации, пишите в комментариях. Тема «Система инициализации в Unix/Linux» завершена.