Systemd в Linux

Systemd в Linux

    Общие понятия

    Была когда то система инициализации init (SysVinit). Скрипты управления службами лежат в /etc/init.d/. Для автозапуска этих скритов используется 7 уровней запуска(runlevels).
    0 - остановка системы
    1 - режим восстановления или однопользовательский режим
    2-3 - многопользовательский с поддержкой и без поддержки сети
    5 - графический режим
    6 - перезагрузка
    Для каждого из этих уровней в директории /etc/ свой каталог rc_номер_уровня.d В каждом таком каталоге хранятся символические ссылки на скрипты в папке /etc/init.d
    При выборе уровня инициализации запускаются скрипты из соответствующего каталога.
    Каждый симлинк начинается с буквы которая соответствует действию в скрипте службы:
    S start
    K stop
    За буквой следует число(приоритет) порядка запуска, чем больше число, тем выше приоритет.
    Какой уровень будет выполнятся в системе, задается в /etc/inittab
    Все скрипты запускаются последовательно, эту концепцию изменилась в системе инициализации Upstart(Ubuntu), которая сменилась СИ Systemd.
    Systemd - подсистема инициализации и управления службами и не только...
    Systemd нарушает главный принцип unix-way "одна программа-одна функция", применяет агрессивную параллелизацию
    Systemd оперирует файлами конфигурации - модулями(unit). unit это основная сущность Sd, это не просто shell скрипт.
    Существует несколько типов unit, например service, который используется для старта, остановки, перезапуска сервиса.
    unit это текстовый ini файл разделенный на секции с параметрами.
    Юниты хранятся в следующих каталогах:
    /usr/lib/systemd/ - системные юниты
    /etc/systemd/system - юниты администратора
    /run/systemd/ - динамически создаваемые юниты
    unit - служба(точка монтирования, устройство, файл, виртуальная машина)


    Дополнительные модули не относятся к управляемым сервисам:
    .target - группирует модули
    .service - запуск служб
    .timer - запуск модулей по расписанию
    .path - управляет иерархией файловой системы
    и др.


    Systemd в отличии от традиционной SystemV, контролирует состояние служб, в зависимости от изменения их состояния.
    Исходные коды менеджера устройств udev объединены в Systemd


    Возможности:
    Автомонтирование томов и сетевых ресурсов, как замена mount и fstab journalctl - служба журналирования
    systemd-analyse - анализ скорости и запуска служб
    systemd-boot - UEFI загрузчик(замена grub)
    смена корня, как замена chroot
    запуск сервисов по расписанию, как замена cron
    активация сокет служб(замена inetd)


    service - аналог демона
    target - описывает группу юнитов, директория с симлинками на другие юниты.
    Являются аналогами уровней в SysVinit. Например target с именем multi-user это аналог 2-3 уровня в SysVinit. По умолчанию запускается default target (graphical.target 5 уровень)
    device - подключенное устройство
    timer - подобно крону может запускать юниты
    slice - группирует другие юниты в cgroups, задет ограничение по используемым ресурсам
    mount - точка монтирования файловой системы, где имя юнита это путь до точки монтирования
    socket - запускается при подключении к конкретному сокету
    path - запуск сокета при доступе к пути файловой системы


    cgroups - способ объединения процессов с целью добавления общих правил или ограничений.

    Просмотр юнита
    systemctl cat sshd.service [Unit] Description=OpenBSD Secure Shell server Documentation=man:sshd(8) man:sshd_config(5) After=network.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run [Service] EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=sshd RuntimeDirectoryMode=0755 WantedBy Указывает уровень запуска в секции install PIDFile= определяет директорию(путь), чтобы systemd могла отслеживать основной процесс Restart=always автоматически стартовать сервис если он упал user, group - пользователь или группа, под которым следует стартовать сервис Environment=RACK_ENV=production переменные окружения TimeoutSec= Таймаут отработки команд start stop OOMScoreAdjust=-100 - запрет убиства сервиса в случае нехватки памяти, где -1000 полный запрет [Install] WantedBy=multi-user.target Alias=sshd.service

    В данном примере видно, что юнит делится на секции:
    unit
    service - тип юнита
    install
    install - это секция используется командами systemctl enable/disable при добавлении симлинка в определенный target. При выполнении определенного target, будут запущенны группа юнитов.
    Description - описание юнита
    After Before - порядок запуска указнных юнитов, до или после. В Before юниты не будут запущены, пока текущий блок не будет запущен. В After юниты будут запущены до текущего блока.
    Wants - указывает на зависимости которые будут запущены параллельно юниту
    BindsTo - аналогична Requires
    Requires - указываются зависимости без запуска которых юнит работать не будет. Conflicts - юниты которые не должны работать одновременно с текущим
    Assert - проверяет различные аспекты рабочей среды
    ExecStart - указывает как будет запускаться юнит
    ExecReload - указывает как будет перечитан конфиг
    KillMode - описывает как будет убит процесс
    Restart - указывает в каких случаях будет запущен restart юнита

    Systemctl

    Показать список юнитов:

    systemctl list-units

    Показать список юнитов, учитывая тип юнитов:

    systemctl list-units -t

    Показать все юниты, в том числе не активные:

    systemctl list-units --all

    Показать общее состояние системы и список юнитов которые соответствуют запущенным процессам:

    systemctl status

    Показать состояние юнита:

    systemctl status sshd.service

    Добавить юнит в автозагрузку:

    systemctl enable sshd.service

    Убрать из автозагрузки:

    systemctl disable sshd.service

    Проверить наличие юнита в автозагрузке:

    systemctl is-enabled sshd.service

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

    systemctl mask sshd.service

    Команда выше создает симлинк на /dev/null в /etc/systemd/system
    Обратная команда:

    systemctl unmask unit_name
    Соответствие target уровням

    0 - poweroff.target (half.target)
    1 - rescue.target
    3 - multi-user.target
    5 - graphical.target
    6 - reboot.target
    Можно запустить нужный target:

    systemctl start reboot.target systemctl reboot #Сокращенный вариант

    Убийство юнита:

    systemctl kill unit_name

    Перезапустить все юниты:

    systemctl daemon-reload
    Директории systemd

    /lib/systemd/system - в этой директории находятся все копии юнитов. Файлы в этом каталоге не редактируются, они переопределяются, используя другое расположение файла. Правильный способ, создать каталог с именем файла с добавлением .d в конце. Например для сервиса test.service, создать подкаталог test.service.d. В этом каталоге файл с расширением .conf , который и будет переопределять директивы
    /run/systemd/system - место для определения run-time юнитов(динамически создаваемые юниты, создаваемые во время выполнения)

    Типы systemd unit-файлов

    Чтобы посмотреть тип юнита, достаточно посмотреть на его префикс. .device
    .path - использует путь который будет использоваться для активации на основе пути
    .timer
    .snapshot
    .slice
    .scope
    .socket описывает сетевой IPC-сокет или FIFO буфер который используется для активации сокета. Сокет связана всегда с .service, который будет запущен при socket активности.
    .service
    .mount

    Структура systemd юнита

    .automount
    .swap - описывает пространство подкачки в системе
    .target


    Источники
    Последнее изменение: 08.10.2024 12:14


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