Шпаргалки по systemd

Алексей Федорчук

Эта серия шпаргалок сочинялась года полтора назад по вполне конкретному поводу — в связи с борьбой за русификацию консоли в тогдашней версии openSUSE (и была размещена на соответствующем сайте). Здесь размещается вторая версия, подвергнутая минимальной правке — просто дабы не бегать по сайтам и не вспоминать, когда что-то понадобится. Не смотря на возраст, большая часть этих шпаргалок, насколько я понимаю, на рецептурном уровне сохраняет актуальность.

Вступление

Как известно, товарищ Ульянов в скобках Ленин применительно к НЭПу сказал, что это всерьёз и надолго. Правда, обычно забывают, что это он просто процитировал слова товарища Осинского, с которым у них возникли разногласия по поводу количественного определения понятия надолго, но это другая история.

История же наша заключается в том, что systemd, подобно НЭПу, пришёл в большинство широко распространённых дистрибутивов Linux всерьёз и надолго (правда, в оценке величины надолго мнения тут расходятся ещё сильней, чем у Ленина с Осинским). И применителям их с этим придётся считаться — по крайней мере, на шпаргалочном уровне. Именно такой набор шпаргалок, правда, весьма ограниченный, и собран на этой странице. В своё время он позволил мне пересидеть угар НЭПа — и кто знает, не окажется ли востребованным вновь?

Все примеры команд, приводимые далее, требуют прав администратора, что символизируется соответствующим видом приглашения командной строки #.

Управление системными службами

Управление системными службами (они же сервисы или демоны) включает их запуск, остановку, перезапуск и тому подобные манипуляции. В рамках systemd все они выполняются с помощью команды systemctl. Она требует указания субкоманды и её аргумента — имени управляемой службы.

Запуск службы осуществляется с помощью субкоманды start. Например, для запуска службы консольной мыши нужно выполнить это:

# systemctl start gpm.service

А прекратить её выполнение — субкомандой stop:

# systemctl stop gpm.service

Для перезапуска службы используется субкоманда restart:

# systemctl restart gpm.service

В то же время для некоторых служб иногда достаточно перечитать их конфигурационный файл, без перезапуска процесса; в этом случае применяется субкоманда reload. Например, при изменении консольной раскладки клавиатуры или шрифта вывода в консоли можно ограничиться командой

# systemctl reload kbd.service

Действие субкоманд start и stop ограничивается текущим сеансом. Если требуется запуск или остановка некоей службы после рестарта системы, следует использовать субкоманды enable и disable, соответственно. Например, команда

# systemctl enable gpm.service

сделает доступной службу консольной мыши после перезагрузки системы, а

# systemctl disable gpm.service

напротив, отключит её в следующем сеансе.

Таким образом, управление службами через systemd осуществляется почти также, как и при «старом режиме», когда использовалась команда service. Разница только в синтаксисе (субкоманда нынче указывается не в конце конструкции, а перед аргументом, что отражает прогрессивность НЭПа) и в том, что имя службы теперь сопровождается суффиксом *.service — для тренировки пальцев. Хотя, справедливости ради, надо отметить, что в Zsh (и, вероятно, в Bash) для аргументов команды systemctl работает автодополнение.

И в заключение добавлю, что пока использование команды service для управления службами также не запрещается.

Цели вместо runlevels

В менеджере инициализации systemd вместо уровней запуска (runlevels), которые Linux унаследовал от SysV первозданного UNIX’а, используются так называемые цели (targets). Подобно уровням запуска, они объединяют в себе наборы стартовых служб некоторого назначения. Однако, в отличие от runlevels, которых, как известно, существует всего семь, целей в systemd определено великое множество — полный их список можно просмотреть командой

