systemd (Русский)
| Сводка |
|---|
| Статья охватывает установку и настройку systemd. |
| Связанные статьи |
| systemd/User |
| systemd/Services |
| systemd FAQ |
| init Rosetta (Русский) |
| udev (Русский) |
Цитата с веб-страницы проекта:
"systemd - система [инициализации] и менеджер служб для Linux, совместимые со скриптами инициализации SysV и LSB. systemd обеспечивает возможности агрессивной параллелизации, использует сокеты и активацию D-Bus для запускаемых служб, предлагает запуск демонов по необходимости, отслеживает процессы при помощи контрольных групп Linux, поддерживает мгновенные снимки и восстановление состояния системы, монтирование и точки монтирования, а также внедряет основанную на зависимостях логику контроля процессов сложных транзакций. Эта система может выступать заменой sysvinit.".
Смотрите также статью в Википедии.
Соображения перед началом миграции
- Почитайте про systemd на сайте разработчиков.
- Обратите внимание, что systemd имеет собственный журнал (journal), заменяющий syslog, хотя оба варианта ведения логов могут сосуществовать. Обратитесь к приведенному ниже разделу, посвященному журналу.
- Хотя systemd вполне способна заменить определенную функциональность таких демонов, как cron, acpid или xinetd, но если вы не хотите, можете не отказываться от использования традиционных демонов.
- Интерактивные загрузочные скрипты (initscripts) не работают с systemd. В частности, netcfg-menu не может использоваться при загрузке системы.
Установка
Следующий раздел предназначен для тех установок Arch Linux, которые все еще зависят от пакетов sysvinit и initscripts и не перешли на использование systemd.
- Установите пакет systemd и добавьте следующую запись к параметрам загрузки ядра:
init=/usr/lib/systemd/systemd - Выполнив это, вы сможете включать или отключать любой необходимый сервис путем применения команды
systemctl enable <service_name>(это примерно соответствует тому, что включалось в массивDAEMONS). Новые имена (отличные от прежних демонов) можно посмотреть здесь. - Перезагрузите свою систему и убедитесь, что
systemdв настоящее время активен, выполнив следующую команду:cat /proc/1/comm. Данная команда должна вернуть строкуsystemd. - Убедитесь, что hostname (имя компьютера) у вас под systemd установлено праильно:
hostnamectl set-hostname myhostname. - Удалите initscripts и sysvinit из вашей системы и установите systemd-sysvcompat.
- Теперь можно (но не обязательно) удалить параметр
init=/usr/lib/systemd/systemd, поскольку необходимости в нем более нет. Инициализация по умолчанию обеспечивается пакетом systemd-sysvcompat.
Дополнительная информация
- Если в параметрах ядра имеется значение
quiet, вероятно, вам стоит удалить его для нескольких первых загрузок systemd, чтобы видеть возникающие во время загрузки проблемы.
- Теперь при использовании systemd добавлять вашего пользователя в группы (
sys,disk,lp,network,video,audio,optical,storage,scanner,powerи др.)) в большинстве случаев нет необходимости. Это даже может нарушить работоспособность системы. Например, добавление в группуaudioможет привести к невозможности быстрого переключения между пользователями и позволит приложениям заблокировать программное микширование. Каждый вход PAM предоставляет сессию logind, которая дает вам разрешения для локальной сессии посредством POSIX ACLs на аудио/видео устройства и позволяет выполнять некоторые операции, такие, как как монтирование съемных носителей через udisks.
- Обратитесь к статье Network Configuration для получения информации о настройке сетевых подключений.
Родные системные файлы
Имя компьютера (hostname)
Имя компьютера настраивается в файле /etc/hostname. Этот файл может содержать содержать доменное имя системы, если таковое имеется, однако в момент написания руководства команда hostnamectl не устанавливала FQDN (Fully Qualified Domain Name — полностью определенное имя домена). Для установки короткого имени компьютера выполните:
# hostnamectl set-hostname myhostname
Обратитесь к руководствам man 5 hostname и man hostnamectl для получения более подробной информации.
Вот примерный файл:
/etc/hostname
myhostname
Локаль
Системная локаль по умолчанию настраивается в конфигурационном файле /etc/locale.conf. Для установки локали по умолчанию выполните:
# localectl set-locale LANG="ru_RU.UTF-8"
Для получения подробной информации о вариантах настройки обратитесь к руководствам man 1 localectl и man 5 locale.conf.
- Дальнейшая информация содержится в статье Locale.
Вот примерный файл:
/etc/locale.conf
LANG=ru_RU.utf8
Консоль и раскладка клавиатуры
Файл /etc/vconsole.conf устанавливает настройки виртуальной консоли (раскладку клавиатуры и консольный шрифт).
/etc/vconsole.conf
KEYMAP=ru FONT=cyr-sun16
Другой способ настройки раскладки клавиатуры в консоли состоит в использовании команды:
# localectl set-keymap ru
Команда localectl также может быть использована для установки раскладки клавиатуры в X11:
# localectl set-x11-keymap ru
Для получения подробной информации о вариантах настройки обратитесь к руководствам man 1 localectl и man 5 vconsole.conf.
- Для получения детальной информации обратитесь к разделам консольные шрифты (англ.) и раскладка клавиатуры (англ.).
Временная зона
Временная зона настраивается путем создания соответствующей символической ссылки /etc/localtime на файл временной зоны в директории /usr/share/zoneinfo/. Чтобы сделать это автоматически, выполните команду:
# timedatectl set-timezone Europe/Moscow
Для получения подробной информации о вариантах настройки обратитесь к руководствам man 1 timedatectl, man 5 localtime и man 7 archlinux.
Альтернативный метод - создание символической ссылки вручную:
# ln -sf ../usr/share/zoneinfo/Europe/Moscow /etc/localtime
Если в вашей системе имеется прежний конфигурационный файл /etc/timezone, он теперь может быть безопасно удален, поскольку не используется systemd.
Аппаратные часы
Systemd будет использовать UTC для аппаратных часов по умолчанию.
Аппаратные часы по localtime
Если вы собираетесь выставить аппаратные часы по localtime (местному времени, что КАТЕГОРИЧЕСКИ НЕ РЕКОМЕНДУЕТСЯ), выполните команду:
# timedatectl set-local-rtc true
Если же захотите вернуть ваши аппаратные часы к использованию временного формата UTC, выполните:
# timedatectl set-local-rtc false
Помните, что настройка перехода на зимнее/летнее время - неблагодарное занятие. Если переход на зимнее/летнее время происходит в тот момент, когда ваш компьютер выключен, то при следующей загрузке ваши часы будут показывать ошибочное время (здесь об этом чуть подробнее (англ.)). Последние версии ядра устанавливают системное время из RTC (часов реального времени) непосредственно во время загрузки без использования hwclock, при этом ядро всегда считает, что RTC выставлено по UTC. Это означает, что если RTC выставлено по местному времени (local time), системное время будет изначально установлено ошибочно и затем корректироваться вскоре после этого при каждой загрузке. Это является причиной некоторых досадных багов (идущие назад часы редко являются нужной вещью).
Причиной, позволяющей RTC быть выставленными по местному времени, является двойная загрузка системы с Windows, (которая использует localtime (англ.)). Windows воспринимает RTC, выставленные по UTC при помощи простого исправления реестра (англ.). Рекомендуется настроить Windows на использование UTC, а не Linux на местное время. Если вы настроите Windows на использование UTC, также не забудьте отключить функцию "Обновление времени по Интернету" ("Internet Time Update"), иначе для Windows возникнет проблема с аппаратными часами, поскольку система будет пытаться синхронизировать их с временем через Интернет. Вместо этого следует оставить время в формате RTC и синхронизовать через Интернет в Linux посредством демона NTP, как это предлагалось выше.
- За дальнейшей информацией обратитесь к статье Time.
Подгружаемые модули ядра
Сегодня все необходимые модули для загрузки подгружаются автоматически с помощью Udev, так что, если вам не надо (или же вы не должны) использовать какой-нибудь модуль не из дерева ядра , нет необходимости дополнительно помещать какие-либо модули в какой-то файл конфигурации загрузки. Тем не менее, бывают случаи, когда вы можете подгрузить дополнительный модуль в процессе загрузки или поместить какой-то модуль в черный список, чтобы ваш компьютер работал правильно.
Дополнительно подгружаемые при загрузке модули
Необходимые для загрузки дополнительные модули оформляются в статический список файлов в директории /etc/modules-load.d/. Каждый из конфигурационных файлов имеет наименование вида /etc/modules-load.d/<program>.conf (где <program> - имя подгружаемого модуля) и содержит список имен подгружаемых модулей ядра, каждое из которых начинается с новой строки. При этом игнорируются как пустые строки конфигурационных файлов, так и строки, у которых первым символом, отличным о пробела, является символ # и ;. Например:
/etc/modules-load.d/virtio-net.conf
# Load virtio-net.ko at boot virtio-net
Более подробная информация содержится в руководстве man 5 modules-load.d.
Настройка параметров модулей
Дополнительные параметры модулей должны устанавливаться в конфигурационном файле /etc/modprobe.d/modprobe.conf.
Например:
- мы имеем
/etc/modules-load.d/loop.confс прописанным модулемloopдля подгрузки его во время загрузки системы.
- в файле
/etc/modprobe.d/modprobe.confопределяются дополнительные параметры, такие, какoptions loop max_loop=64.
Затем вновь установленные параметры могут быть проверены с помощью команды cat /sys/module/loop/parameters/max_loop.
Черный список
Добавление модулей в черный список работает также, как и в случае с initscripts, поскольку в действительности эта функция выполняется таким инструментом, как kmod. Обратитесь к разделу Module Blacklisting за более подробной информацией.
Монтирование файловых систем
Установка по умолчанию автоматически проверяет файловые системы командой fsck и монтирует файловые системы перед запуском тех сервисов, котрым необходимо иметь эти системы примонтированными. Например, systemd позволяет в автоматическом режиме добиться, что удаленные файловые системы наподобие NFS и Samba подключаются после поднятия сети. Поэтому монтирование как локальных, так и удаленных файловых систем, прописанных в /etc/fstab должно работать "из коробки".
Обратитесь к руководству man 5 systemd.mount для получения более подробной информации.
Автомонтирование
- Если ваш раздел
/homeзанимает большой объем, лучшим вариантом было бы позволить сервисам не зависеть от подключения/homeи запускать данные сервисы, когда/homeеще подвергается проверке при загрузке системы. Добиться такого результата можно добавлением следующих параметров в запись файла/etc/fstab, касающуюся раздела/home:
noauto,x-systemd.automount
Такие параметры вызовут команду fsck и примонтируют /home при первом обращении к данному разделу, и ядро будет буферизовать все файлы доступа к /home до готовности данного раздела.
- То же самое применимо и к удаленным файловым системам. Если вы хотите, чтобы монтирование данных систем происходило только по мере доступа к ним, вы можете использовать параметр
x-systemd.device-timeout=#в файле/etc/fstabдля определения таймаута в том случае, кода сетевые ресурсы оказываются недоступны.
- В случае использования зашифрованных файловых систем с ключами доступа, вам также Iследует добавить параметр
noautoв соответствующие записи файла/etc/crypttab. systemd не будет подключать зашифрованные устройства при загрузке, но, вместо этого, дождется реального обращения к ним и автоматически откроет к ним доступ с использованием определенных ключей перед тем, как они будут примонтированы. Это сэкономит несколько секунд при загрузке системы, например, в случае использования зашифрованного устройства RAID, потому что systemd не будет дожидаться от устройства, когда оно станет доступным. Например:
/etc/crypttab
data /dev/md0 /root/key noauto
LVM
Если у вас имеются тома LVM, не активированные посредством initramfs, включите сервис lvm-monitoring, который предоставляется пакетом lvm2:
# systemctl enable lvm-monitoring
Управлением питанием ACPI
Systemd обрабатывает некоторые события, связанные с ACPI, что настраивается при помощи параметров в конфигурационном файле /etc/systemd/logind.conf:
-
HandlePowerKey: определяет действия системы при нажатии кнопки питания (вкл./выкл.). -
HandleSuspendKey: определяет действия системы при нажатии кнопки спящего режима. -
HandleHibernateKey: определяет действия системы при нажатии кнопки ждущего режимаs. -
HandleLidSwitch: определяет действия системы при закрытии крышки компьютера.
Для соответствующих действий могут использоваться значения ignore (пропустить), poweroff (отключить питание), reboot (перезагрузить), halt (выключить), suspend (включить спящий режим), hibernate (включить ждущий режим), hybrid-sleep (включить режим гибридного сна), lock (заблокировать) или kexec (системный вызов позволяющий оперативно переключиться в другое ядро).
Если данные параметры не определены, по умолчанию systemd будет использовать следующие: HandlePowerKey=poweroff, HandleSuspendKey=suspend, HandleHibernateKey=hibernate, и HandleLidSwitch=suspend.
В системах без графического интерфейса (или использующих простые оконные менеджеры наподобие i3 или awesome) так можно заменить демон acpid, который обычно используется для реагирования на данные события ACPI.
В текущей версии systemd параметры Handle* будут применены ко всей системе, если только они не "подавляются (временно отключены) другой программой, такой, как менеджер питания данного окружения рабочего стола. Если эти ограничений нет, вы можете столкнуться с ситуацией, когда systemd приводит вашу систему в спящий режим, а затем, когда система пробуждается менеджером управлением питания, снова "усыпляет" ее.
Чтобы команда systemctl hibernate заработала в вашей системе, вам необходимо следовать инструкциям из раздела Hibernation, а также, возможно, из раздела Mkinitcpio Resume Hook (не требуется устанавливать pm-utils).
Хуки спящего режима
Systemd в своих командах systemctl suspend, {ic|systemctl hibernate}} или systemctl hybrid-sleep не использует pm-utils для "усыпления" машины; хуки pm-utils, включая любые пользовательские хуки не будут работать. Тем не менее, systemd предоставляет два схожих механизма запуска пользовательских скриптов для данных событий.
Сервис-файлы для спящего режима/возобновления работы
Сервис-файлы могут быть подключены к suspend.target, hibernate.target и sleep.target для выполнения действий до или после перевода системы в спящий/ждущий режимы. Отдельные файлы следует создавать для пользовательских действий или системных действий/действий, выполняемых суперпользователем root. Для включения пользовательских сервис-файлов, выполните команду # systemctl enable suspend@<user> && systemctl enable resume@<user>. Примеры:
/etc/systemd/system/suspend@.service
[Unit] Description=User suspend actions Before=sleep.target [Service] User=%I Type=forking Environment=DISPLAY=:0 ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop' ExecStart=/usr/bin/sflock [Install] WantedBy=sleep.target
/etc/systemd/system/resume@.service
[Unit] Description=User resume actions After=suspend.target [Service] User=%I Type=simple ExecStartPre=/usr/local/bin/ssh-connect.sh ExecStart=/usr/bin/mysql -e 'slave start' [Install] WantedBy=suspend.target
Для действий суперпользователя root/системных действий (включается командой # systemctl enable root-suspend):
/etc/systemd/system/root-resume.service
[Unit] Description=Local system resume actions After=suspend.target [Service] Type=simple ExecStart=/usr/bin/systemctl restart mnt-media.automount [Install] WantedBy=suspend.target
/etc/systemd/system/root-suspend.service
[Unit] Description=Local system suspend actions Before=sleep.target [Service] Type=simple ExecStart=-/usr/bin/pkill sshfs [Install] WantedBy=sleep.target
Несколько полезных советов по поводу этих сервис-файлах (подробности командой man systemd.service):
- В случае
Type=OneShotвы можете использовать несколько строкExecStart=. В противном случае допустима только одна строка ExecStart. Можно добавить больше команд либо при помощиExecStartPre, либо отдельными командами, разделенными точкой с запятой (;) (смотрите первый пример из приведенных выше - обратите внимание на пробелы до и после точки с запятой... это необходимо!). - Команды с префиксом '-' приведут к ненулевому (не "0") статусу выхода, который проигнорируется и будет рассматриваться как успешное завершение команды.
- Лучший способ обнаружения ошибок при диагностике данных сервис-файлов - конечно же, команда
journalctl.
Комбинированный сервис-файл спящего режима/возобновления работы
При помощи комбинированного сервис файла спящего-режима/возобновления работы единственный худ сделает всю работу для различных стадий работы компьютера (спящий режим/возобновление работы) и для различных целей (спящий режим/ждущий режим/гибридный рпежим сна).
Пример и объяснение:
/etc/systemd/system/wicd-sleep.service
[Unit] Description=Wicd sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/share/wicd/daemon/suspend.py ExecStop=-/usr/share/wicd/daemon/autoconnect.py [Install] WantedBy=sleep.target
-
RemainAfterExit=yes: После запуска сервис считается активным, пока не будет явно остановлен.
-
StopWhenUnneeded=yes: В случае, если сервис активен, он может быть остановлен, если нет нуждающихся в нем других активных сервисов. В данном примере он будет остановлен после остановки целевого файла sleep.target.
- Поскольку sleep.target. используемый такими целевыми юнатами, как suspend.target, hibernate.target, hybrid-sleep.target и самим sleep.target является сервисом StopWhenUnneeded, хук гарантирует старт/остановку различных задач должным образом.
Хуки в /usr/lib/systemd/system-sleep
Systemd запускает все исполняемые файлы в директории /usr/lib/systemd/system-sleep/, передавая каждому из них два аргумента:
- Аргумент 1: или
pre, илиpost, в зависимости от которых машина либо "уснет", либо будет "пробуждена"; - Аргумент 2: или
suspend, илиhibernateили жеhybrid-sleep, в зависимости от того, что было вызвано.
В отличие от pm-utils, systemd запустит данные скрипты одновременно, а не один после другого.
Вывод любого пользовательского скрипта будет записан сервисом systemd-suspend.service, systemd-hibernate.service или systemd-hybrid-sleep.service. Вы вы можете увидеть данный выход в журнале systemd:
# journalctl -b -u systemd-suspend
Обратите внимание, что вместо использования скриптов вы также можете использовать специальные целевые юниты - sleep.target, suspend.target, hibernate.target или hybrid-sleep.target для того, чтобы подключить к другим юнитам возможности перехода в спящий режима.
Пример пользовательского скрипта по переходу в спящий режим:
/usr/lib/systemd/system-sleep/example.sh
#!/bin/sh
case $1/$2 in
pre/*)
echo "Going to $2..."
;;
post/*)
echo "Waking up from $2..."
;;
esac
Не забудьте сделать ваш скрипт исполняемым:
# chmod a+x /usr/lib/systemd/system-sleep/example.sh
Обратитесь к руководствам man 7 systemd.special и man 8 systemd-sleep для получения дальнейшей информации.
Временные файлы
Systemd-tmpfiles использует конфигурационные файлы в директориях /usr/lib/tmpfiles.d/ и /etc/tmpfiles.d/ для определения действий с временными файлами и директориями (создание, очистка и удаление их), обычно расположенные в /run or /tmp. Каждый файл с настройками имеет название вида /etc/tmpfiles.d/<program>.conf. Данные конфигурационные файлы имеют приоритет по сравнению с любыми файлами с таким же названием, расположенными в директории /usr/lib/tmpfiles.d/.
Временные файлы tmpfiles обычно поставляются вместе с сервис-файлами для создания директорийк. которые, как ожидается, будут использоваться определенными демонами. Например, демон Samba предполагает наличие директории {/run/samba с соответствующими правами доступа. В данном случае tmpfile выглядит следующим образом:
/usr/lib/tmpfiles.d/samba.conf
D /run/samba 0755 root root
tmpfiles также могут использоваться для записи значений в определенные файлы во врем загрузки. К примеру, если вы используете /etc/rc.local для того, чтобы отключить пробуждение системы USB-устройствами, при помощи команды echo USBE > /proc/acpi/wakeup, вы можете вместо этого использовать следующий tmpfile:
/etc/tmpfiles.d/disable-usb-wake.conf
w /proc/acpi/wakeup - - - - USBE
Обратитесь к руководству man 5 tmpfiles.d за более подробной информацией.
Юнит
Юнит (англ. unit) - конфигурационный файл, содержащий информацию о сервисе (службе), сокете, устройстве, точке монирования/автомонирования, файле подкачке или разделе, определяемом для загрузки уровне запуска, пути в файловой системе или таймере, которые контролируются и управляются при помощи systemd. Синтаксис юнитов навеян спецификацией .desktop-файлов (XDG Desktop Entry Specification), которая, в свою очередь, вдохновлялась .ini-файлами от Microsoft Windows.
Обратитесь к руководству man 5 systemd.unit для получения дальнейшей информации.
Основы использования systemctl
Главная команда для наблюдения и контроля за состоянием systemd - команда systemctl. Некоторые из вариантов ее использования связаны с изучением состояния системы и управлением сервисами. Обратитесь к странцам руководства man 1 systemctl для получения более детальной информации.
Анализ состояния системы
Список запущенных юнитов:
$ systemctl
или:
$ systemctl list-units
Список юнитов, попытка запуска которых завершилась неудачей:
$ systemctl --failed
Доступные юниты можно посмотреть в директориях /usr/lib/systemd/system/ и /etc/systemd/system/ (последняя директория имеет приоритет). Вы можете увидеть список установленных юнитов командой:
$ systemctl list-unit-files
Использование юнитов
Юниты могут быть сервисами (.service), точками монтирования (.mount) или сокетами (.sockets). При использовании команды systemctl необходимо всегда указывать полное имя файла, включая расширение. Однако, есть несколько сокращений при определении юнита следующими командамиsystemctl:
- Ели вы не указали суффикс, systemctl предполагает, что это
.service. Например,netcfgиnetcfg.serviceбудут трактоваться одинаково. - Точки монтирования будут автоматически преобразованы в соответствующий юнит
.mount. Например, указание/homeравнозначноhome.mount. - Аналогично точкам монтирования, имена устройств автоматически преобразуются в соответствующий юнит
.device, поэтому указание/dev/sda2полностью соответствует юнитуdev-sda2.device.
Обратитесь к руководству man systemd.unit для получения детальной информации.
Незамедлительно запустить юнит:
# systemctl start <unit>
Незамедлительно остановить юнит:
# systemctl stop <unit>
Перезапустить юнит:
# systemctl restart <unit>
Запросить у юнита перезагрузку его настроек:
# systemctl reload <unit>
Показать статус юнита, а также запущен он или нет:
$ systemctl status <unit>
Проверить включение юнита (т.е. разрешен ли юниту запуск при загрузке системы):
$ systemctl is-enabled <unit>
Включить юнит (разрешить юниту запуск при загрузке системы):
# systemctl enable <unit>
Выключить юнит (запретить юниту запуск при загрузке системы):
# systemctl disable <unit>}}
Показать страницу помощи для юнита (необходима поддержка этой функции в указанном файле юнита):
$ systemctl help <unit>
Перезагрузить systemd с поиском новых или измененных юнитов:
# systemctl daemon-reload
Управление питанием
Для управления питанием необходим polkit.
Если у вас локальная пользовательская сессия systemd-logind и нет других активных сессий, приведенные ниже команды сработают и без привилегий суперпользователя root. В противном случае (например, вследствие того, что пользователь залогинился в tty), systemd автоматически запросит у вас пароль root.
Завершить работу и перезагрузить систему:
$ systemctl reboot
Завершить работу и выключить компьютер (с отключением питания):
$ systemctl poweroff
Перевести систему в спящий режим:
$ systemctl suspend
Перевести систему в ждущий режим:
$ systemctl hibernate
Перевести систему в режим гибридного сна (или suspend-to-both):
$ systemctl hybrid-sleep
Запуск менеджеров окружения рабочего стола из systemd
Чтобы включить графический вход в систему, запустите выбранный вами демон экранного менеджера (например, KDM). В настоящий момент доступны сервис-файлы для GDM, KDM, SLiM, XDM, LXDM и LightDM.
# systemctl enable kdm
Эта команда должна работать "из коробки". Если вдруг она не сработала, то, возможно, у вас default.target установлен вручную или остался с прежней установки:
# ls -l /etc/systemd/system/default.target
/etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target
Просто удалите символическую ссылку и systemd будет использовать целевой юнит по умолчанию - default.target (т.е. graphical.target).
# rm /etc/systemd/system/default.target
Использование systemd-logind
Для того, чтобы проверить статус вашей пользовательской сессии, вы можете использовать команду loginctl. Все действия PolicyKit наподобие перевода системы в спящий режим или монтирования внешних носителей с помощью Udisks должны работать автоматически.
$ loginctl show-session $XDG_SESSION_ID
Написание пользовательского файла .service
Смотрите статью: Systemd/Services
Обработка зависимостей
В случае использования systemd зависимости могут быть разрешены правильным построением файлов юнитов. ,Наиболее частый случай -- когда юниту A требуется, чтобы юнит B был запущен перед тем, как запустится сам юнит A. В этом случае добавьте строки Requires=B и After=B в секцию [Unit] сервис-файла юнита A. Если подобная зависимость не является обязательной, добавьте соответственно взамен указанных выше строки Wants=B и After=B. Обратите внимание, что Wants= и Requires= не подразумевают After=, что означает, что если After= не определено, два юнита будут запущены параллельно друг другу.
Обычно зависимости указываются в сервис-файлах, а не в целевых юнитах. Например, network.target потребуется любому сервису, который связан с настройкой ваших сетевых интерфейсов, поэтому в любом случае определите загрузку вашего пользовательского юнита после запуска network.target.
Тип
Существует несколько различных типов запуска служб, которые надо иметь в виду при написании пользовательского сервис-файла. Тип запуска определяется параметром Type= в секции [Service]. Обратитесь к руководству man systemd.service для получения более детального объяснения.
-
Type=simple(по умолчанию): systemd предполагает, что сервис будет запущен незамедлительно. Процесс при этом не должен форкнуться. Не используйте этот тип, если другим сервисы зависят от очередности при запуске данного сервиса, за исключением активации сокета. -
Type=forking: systemd предполагает, что сервис запускается однократно, процесс форкается и родительский процесс завершается. Используйте данный тип для запуска классических демонов за исключением тех случаев, когда, как вам известно, в таком поведении процесса нет необходимости. Вам следует также определитьPIDFile=, чтобы systemd могла отслеживать основной процесс. -
Type=oneshot: Полезен для скриптов, которые выполняют одну работу, а потом завершаются. Вам может понадобиться также установить параметрRemainAfterExit=yes, чтобы systemd по-прежнему считала процесс активным, даже после его завершения -
Type=notify: Идентичен параметруType=simple, но с той оговоркой, что демон пошлет systemd сигнал о своей готовности. Эталонная реализация данного уведомления обеспечивается библиотекойlibsystemd-daemon.so. -
Type=dbus: Сервис считается находящимся в состоянии готовности, когда определенноеBusNameпоявляется в системной шине DBus.
Редактирование предоставленных пакетами файлов юнитов
Для того, чтобы отредактировать предоставляемый пакетом файл юнита, вы можете создать директорию {/etc/systemd/system/<unit>.d/ (например, /etc/systemd/system/httpd.service.d/) и поместить в нее файлы place *.conf, чтобы переопределить настройки данных файлов или чтобы добавить новые параметры. Systemd проведет парсинг данный файлов *.conf и применит их настройки поверх настроек поставляемого исходного юнита. Например, если вы просто хотите добавить в сервис-файл дополнительную зависимость, вы можете исоздать следующий файл:
/etc/systemd/system/<unit>.d/customdependency.conf
[Unit] Requires=<new dependency> After=<new dependency>
Затем выполните следующие команды для того, чтобы изменения вступили в силу:
# systemctl daemon-reload # systemctl restart <unit>
В качестве другого варианта вы можете скопировать старый юнит из директории /usr/lib/systemd/system/ в директорию /etc/systemd/system/ aи применить свои изменения в последней директории. Юнит-файл в директории /etc/systemd/system/ всегда имеет приоритет и переопределяет настройки такого же юнита в директории /usr/lib/systemd/system/. Обратите внимание, что поставляемый исходный юнит в директории /usr/lib/ изменяется при обновлении пакета и эти изменения не будут автоматически применены к вашему отредактированному юниту в директории /etc/. Дополнительно вы должны вручную выполнить команду systemctl reenable <unit>, чтобы изменения вступили в силу. В силу указанных соображений рекомендуется вместо данного варианта использовать описанный выше метод с файлами в директории *.conf.
Подсветка синтаксиса файлов юнитов в Vim
Подсветка синтаксиса файлов юнитов для systemd в редакторе Vim может быть осуществлена путем установки пакета vim-systemd из официальных репозиториев.
Уровни запуска/цели
Уровни запуска (по-английски уровень запуска - runlevel) для systemd являются устаревшей концепцией. Systemd использует цели (англ. target), которые выполняют ту же задачу, что и уровни запуска, но действуют немного по-другому. Каждая цель поименована (т.е. имеет собственное имя, а не номер) и, как предполагается, предназначена для конкретных задач; возможно иметь в одно и то же время активными несколько таких целей. Некоторые цели реализованы так, что наследуют все сервисы других целей и добавляют к ним свои сервисы. В systemd имеются также цели, которые имитируют общие уровни запуска SystemVinit, поэтому вы можете переключаться между целевыми юнитами с использованием привычной команды telinit RUNLEVEL.
Получение информации о текущем уровне запуска/цели
При использовании systemd для этого предназначена следующая команда (заменяющая runlevel):
$ systemctl list-units --type=target
Создание пользовательской цели
Уровни запуска, по которым расписаны конкретные задачи на установке дистрибутива Fedora по умолчанию - 0, 1, 3, 5 и 6; есть маппинг 1:1 с помощью конкретной цели systemd. К сожалению, не существует хорошего способа сделать то же самое для определяемых пользователем уровней, таких, как 2 и 4. Использование их предполагает, что вы создаете новый именованный целевой юнит systemd наподобие /etc/systemd/system/<your target>, который берет за основу один из существующих уровней запуска (взгляните, например, на /usr/lib/systemd/system/graphical.target), создаете также директорию /etc/systemd/system/<your target>.wants и затем символические ссылки на те дополнительные сервисы из директории /usr/lib/systemd/system/, которые вы хотите включить при загрузке.
Таблица уровней запуска и их аналогов в Systemd
| Уровнень запуска SysV | systemd Target | Примечание |
|---|---|---|
| 0 | runlevel0.target, poweroff.target | Выключить систему. |
| 1, s, single | runlevel1.target, rescue.target | Однопользовательский уровень запуска. |
| 2, 4 | runlevel2.target, runlevel4.target, multi-user.target | Уровень запуска, определенный пользователем/специфичный для узла. По умолчанию соответствует уровню запуска 3. |
| 3 | runlevel3.target, multi-user.target | Многопользовательский режим без графики. Пользователи, как правило, входят с помощью множества консолей или через сеть. |
| 5 | runlevel5.target, graphical.target | Многопользовательский режим с графикой. Обычно эквивалентен запуску всех сервисов уровня 3 и графическому менеджеру входа. |
| 6 | runlevel6.target, reboot.target | Перезагрузка. |
| emergency | emergency.target | Аварийная оболочка. |
Изменение текущей цели
В systemd цели доступны посредством " целевых юнитов". Вы можете изменить их командой:
# systemctl isolate graphical.target
Данная команда изменит только лишь текущую цель и не повлияет на следующую загрузку системы. Она соответствует командам наподобие telinit 3 или telinit 5 для Sysvinit.
Изменение цели для загрузки
Стандартная цель - default.target, которая по умолчанию является псевдонимом юнита graphical.target (примерно соответствующего прежнему уровню выполнения 5). Для изменения цели при загрузке по умолчанию, добавьте следующий дополнительный параметр ядра в вашем загрузчике:
-
systemd.unit=multi-user.target(что примерно соответствует прежнему уровню выполнения 3), -
systemd.unit=rescue.target(что примерно соответствует прежнему уровню выполнения 1).
Другой путь заключается в том, чтобы оставить загрузчик без изменений и изменить целевой юнит по умолчанию - default.target, что достигается командой systemctl:
# systemctl enable multi-user.target
Эффект от применения данной команды выводится через systemctl; символическая ссылка на новый целевой юнит по умолчанию создается в директории /etc/systemd/system/default.target. Это сработает в том случае (и только в том случае), если имеется следующая секция:
[Install] Alias=default.target
в конфигурационном файле целевого юнита. В настоящий момент как multi-user.target, так и graphical.target оба имеют данную секцию.
Журнал
С версии 38 systemd имеет собственную систему ведения логов - журнал (journal). По умолчанию, более не требуется запуск демона syslog. Для чтения логов используйте команду:
# journalctl
По умолчанию (когда в конфигурационном файле /etc/systemd/journald.conf параметр Storage= имеет значение auto) журнал записывается в директорию /run/systemd/journal. Директория /var/log/journal/ создается при установке core/systemd. В случае, если вы или какая-либо программа удалили ее), systemd не воссоздаст ее автоматически , но при следующем обновлении systemd эта директория будет восстановлена. До восстановления данной директории, логи будут записываться в директорию /run/systemd/journal. Это означает, что логи будут потеряны при перезагрузке.
Фильтрация вывода
journalctl позволяет фильтровать вывод по особым полям.
Примеры:
Показать все сообщения с момента текущей загрузки системы:
# journalctl -b
Однако часто интерес представляют сообщения, выданные во время не текущей, а предыдущей загрузки системы (например, если произошел неустраненный аварийный отказ системы). В настоящее время данная функция еще не реализована, хотя прошла дискуссия на systemd-devel@lists.freedesktop.org (сентябрь/октябрь 2012).
В качестве решения проблемы в настоящее время можно использовать следующую команду:
# journalctl --since=today | tac | sed -n '/-- Reboot --/{n;:r;/-- Reboot --/q;p;n;b r}' | tac
при условии, что предыдущая загрузка системы прошла сегодня. Имейте в виду, что, если на данный день имеется много сообщений, вывод данной команды произойдет с определенной задержкой.}}
Последние сообщения:
# journalctl -f
Показать все сообщения определенной программы:
# journalctl /usr/lib/systemd/systemd
Показать все сообщения определенного процесса:
# journalctl _PID=1
Показать все сообщения определенного юнита:
# journalctl -u netcfg
Обратитесь к man journalctl и systemd.journal-fields или блог Леннерта (англ.) для получения детальной информации.
Ограничение размера журнала
Если журнал сохраняется при перезагрузке, размер его по умолчанию ограничен значением в 10% от объема соответствующей файловой системы. Например, для директории /var/log/journal, расположенной на корневом разделе в 50 Гбайт, максимальный размер журналируемых данных составит до 5 Гбайт. Максимальный объем постоянного журнала можно контролировать при помощи значения SystemMaxUse в конфигурационном файле /etc/systemd/journald.conf, поэтому для ограничения его объемом в 50 Mбайт раскомментируйте и отредактируйте соответствующую строку:
SystemMaxUse=50M
Обратитесь к man journald.conf для получения дальнейшей информации.
Journald в связке с классическим демоном syslog
Совместимость с классической реализацией syslog обеспечивается сокетом /run/systemd/journal/syslog, в который перенаправляются все сообщения. Чтобы дать возможность демону syslog работать вместе с журналом systemd, следует привязать данный демон к указанному сокету вместо /dev/log (официальное сообщение). Пакетом syslog-ng в репозиториях автоматически предоставляется необходимая конфигурация.
# systemctl enable syslog-ng
Хорошее руководство по journalctl находится здесь (англ.)
Сеть
Динамическое подключение (DHCP) с использованием dhcpcd
Если хотите использовать только DHCP для своего соединения Ethernet, вы можете воспользоваться сервисом dhcpcd@.service (который поставляется пакетом dhcpcd).
Сначала надо узнать наименование своего сетевого интерфейса командой ip addr. Чтобы подключить DHCP для <имя сетевого интерфейса>, просто выполните команду:
# systemctl start dhcpcd@<имя сетевого интерфейса>.service
Например, если имя сетевого интерфейса enp9s0:
# systemctl start dhcpcd@enp9s0.service
Вы можете включить этот сервис, и он будет автоматически запускаться при загрузке. Это делается командой:
# systemctl enable dhcpcd@<имя сетевого интерфейса>.service
Иногда сервис dhcpd запускается до загрузки модуля вашей сетевой карты (FS#30235), в этом случае вручную добавьте вашу сетевую карту в конфигурационный файл /etc/modules-load.d/*.conf. Например, для карты Realtek необходима загрузка модуля r8169, поэтому создайте такой конфигурационный файл:
/etc/modules-load.d/realtek.conf
r8169
Другие конфигурации
Для статического подключения, беспроводной сети или сложной конфигурации сети наподобие сетевого моста, вы можете использовать netcfg или NetworkManager, для обоих этих инструментов управления сетью имеются сервис-файлы для systemd.
Оптимизация
Анализ процесса загрузки
Использование systemd-analyze
Systemd предоставляет инструмент под названием systemd-analyze, позволяющий проанализировать процесс загрузки вашей системы, чтобы можно было увидеть, какие файлы юнитов тормозят загрузку. Соответственно, вы можете оптимизировать вашу систему. Для использования данного инструмента вам потребуется установить пакеты python2-cairo и python2-gobject.
Чтобы увидеть, сколько времени было потрачено на подготовку пространства ядра и пространства пользователя во время загрузки, просто выполните команду:
$ systemd-analyze
Чтобы увидеть список запускаемых файлов юнитов, отсортированный по потраченному каждым из них на загрузку времени, выполните команду:
$ systemd-analyze blame
Вы также можете создать файл SVG, показывающий процесс загрузки в графическом виде, наподобие Bootchart:
$ systemd-analyze plot > plot.svg
Использование systemd-bootchart
Bootchart объединен с systemd с 17 октября 2012 года и вы можете использовать его для загрузки также, как и оригинальный bootchart. Добавьте следующие команду к строке инициализации ядра:
initcall_debug printk.time=y init=/usr/lib/systemd/systemd-bootchart
Использование bootchart2
Вы также можете использовать версию bootchart для визуализации последовательности при загрузке системы. Из-за невозможности использовать стандартные установки bootchart (так как нельзя добавить в командную строку ядра вторую запись init), вам придется воспользоваться пакетом bootchart2 из AUR, поставляемым с недокументированным сервисом systemd. После установки bootchart2 выполните команду:
# systemctl enable bootchart
Обратитесь к документации bootchart (англ.) за дальнейшей и детализированной информацией об использовании данной версии bootchart.
Readahead
systemd поставляется со свой реализации технологии readahead, что в принципе должно усовершенствовать процесс загрузки системы. Однако, в зависимости от версии вашего ядра и типа жесткого диска, скорость обращения к данным может разниться (например, может быть медленнее). Чтобы включить данный сервис, выполните:
# systemctl enable systemd-readahead-collect systemd-readahead-replay
Не забудьте, что волшебство технологии readahead подействует только после нескольких перезапусков системы
Устранение неполадок
Выключение/перезагрузка происходят ужасно долго
Если процесс выключения занимает очень долгое время (или, по-видимому, зависает), то, вероятно, виноват сервис, который не завершает свою работу. systemd ожидает некоторое время, пока каждый сервис завершит свою работу самостоятельно, и только потом пытается принудительно завершить (kill) его. Если вы столкнулись с такой проблемой, обратитесь к данной статье (англ.).
По-видимому, процессы с кратким сроком жизни не оставляют записей в протоколах
Если команда journalctl -u foounit не показывает выхода для сервиса с коротким сроком жизни, вместо нее обратитесь к PID. Например, если загрузка сервиса systemd-modules-load.service завершилась неудачно и команда systemctl status systemd-modules-load показывает, что он был запущен с PID 123, то вы сможете посмотреть выход процесса в журнале под данным PID, то есть командой journalctl -b _PID=123. Такие поля метаданных для журнала, как _SYSTEMD_UNIT и _COMM собираются асинхронно и зависят от директории /proc в случае с действующими процессами. Исправление этой ситуации требует внесения исправлений в ядро для обеспечения этих данных через сокет, наподобие SCM_CREDENTIALS.
Диагностика проблем при загрузке
Загрузитесь с указанными ниже параметрами командной строки ядра:
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
Для получения дополнительной информации обратитесь к странице проекта systemd More Debugging Information (англ.).
Полезные ссылки
- Официальный веб-сайт (англ.)
- Страницы руководств (англ.)
- systemd Optimizations (англ.)
- FAQ (англ.)
- Tips And Tricks (англ.)
- The Biggest Myths (англ.)
- systemd для администраторов (PDF) - перевод цикла статей Леннарта Поттеринга (Lennart Poettering)
- Блог Lennart'а (англ.)
- часть 1 и часть 2 вводной статьи в журнале The H Open (англ.)
- systemd mini FAQ
- Fedora Linux Wiki: Systemd (англ.)
- Fedora's SysVinit to systemd cheatsheet (англ.)
- systemd - база знаний проекта Fedora
- Debian Wiki: systemd - менеджер системы и сервисов
- Ubuntu Wiki: systemd (англ.)