Система инициализации в Unix/Linux

Система инициализации в 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

Система инициализации Systemd

Система инициализации в 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» завершена.

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

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

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