Systemd (Русский)

From ArchWiki
Revision as of 07:12, 20 October 2012 by Klay (Talk | contribs) (Полезные ссылки)

Jump to: navigation, search

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end Цитата с веб-страницы проекта:

"systemd - система [инициализации] и менеджер сервисов для Linux, совместимые со скриптами инициализации SysV и LSB. systemd обеспечивает возможности агрессивной параллелизации, использует сокеты и активацию D-Bus для запускаемых сервизов, предлагает запуск демонов по необходимости, отслеживает процессы при помощи контрольных групп Linux, поддерживает мгновенные снимки и восстановление состояния системы, монтирование и точки монтирования, а также внедряет основанную на зависимостях логику контроля процессов сложных транзакций. Эта система может выступать заменой sysvinit.".

Note: За детальным объяснением причин перехода Arch'а на systemd обратитесь к сообщению на англоязычном форуме.

Смотрите также статью в Википедии.

Contents

Что надо усвоить до начала миграции на данную систему

  • Настоятельно рекомендуется перейти на новую конфигурацию initscripts, описанную в статье rc.conf. Сконфигурировав таким образом свою систему, вы проделаете бóльшую часть работы, необходимую для миграции на systemd.
  • Почитайте про systemd на сайте разработчиков.
  • Обратите внимание, что systemd имеет собственный журнал (journal), заменяющий syslog, хотя оба варианта ведения логов могут сосуществовать. Обратитесь к приведенному ниже разделу разделу, посвященному журналу.
  • Хотя systemd вполне способна заменить определенную функциональность таких демонов, как cron, acpid или xinetd, но если вы не хотите, можете не отказываться от использования традиционных демонов.

Установка

systemd может быть установлен параллельно со стандартным пакетом инициализации initscripts, и между ними можно будет переключаться путем добавления/удаления параметров ядра init=/usr/lib/systemd/systemd.

Смешанная установка systemd/sysvinit/initscripts

Возможно иметь в своей системе одновременно установленными systemd и sysvinit и использовать одну и те же конфигурационные файлы, что позволит вам свободно переключаться между ним туда и обратно:

  1. Откажитесь от устаревших форматов конфигурации initscripts (о них сообщается при загрузке системы) в пользу родных системных файлов systemd и перезагрузитесь для проверки работоспособности данных установок при использовании initscripts.
  2. Установите пакет systemd из официальных репозиториев.
  3. Добавьте запись init=/usr/lib/systemd/systemd к параметрам ядра в вашем загрузчике.
  4. Перезагрузите систему.

Systemd запустит демоны, перечисленные в /etc/rc.conf, выполнит /etc/rc.local и /etc/rc.local.shutdown соответственно при загрузке/выключении системы. Если поддержка совместимости с массивом DAEMONS в конфигурационном файле rc.conf или же скриптов в rc.local вам не нужна, соответствующие сервис-файлы могут быть заблокированы (замаскированы) для их отключения.

Warning: В случае, когда у вас в массиве DAEMONS перечислены демоны, для которых имеются родные сервис-файлы systemd, автоматически будут использоваться родные сервис-файлы. Тем не менее, если имена скриптов rc и сервисов systemd не соответствуют друг другу, данное правило не сработает и вам следует убедиться, что только включен только один из них двух (предпочтительно родной сервис-файл).
Warning: Systemd - процесс асинхронной загрузки по сравнению сравнении с последовательным запуском демонов из массива DAEMONS. В частности, "network", будучи поддерживаемым для совместимости сервисом, может запуститься слишком поздно для включения интерфейсов, которые требуются другим сервисам. Рекомендуется переключиться на использование netcfg или NetworkManager до перехода на systemd.

Смешанная установка systemd/initscripts

Возможно заменить sysvinit на systemd, но сохранить initscripts в случае использования некоторых скриптов rc scripts, для которых пока не имеется эквивалентов в systemd.

  1. Следуйте инструкциям для смешанной установки systemd/sysvinit/initscripts.
  2. Включите демоны, ранее перечисленные в /etc/rc.conf с помощью команды systemctl enable daemonname.service . Для переноса демонов из /etc/rc.conf в разряд сервисов systemd, смотрите разделы: List of Daemons и Services. Демоны, для которых не имеется соответствующих сервис-файлов systemd, следует оставить в массиве DAEMONS, поскольку systemd запустит устаревшие скрипты rc.
  3. Установите пакет systemd-sysvcompat. Данный пакет конфликтует с sysvinit и вам будет предложено удалить последний.
  4. Удалите запись init=..., поскольку /sbin/init теперь является символической ссылкой на systemd.
  5. Перезагрузите систему.