$ ls /lib/systemd/system/*.target

Из всего этого богачества по умолчанию (по крайней мере, в openSUSE времён сочинения первой версии этих шпаргалок) задействованы следующие цели:

  • poweroff.target — выключение системы (аналог runlevel 0);
  • reboot.target — перезагрузка системы (аналог runlevel 6);
  • rescue.target — спасательный режим (аналог single user mode, runlevel 1);
  • multi-user.target — консольный многопользовательский режим с поддержкой сети (аналог runlevel 3);
  • graphical.target — запуск в графическом режиме (аналог runlevel 5).

Переключаться между целями (то есть соответствующими режимами) можно с помощью всё той же команды systemctl с указанием субкоманды isolate и аргумента — имени цели. Например, команда

# systemctl isolate rescue.target

переведёт систему в однопользовательский режим с автоматическим закрытием Иксового сеанас и всех запущенных в нём приложений. Вернуться к нормальной работе можно, как легко догадаться, командой

# systemctl isolate graphical.target

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

# telinit 1

А для возврата взад можно использовать и

# telinit 5

Здесь нужно только помнить, что по умолчанию аналог runlevel 2 (многопользовательский режим без поддержки сети) в openSUSE не задействован. Это можно изменить, переопределив символическую ссылку /lib/systemd/system/runlevel2.target — как именно, оставляю для изучения заинтересованным лицам.

Цель по умолчанию

Для определения цели при старте системы в systemd служит специальная символическая ссылка — /lib/systemd/system/default.target. По умолчанию она указывает на /lib/systemd/system/graphical.target, благодаря чему openSUSE, например, запускается в графическом режиме (аналог runlevel 5). Если это почему-либо не устраивает, стартовую цель легко изменить, переопределив указанную ссылку. Например, после команды

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

система будет стартовать в консольном многопользовательском режиме (аналог runlevel 3). Обращаю внимание на опцию -f, обеспечивающую принудительное переопределение символической ссылки — без неё последует сообщение об ошибке.

В ряде дистрибутивов (а возможно, и во всех) сохраняется файл /etc/inittab, описывающий уровни запуска в терминах SysV. Однако его редактирование ныне не даёт никакого эффекта: изменить режим запуска по умолчанию можно только указанным выше способом.

Сервисы — определение статуса

Прежде чем управлять чем-либо, неплохо бы выяснить, чем можно управлять. И сделать это можно командой

$ ls /lib/systemd/system/*.service

в openSUSE 12.2, или

$ ls /usr/lib/systemd/system/*.service

в релизе 12.3, в котором, в соответствие с катехизисом systemd, из корня файловой иерархии в каталог /usr было перенесено из всё, что можно.

А вот теперь можно и получить информацию о состоянии сервиса — с помощью команды

$ systemctl status имя_сервиса

Например, для активированной службы консольной мыши это будет выглядеть примерно так:

$ systemctl status gpm.service
gpm.service - LSB: Console mouse support
          Loaded: loaded (/etc/init.d/gpm)
          Active: active (running) since Sat, 23 Feb 2013 06:24:31 +0400; 19h ago
         Process: 949 ExecStart=/etc/init.d/gpm start (code=exited, status=0/SUCCESS)
          CGroup: name=systemd:/system/gpm.service
                  └ 958 /usr/sbin/gpm -m /dev/input/mice -t ps2

Однако некоторые службы могут быть маскированы, и настроить их обычными методами результата не дадут.

Сервисы — маскировка и демаскировка

Только что я говорил об отключении традиционной службы настройки консольного шрифта и раскладки — kbd.service. В частности, на момент сочинения первой версии это относилось к службе kbd.service, почему в то время и не получалось просто настроить консольный шрифт и раскладку клавиатуры. Позднее эта проблема была решена «костыльным» методом, а сейчас, возможно и всамделишним, но к тому времени период НЭПа для меня уже закончился. Так что просто вкратце скажу о командах маскирования и демаскирования — вдруг это когда-нибудь потребуется.

Демаскирование отключённой службы выполняется так:

# systemctl unmask kbd.service
rm '/etc/systemd/system/kbd.service'

Как можно видеть из её вывода, при этом произойдёт удаление символической ссылки kbd.service на устройство /dev/null, и оно будет перманентным. До тех пор, пока соответствующую службу не потребуется замаскировать снова:

# systemctl mask kbd.service
ln -s '/dev/null' '/etc/systemd/system/kbd.service'

Чем будет совершена обратная операция — создание симлинка kbd.service на /dev/null.

Маскирование — «сильный» способ отключения сервиса, так как оно запрещает все виды его активации, в том числе и вручную. Кроме, разумеется, только что описанного демаскирования.

Запуск сетевых служб

Некогда, занимаясь установкой openSUSE 12.3 с LiveCD, я после первого рестарта обнаружил отсутствие сети, хотя при установке той же версии с так называемого Rescue CD никаких проблем с сетью не наблюдалось. Пришлось проявлять солдатскую смекалку, что и вызвало к жизни эту шпаргалку.

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

# systemctl start NetworkManaget.service

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

# systemctl enable NetworkManaget.service

Всё, конечно, просто. Вот только как мы раньше без этого обходились? И зачем надо было это придумывать?

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