Systemd Status P7
Легенда к таблице
Поле "Сервис"
- имя пакета, в котором имеется rc-скрипт
Поле "Service(unit)"
Поле "socket"
- пустое: активация по сокету не целесообразно и не доступно
- имеет значение : целесообразно добавить поддержку активации по запросу к сервису
- записано имя .socket юнита: активация по запросу имеется и используется
Поле "Комментарии"
- если в поле стоит : сервис на данный момент работает не корректно с systemd
- комментарии к созданию unit-файла/сопутствующих файлов и сопутствующая информация
Рекомендации
- по возможности используйте метод запуска simple/dbus. Если у сервиса имеется режим работы foreground с включённым debug, лучше написать простой патч, который добавляет новую опцию запуска, без включения debug (как, например, реализовано в openntpd)
- если можно использовать socket-активацию - используйте. Часть сервисов не нужны непосредственно во время запуска системы или сразу после окончания загрузки (например: CUPS, alteratord, alterator-fbi)
- имена для unit-файлов должны совпадать с таковыми именами сервиса в /etc/init.d (не учитывая расширение): /etc/init.d/smb -> smb.service, lm_sensors3 -> lm_sensors3.service. Иначе systemd будет считать unit и rc-скрипт как два разных сервиса. Если имена файлов различаются, должен быть симлинк с именем аналогичным имени сервиса в /etc/init.d (не учитывая расширение): /etc/init.d/bluetoothd - bluetooth.service(без "d" вконце) -> bluetoothd.service
- не используйте жесткие зависимости, типа Require, только если такой тип зависимости действительно нужен
- нельзя запаковывать в unit запуск rc-скрипта
- старайтесь следовать правилу: unit поставляемый из "коробки" обеспечивает дефолтный запуск сервиса, все отличные варианты запуска обеспечиваются самим пользователем, перенеся unit в /etc/systemd/system и изменив по желанию. Соответственно не надо в дефолтном юните обеспечивать все возможные варианты запуска
- для передачи второстепенных параметров при запуске сервиса, используйте директиву EnvironmentFile или Environment
- в spec-файле используйте директиву %_unitdir
- все вопросы можно задать в devel@
Текущее состояние основных компонентов
Сервис | service(unit) | socket | Комментарии |
---|---|---|---|
389-Fedora-DS | |||
acct | |||
acpid | acpid.service | ||
alterator | |||
anacron | Type=oneshot; в юнит прописать настройки на CPULimit и IOLimit | ||
atftp | не запакованы файлы из /var/run (tmpfiles.d) | ||
apache-base | |||
apache2 | httpd2.service | Проблема собственно не в systemd.
Рассказываю методологию: 1)Добавляю в /usr/sbin/apachectl2 в секцию start() в самом начале "sleep 10", а так же модифицирую заголовок в "#!/bin/sh -x", что бы отследить в логах ход выполнения скрипта. 2)При загрузке обнаруживается, что poststart() обнаруживает успешный запуск службы и создает lock-файл только на последней итерации цикла. 3)Количество проходов этого самого цикла определяет $LOOPSSTART, который можно настроить в /etc/sysconfig/httpd2. В дефолтном варианте параметр задает 10 проходов. 4)Убираем слип, $LOOPSSTART увеличиваем до 100, перезагружаемся и видим: ... окт 11 22:30:32 media.localdomain _apachectl2[4290]: + usleep 300000 окт 11 22:30:32 media.localdomain _apachectl2[4290]: + briefstatus окт 11 22:30:32 media.localdomain _apachectl2[4290]: + RETVAL=3 окт 11 22:30:32 media.localdomain _apachectl2[4290]: + (( i=((89-1)) )) окт 11 22:30:32 media.localdomain _apachectl2[4290]: + (( 88>0 )) окт 11 22:30:32 media.localdomain _apachectl2[4290]: + usleep 300000 окт 11 22:30:33 media.localdomain _apachectl2[4290]: + briefstatus окт 11 22:30:33 media.localdomain _apachectl2[4290]: + touch /var/lock/subsys/httpd2 окт 11 22:30:33 media.localdomain _apachectl2[4290]: + RETVAL=0 окт 11 22:30:33 media.localdomain _apachectl2[4290]: + break окт 11 22:30:33 media.localdomain _apachectl2[4290]: + return 0 То есть для нормального старта не хватает совсем чуть-чуть, как бы 12 проходов вместо 10. Говорить твердо о причинах такого необычно долгого старта я не берусь, но есть 2 предположения: 1)За время старта апача успевает инициализироваться только "systemd[1]: Starting Console Manager...", да и то, она отрабатывает раньше заходов в цикл вообще, что не должно влиять, даже если бы этот демон был зависимостью для апача. 2)В этот момент времени параллельно отрабатывает prefdm, запускающий иксы и при этом сильно нагружающий систему. Надо пологать, что им просто на двоих не хватает "мегагерцофф", что бы стартануть за 10 проходов цикла, а за 12 успевает. Решение: Предлагаю увеличить в /etc/sysconfig/httpd2 дефолтное значение $LOOPSSTART. На нормальных режимах работы это не вызовет увеличения времени запуска и остановки службы, а на относительно слабых и\или загруженных машинах позволит демону успевать стартовать. | |
apache2-cache clean | rc-скрипт не корректный: не верная директива pidfile | ||
autofs | |||
audit | |||
arpwatch | |||
Avahi | avahi-daemon.service | avahi-daemon.socket | |
bacula-(client,director,etc) | не создаются нужные файлы в /var/run | ||
bind | |||
bluez | bluetooth.service | ||
blcr | зачем нужен сервис, если для него нет модулей ядра в репозитории, т.е. сервис заранее не рабочий. | ||
bridge-utils | Type=oneshot | ||
conserver | - | Type=simple (без -d), подумать как реализовать запуск по запросу | |
console-scripts (consolesaver) | Type=oneshot; подумать, что делать с keytable | ||
collectd | rc-скрипт не корректный: не верная директива pidfile | ||
crond | crond.service | ||
cryptsetup | + | используется генеретор unit файлов из состава systemd | |
CUPS | cups.service | cups.socket | полная поддержка; запуск по требованию; добавить в юнит Wants на avahi-daemon.socket (или .service) |
dhcp-server (dhcpd) | |||
dnsmasq | Type=simple (запуск с параметром -k); Файл rc-скрипт большой, необходимо при написании юнита правильно разбить на части | ||
dovecot | dovecot.service | dovecot.socket | ошибка в скрипте настройки (не относится к systemd); запуск по требованию |
ebtables | Type=oneshot, подумать как реализовать аналог "service ebtables save" | ||
etcnet | большой скрипт, подумать как перенести на systemd (сейчас в systemd отрабатывается вызовом /etc/init.d/network) | ||
ethtool | Type=oneshot (данный сервис вообще нужен?) | ||
freeipmi-bmc-watchdog (bmc-watchdog) | Type=simple, правильно написать юнит, что бы не конфликтовать с настройками для sysvinit, т.к. /etc/sysconfig/bmc-watchdog - общий | ||
freenx-server | Type=forking, при написании юнита использовать опции сервера --stop, --start, etc. | ||
ganeti | |||
ganglia-gmetad | Type=forking (или пропатчить для отключения "демонизации" ) | ||
ganglia-gmond | Type=simple; на данный момент падает с сообщением "stack smashing detected" | ||
greylistd | Type=simple | ||
gpm | |||
hddtemp | rc-скрипт не корректный: указан путь в директиве pidfile, но файл по пути не создаётся; сервис пытается получить температуру с CDROM - "прилипает" к sr0 | ||
heartbeat | необходимо запаковать каталоги в /var/run/heartbeat (tmpfiles.d). Возможно пропатчить ldirectord для отключения "демонизации". На данный момент ldirectord не работает, вылетает с ошибкой: Can't locate LWP/UserAgent.pm in @INC. | ||
ifplugd | Type=forking; Возможно пропатчить для отключения "демонизации" | ||
ipsec-tools (racoon) | Type=simple (опция -F) | ||
iptables/iptables-ipv6 | Type=oneshot; продумать как реализовать аналог service save | ||
klogd | journald умеет читать "ядрённые" логи без помощи klogd. Возможно стоит отказаться от klogd | ||
Krb5 | kadmin.service, kprop.service, krb5kdc.service | ? | желательно изменить kprop.service на режим работы, аналогичному inetd (см. sshd@.service);krb5kdc.service прибито расположение PID файла, хотя в строке запуска используется переменная описанная в sysconfig/krb5kdc - надо поправить |
libkrb5 | Type=oneshot | ||
lm_sensors3 | Type=oneshot | ||
maui | Type=forking (можно пропатчить для отключения "демонизации"). Правильно, что pid-файл находится в /var/spool/maui/ ?? | ||
mdadm | mdadm.service | ||
microcode_ctl | Оно вообще надо?? | ||
monit | Type=simple (опция -I). Проверить, что monit будет корректно перезапускать сервисы при работающем systemd | ||
multipath-tools | Type=simple (опция -d) | ||
MySQL | |||
NetworkManager | Networkmanager.service, NetworkManager-wait-online.service | ||
nginx | nginx.service | можно запускать с "daemon=off", правда тогда надо подумать о разделении конфигов(nginx -g 'daemon off;') | |
NFS Lock | nfslock.service | не запускается, сообщает об ошибке | |
nss-ldapd | nslcd.service | ||
ntpd | продумать правильную реализацию юнита (chroot, ntpdate) | ||
ocfs2-tools | необходимо запаковать каталог /var/run/o2cb (tmpfiles.d). Между двумя юнитами требуется правильно расставить зависимости | ||
openntpd | ntpd.service | немного подправить директиву EnvironmentFile в юните (можно его заставить "говорить" в лог меньше?) | |
openldap | slapd.service | ? | можно обсудить вопрос об использовании чрута средствами systemd |
openvpn | необходимо запаковать директорию /var/run/openvpn | ||
p0f | Type=simple (без опции -d) | ||
php5-fpm-fcgi | php5-fpm.service | Type=simple (--nodaemonize) | |
policycoreutils-mcstransd | Type=simple (параметр -f); rc-скрипт не корректный: указан путь в директиве pidfile, но файл по пути не создаётся | ||
policycoreutils-restorecond | Type=forking (можно пропатчить для отключения "демонизации") | ||
postfix | |||
postgresql | ? | с ldv@ обсуждалось, необходимо переписывать скрипты запуска, как sysv, так и писать правильный юнит-файл | |
pptpd | Type=simple (опция -f) | ||
qemu-kvm-el | Type=oneshot; в rc-файле указана директива pidfile, хотя она не нужна | ||
redis | redis.service | ||
runawfe-botstation | rc-файл не корректный, не совпадают параметры: pidfile и PIDFILE | ||
samba | smbd.service, nmbd.service | ? | необходимо изменить unit-файл и поменять тип запуска сервиса на "simple" |
scanlogd | Общее: PID не создаётся, приложение не проверяет на наличие уже запущенной копии | ||
sphinx | searchd.service | ? | |
smartd | smartd.service | ||
slurm-master | Type=forking (можно пропатчить для отключения "демонизации") | ||
slurm-slave | Type=simple (опция -D) | ||
slurm-slurmdbd | Type=forking (можно пропатчить для отключения "демонизации") | ||
spamd | ? | не создаются нужные файлы в /var/run | |
spawn-fcgi | необходимо запаковать каталог /var/run/spawn-fcgi (tmpfiles.d); rc-файл не корректный, не совпадают параметры: pidfile и PIDFILE | ||
spice-vdagent | spice-vdagentd.service | - | изменить тип запуска с forking на simple и прописать в ExecStart ключ "-x" |
squid | squid.service | ? | |
squidmill | Type=forking (можно пропатчить для отключения "демонизации") | ||
sshd | sshd.service | ||
sysfsutils | Type=oneshot (оно надо сейчас?) | ||
sysstat | Type=oneshot | ||
syslogd | проблемы с reload, https://bugzilla.altlinux.org/show_bug.cgi?id=27868 | ||
torque-mom | PID файл находится в /var/spool/torque/mom_priv/ - это правильно? Type=forking (можно пропатчить для отключения "демонизации") | ||
torque-scheduler | PID файл находится в /var/spool/torque/scheduler_priv/ - это правильно? Type=forking | ||
torque-server | PID файл находится в /var/spool/torque/server_priv/ - это правильно? Type=forking (можно пропатчить для отключения "демонизации"); rc-скрипт зависает | ||
ulogd | ? | ||
update-wms | Type=oneshot | ||
virtualbox-common | Type=oneshot | ||
vzctl | Type=oneshot
Собственно пока совместимости OpenVZ и systemd ждать не приходится. Для работы systemd старше версии v33 требуется ядро 2.6.39, а самое свежее ovz ядро на сегодняшний день это 2.6.32. Так что или даунгрейд systemd до v33, что наверное сильно поломает систему или использовать sysvinit. 03/10/2014 | ||
wpa_supplicant | Type=dbus | ||
xCAT-server | Type=forking | ||
xinetd | |||
zabbix-agent | необходимо запаковать каталог /var/run/zabbix/ (tmpfiles.d); Type=forking |
Команда для вычисления списка пакетов, в которых есть init-файлы, но нет unit-файлов
comm -23 <(grep -h '^/etc/rc\.d/init\.d/' /ALT/Sisyphus/*/base/contents_index |cut -f2 |sort -u) <(grep -h '^/lib/systemd/system/' /ALT/Sisyphus/*/base/contents_index |cut -f2 |sort -u)