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) | |||
| bind | |||
| bluez | bluetooth.service | ||
| blcr | |||
| bridge-utils | Type=oneshot | ||
| conserver | - | Type=simple (без -d), подумать как реализовать запуск по запросу | |
| console-scripts (consolesaver) | Type=oneshot; подумать, что делать с keytable | ||
| collectd | |||
| 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 | |||
| 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 | |||
| 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 | ? | ||
| spawn-fcgi | |||
| 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 | |||
| 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)