Как понять используется ли в системе systemd?devops-9

Основные методы проверки

1. Проверка первого процесса

Самый надежный способ - посмотреть, какой процесс запущен с PID 1:

ps -p 1 -o comm=
# Или альтернативно:
systemctl --version >/dev/null 2>&1 && echo "systemd" || echo "other"

Ожидаемый вывод для systemd:

  • systemd
  • init или другие названия указывают на альтернативные системы

2. Проверка наличия /run/systemd

Systemd создает специальную директорию:

ls -ld /run/systemd
drwxr-xr-x 20 root root 580 May 15 10:00 /run/systemd

3. Поиск systemd в процессе загрузки

Проверка параметров ядра:

cat /proc/cmdline | grep systemd

4. Проверка наличия systemctl

Попытка выполнить команду управления:

if command -v systemctl >/dev/null; then
    echo "systemd присутствует"
else
    echo "systemd отсутствует"
fi

Дополнительные методы диагностики

5. Проверка файловой системы /sys/fs/cgroup

mount | grep cgroup | grep systemd
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)

6. Анализ используемого init-образа

ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Apr  5  2023 /sbin/init -> /lib/systemd/systemd

7. Проверка журнала загрузки

journalctl -b 2>/dev/null || echo "journalctl не доступен - нет systemd"

Особенности для разных дистрибутивов

Ubuntu/Debian :

stat /proc/1/exe | grep systemd

RHEL/CentOS :

rpm -qf /usr/lib/systemd/systemd

Alpine Linux :

cat /etc/os-release | grep NAME

Автоматизированный скрипт проверки

#!/bin/bash
SYSTEMD_PID=$(ps -p 1 -o comm=)
if [ "$SYSTEMD_PID" = "systemd" ]; then
    echo "Система использует systemd"
    echo "Версия: $(systemd --version | head -n1)"
elif [ -x "$(command -v systemctl)" ]; then
    echo "systemd установлен, но не как init-система"
else
    echo "systemd не используется (используется $SYSTEMD_PID)"
fi

Резюмируем

  1. Основные признаки systemd:

    • Процесс systemd с PID 1
    • Наличие команды systemctl
    • Существование /run/systemd
    • Наличие journalctl для просмотра логов
  2. Методы проверки:

    • Проверка PID 1 - самый надежный способ
    • Поиск systemctl - быстрый индикатор
    • Анализ /sbin/init - показывает используемую систему
  3. Важно помнить:

    • Некоторые системы могут иметь установленный systemd, но не использовать его как init
    • В контейнерах часто используют минимальные системы (runit, openrc)
    • Современные дистрибутивы (кроме Alpine) обычно используют systemd
  4. Для DevOps практики:

    • Всегда проверяйте окружение перед использованием systemd-команд
    • Учитывайте различия при написании кроссплатформенных скриптов
    • Помните о legacy-системах при работе с enterprise-окружениями