Единственная разница между этим вариантом и вариантом с сохранением sysvinit состоит в том, что все бинарные файлы sysvinit заменены символическими ссылками на systemctl. Тем не менее, функциональность должна остаться неизменной.

Note: Вам следует использовать NetworkManager.service (запомните употребление в данном названии букв в верхнем регистре) для включения сервиса network manager'а, в противном случае вы получите сообщение об ошибке и сервис не запустится во время загрузки системы.

Чистая установка systemd

Напоследок, возможно вовсе удалить initscripts и sysvinit и использовать только лишь systemd.

  1. Следуйте инструкциям для смешанной установки systemd/initscripts.
  2. Убедитесь, что более не имеется каких-либо демонов для запуска из массива DAEMONS в конфигурационном файле /etc/rc.conf и оба файла /etc/rc.local и /etc/rc.local.shutdown пусты.
  3. Удалите пакет initscripts из вашей системы.

Дополнительная информация

Tip: Если в параметрах ядра имеется значение quiet, вероятно, вам стоит удалить его для нескольких первых загрузок systemd, чтобы видеть возникающие во время загрузке проблемы.

Родные системные файлы в systemd

Note: Возможно, вам придется создать эти файлы. Установите для них права доступа 644 и владельца root:root.

systemd будет использовать /etc/rc.conf, если эти конфигурационные файлы отсутствуют. Обратите внимание, что такое использование может быть только временным решением. Настоятельно рекомендуется для любой системы использовать конфигурационные файлы systemd.

Имя компьютера (hostname)

/etc/hostname
myhostname

Консоль и раскладка клавиатуры

Файл /etc/vconsole.conf устанавливает настройки виртуальной консоли: раскладку клавиатуры и консольный шрифт.

/etc/vconsole.conf
KEYMAP=ru
FONT=cyr-sun16
FONT_MAP=

Для получения детальной информации обратитесь к разделам Console fonts and Keymap.

Note: systemd-194 использует шрифт ядра и раскладку по умолчанию (т.е. американскую английскую). Нет более необходимости (для тех, кто использует данную раскладку) иметь в конфигурационном файле строки KEYMAP= и FONT= с пустыми значениями.

Локаль

Для получения подробной информации о вариантах настройки обратитесь к руководству man locale.conf

/etc/locale.conf
LANG=ru_RU.UTF-8

Дальнейшая информация содержится в статье Locale.

Временная зона

Для получения подробной информации о вариантах настройки обратитесь к руководству man 5 localtime.

# ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime
Note: Прежний конфигурационный файл /etc/timezone объявлен устаревшим с выходом systemd-190 и может/должен быть удален.

Аппаратные часы

Systemd будет использовать UTC для аппаратных часов, именно такой вариант рекомендуется. Настройка зимнего/летнего времени - неблагодарное занятие. Если переход на зимнее/летнее время происходит в тот момент, когда ваш компьютер выключен, то при следующей загрузке ваши часы будут показывать ошибочное время (здесь об этом чуть подробнее (англ.)). Последние версии ядра устанавливают системное время из RTC (часов реального времени) непосредственно во время загрузки без использования hwclock, при этом ядро всегда считает, что RTC выставлено по UTC. Это означает, что если RTC выставлено по местному времени (local time), системное время будет изначально установлено ошибочно и затем корректироваться вскоре после этого при каждой загрузке. Это является причиной некоторых досадных багов (идущие назад часы редко являются нужной вещью).

Причиной, позволяющей RTC быть выставленными по местному времени, является двойная загрузка системы с Windows, (которая использует localtime (англ.)). Windows воспринимает RTC, выставленные по UTC при помощи простого исправления реестра. Если вы столкнетесь с подобными проблемами при двойной загрузке с Windows, вы можете установить аппаратные часы на использование местного времени.

/etc/adjtime
0.0 0.0 0.0
0
LOCAL

Другие параметры по-прежнему нужны, но они игнорируются systemd.

Обычно рекомендуется запускать демон Network Time Protocol для поддержания синхронизации аппаратных часов с системным временем.

Загрузка модулей ядра

systemd использует файлы-списки из /etc/modules-load.d/ для загрузки модулей ядра во время запуска системы. Каждый такой файл имеет название вида /etc/modules-load.d/<program>.conf. В каждой строке конфигурационного файла пишется название модуля ядра для загрузки. Игнорируются пустые строки и строки, у которых первый символ, отличный от пробела, будет # либо ;. Пример:

/etc/modules-load.d/modules.conf
microcode
fglrx

См. также Modprobe#Options

Чёрный список модулей ядра

Добавление модулей в чёрный список работает также, как и с initscripts т.к. на самом деле этим занимается kmod. Подробней на Module Blacklisting

Временные файлы

Systemd-tmpfiles использует файлы настроек из /etc/tmpfiles.d/ для описания создания, очистки, удаления временных файлов и директорий, обычно располагающихся в /run или /tmp. Каждый файл с настройками имеет название вида /etc/tmpfiles.d/<program>.conf и имеент приоритет использования над файлом с таким же названием из /usr/lib/tmpfiles.d/.

tmp-файлы обычно идут вместе с сервисами для создания директории, которые используются этими сервисами. Например, демон Samba ожидает наличия директории /var/run/samba c корректными правами, соответственно tmp-файл будет примерно следующего вида:

/usr/lib/tmpfiles.d/samba.conf
D /var/run/samba 0755 root root

Однако, tmp-файлы могут также быть полезны, если необходимо записывать некоторые значения в файл(ы) при загрузке системы. Например, если вы используете /etc/rc.local для отключения пробуждения USB-усройств через echo USBE > /proc/acpi/wakeup, то вместо этого вы можете создать tmp-файл вида:

/etc/tmpfiles.d/disable-usb-wake.conf
w /proc/acpi/wakeup - - - - USBE

Способ с tmp-файлами более предпочтителен, т.к. systemd не задействует /etc/rc.local по умолчанию См. man tmpfiles.d для подробностей.

Монтирование удалённых файловых систем

systemd производит монтирование удалённых ресурсов по NFS или Samba только после заверщения настройки сети. Поэтому удалённые файловые системы прописанные в /etc/fstab должны работать "из коробки".

Тем не менее, вы можете использовать Automount для монтирования удалённых файловых систем, по мере доступа к ним. Дополнительно можно указать параметр монтирования x-systemd.device-timeout=# в /etc/fstab для обозначения таймаута в случае, если ресурс недоступен.

Подробней в man systemd.mount

Замена acpid на systemd

Systemd может обрабатывать некоторые события ACPI. Это настраивается через следующие параметры в /etc/systemd/logind.conf:

  • HandlePowerKey : выключить компьютер после нажания кнопки включения.
  • HandleSleepKey : уснуть после нажатия кнопки "сна".
  • HandleLidSwitch : уснуть после закрытия крышки ноутбука.

В зависимости от значения этих параметров, эти действия могут выполняться, например, только тогда, когда никто из пользователей не вошёл в систему (no-session). Или только тогда, когда активна одна сессия пользователя (any-session). См. подробнее man logind.conf

Данные параметры не должны использоваться в окружениях рабочего стола подобных Gnome или XFCE, т.к. они обрабатывают события ACPI самостоятельно. Однако, на системах без установленной графической оболочки, или только с простым оконным менеджером типа i3 или awesome, возможно использовать systemd вместо acpid.

Юниты

Юнит это файл с конфигурацией, который содержит в себе информацию о сервисе, сокете, устройстве, точке (авто)монтирования, файле или разделе подкачки, "целевая единица", пути в файловой системе или таймере, управляемыми посредством systemd. Формат юнита сделан наподобие .desktop-файлов XDG Desktop Entry Specification, которые в свою очередь похожи на .ini-файлы Microsoft Windows. Cм. man systemd.unit за подробной информацией.

Команды systemd

  • systemctl: используется для наблюдения и контроля за состоянием sytemd и сервисов.
  • systemd-cgls: показывает древовидную структуру cgroups.
  • systemadm: графическая оболочка для systemd. Позволяет наблюдать и управлять состоянием systemd и сервисов (доступна посредством установки пакета systemd-ui-gitAUR)

См. страницы руководства man для получения подробной информации.

Tip: Вы можете использовать все нижеизложенные команды systemctl c параметром -H <user>@<host> для управления systemd, работающим на удалённой машине. В этом случае для соединения с удалённым процессом systemd будет использоваться SSH.

Анализ состояния системы

Список запущенных юнитов:

$ systemctl

или:

$ systemctl list-units

Cписок юнитов, отказавших в работе:

$ systemctl --failed

Доступные юниты можно посмотреть в директориях /usr/lib/systemd/system/ и /etc/systemd/system/ (последняя директория имеет приоритет).

Использование юнитов

Юниты могут быть сервисами (.service), точками монтирования (.mount) или сокетами (.sockets). При использовании команды systemctl необходимо всегда указывать полное имя файла, включая расширение. Например, netcfg.service. См. 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>

Управление питанием

Если вы локальный пользователь, и никто кроме вас больше не имеет активной сессии, то нижеприведённые команды работают без прав суперпользователя root. В противном случае, systemd автоматически запросит у вас пароль root.

Завершить работу и перезагрузить компьютер:

$ systemctl reboot

Завершить работу и выключить компьютер:

$ systemctl poweroff

Завершить работу и остановить(без выключения питания?) компьютер::

$ systemctl halt

Перевести систему в состояние ожидания:

$ systemctl suspend

Перевести систему в состояние гибернации:

$ systemctl hibernate

Запуск окружения рабочего стола из systemd

Использование экранного менеджера

Для графического входа в систему, необходимо запустить Display Manager (Русский). На данный момент доступны файлы сервисов для GDM, KDM, SLiM, XDM и LXDM.

# systemctl enable kdm.service

Запуск экранного менеджера должен работать "из коробки". Если не работет то, возможно, у вас 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

Если для настроек локали используется /etc/locale.conf, то добавьте строчку в /etc/environment:

/etc/environment
LANG=ru_RU.utf8

Запуск через файл сервиса

Note: При использование данного метода PAM-сессия не создастся для вашего пользователя. Поэтому ConsoleKit (предоставляет вам доступ к выключению\перезагрузке, устройствам аудио и т.д.) не будет корректно работать. Рекомендовано искользовать Automatic_login_to_virtual_console#With_systemd.

Если вам нужно просто напрямую, без экранного менеджера, запустить X, то вы можете создать файл сервиса примерно такого вида:

/etc/systemd/system/graphical.target.wants/xinit.service
[Unit]
Description=Direct login to X
After=systemd-user-sessions.service

[Service]
ExecStart=/bin/su <username> -l -c "/bin/bash --login -c xinit"

[Install]
WantedBy=graphical.target

Журнал systemd

С версии 38 systemd имеет собственную систему ведения логов - журнал (journal).

По умолчанию, более не требуется запуск демона syslog. Для чтения логов используйте команду:

# journalctl

Журнал записывается в директорию /run/systemd/journal, поэтому логи будут потеряны при перезагрузке. Для сохранения логов создайте директорию /var/log/journal/:

# mkdir /var/log/journal/

Фильтрация вывода

journalctl позволяет фильтровать вывод по особым полям.

Примеры:

Показать все сообщения определенной программы:

# journalctl /usr/lib/systemd/systemd

Показать все сообщения определенного процесса:

# journalctl _PID=1

Показать все сообщения определенного юнита:

# journalctl _SYSTEMD_UNIT=netcfg.service

Обратитесь к 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, измените раздел source src в конфигурационном файле /etc/syslog-ng/syslog-ng.conf по следующем образцу:

source src {
    unix-dgram("/run/systemd/journal/syslog");
    internal();
    file("/proc/kmsg");
};

и включите syslog-ng:

# systemctl enable syslog-ng.service

Сеть

Динамическое подключение (DHCP) с использованием dhcpcd

Если хотите использовать только DHCP для своего соединения Ethernet, вы можете воспользоваться сервисом dhcpcd@.service (который поставляется пакетом dhcpcd).

Чтобы подключить DHCP для eth0, просто выполните команду:

# systemctl start dhcpcd@eth0.service

Вы можете включить этот сервис, и он будет автоматически запускаться при загрузке. Это делается командой:

# systemctl enable dhcpcd@eth0.service

Иногда сервис dhcpd запускается до загрузки модуля вашей сетевой карты (FS#30235), в этом случае вручную добавьте вашу сетевую карту в конфигурационный файл /etc/modules-load.d/*.conf. Например, для карты Realtek необходима загрузка модуля r8169, поэтому создайте такой конфигурационный файл:

/etc/modules-load.d/realtek.conf
r8169

Другие конфигурации

Для статического подключения, беспроводной сети или сложной конфигурации сети наподобие сетевого моста, вы можете использовать netcfg или NetworkManager, для обеих этих инструментов управления сетью имеются сервис-файлы для systemd.

Note: Если вы хотите использовать netcfg, networkmanager или другие программы управления сетью, вам не надо в этом случае запускать или включать сервис dhcpcd как показано в предыдущем параграфе.

Интеграция с Arch

/etc/inittab не читается systemd, но стандартные установки systemd соответствуют стандартным установкам inittab. /etc/rc.local и /etc/rc.local.shutdown запускаются boot/shutdown как и раньше. Чтобы отключить их, выполните 'systemctl disable rc-local.service'. Большинство параметров /etc/rc.conf читаются systemd. Для чистой установки systemd рккомеднуется использовать нативные конфигурационные файлы (такие как /etc/locale.conf, /etc/vconsole.conf, /etc/hostname, /etc/modules-load.d/*.conf - подробнее смотри http://0pointer.de/public/systemd-man/), которые имеют приоритет над /etc/rc.conf.

Поддерживаются

  • LOCALE
  • KEYMAP
  • CONSOLEFONT
  • CONSOLEMAP
  • HOSTNAME (этот и все вышеперечисленные считываются во время загрузки системы, нативные systemd конфигурационные файлы имеют более выоский приоритет)
  • TIMEZONE (устанавливается при выключении)
  • MODULES (чёрный список поддерживается)
  • DAEMONS (порядок и чёрный список поддерживаются, если нативные systemd service-файл существует, имеющий такое же имя, то нативный файл имеет более высокий приоритет, отключить этот механизм можно с помощью 'systemctl disable arch-daemons.target').

Не поддерживаются

  • HARDWARECLOCK (используйте 'hwclock --systohc --utc' чтобы установить часы в utc, localtime не поддерживается, смотри FAQ)
  • USELVM (используйте 'systemctl enable|disable lvm-activate.service' вместо этого)
  • USECOLOR

Пакет initscripts-systemd

Этот пакет включает в себя юнит файлы и скрипты, кторые нужны, чтобы эмулировать скрипты инициализации Arch'а. Большинству людей не нужны все (или некоторые) из этих юнитов и они могут быть легко отключены:

# systemctl disable <unitfile>

Если вы определны, что хотите отключить конкретный юнит.

Планируется удалить большую часть функциональности данного пакета, как только эти функции будут обрабатываться в других местах (в основном в udev/systemd/kernel).

Ниже следует краткое описание каждого из этих юнитов.

nisdomainname.service

Устанавливает nis/yp доменное имя. Этот параметр устарел и не следует его испоьзовать.

lvm.service

Копирует Arch управление LVM. Нужен, только используете LVM не на корневом разделе. В уудщем systemd, вероятно, справиться с этим более надёжным и чистым способом.

rc-local.service

Запускает /etc/rc-local при загрукзе системы.

arch-daemons.target

Считывает DAEMONS массив из rc.conf и запускает соответствующие службы. Если нативный sysemd-файл существует (с тем же именем, что и демон в /etc/rc.d/) дял данного демона, то используется нативный файл. В протвном случае запускается скрипт из /etc/rc.d/.

arch-persistent-settings.service

Он запускается при завершении работы. Его основная цель - убедиться, что все настройки Arch применены при следующей загрузке. В частности:

  • устанавливает timezone из rc.conf
  • обновляет чёрный список модулей из rc.conf (смотри /etc/modprobe.d/rc.conf)
  • оьновляет список модулей, которые должны быть загружены, из rc.conf (смотри /etc/modules-load.d/rc.conf)

FAQ

Почему мои шрифты в консоли такие уродливые?

Если шрифт не установлен в /etc/vconsole.conf (или, как альтернатива, в /etc/rc.conf), то будет использован стандартный шрифт. Стандартный шрифт выбирается из-за поддержки большого числа наборов символов. Установите нужный шрифт в вышеуказанных файлах, чтобы исправить проблему.

Как мне изменить текущий уровень запуска (runlevel)?

В systemd уровни запуска обеспечиваются через "целевой единицы". Вы можете изменить их так:

# systemctl isolate runlevel5.target

или

# systemctl isolate runlevel3.target

Заметим, однако, что концепция уровней запуска немного устарели, и вместо них лучше использовать современные названия. Например:

# systemctl isolate graphical.target

Эти команды изменят только текущий уровень запуска и при следующей загрузке не сохранятся.

Как мне изменить уровень запуска по умолчанию?

Чтобы изменить уровень запуска по умолчанию, нужно создть символическую ссылку на соответствующий target-файл:

# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

или

# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

Выключение/перезагрузка происходят ужасно долго

Если процесс выключения занимает очень долгое время (или, по-видимому, зависает), то, вероятно, виноват сервис, который не завершает свою работу. systemd ожидает некоторое время, пока каждый сервис завершит свою работу самостоятельно, и только потом пытается принудительно завершить (kill) его. Если вы столкнулись с такой проблемой, обратитесь к данной статье (англ.).

Полезные ссылки