atftpd не запускается на openuse tumbleweed под systemd

Я попытался установить atftpd сегодня.

Пакет успешно установлен:

# zypper se atftp Loading repository data... Reading installed packages... S | Name | Summary | Type --+-------+---------------------------------+-------- i | atftp | Advanced TFTP Server and Client | package 

Но сервис не запускался после установки.

 # service atftpd start Job for atftpd.service failed. See "systemctl status atftpd.service" and "journalctl -xn" for details. # journalctl -xn -- Logs begin at Thu 2015-03-05 22:21:19 CET, end at Fri 2015-03-13 22:45:01 CET. -- Mar 13 22:43:13 server systemd[1]: Configuration file /usr/lib/systemd/system/atftpd.service is marked executable. Please remove executable permission bits. Proceeding anyway. [...] 

Я удалил флаг выполнения и избавился от сообщения об ошибке, но служба все равно не запустится.

 # chmod -x /usr/lib/systemd/system/atftpd.service # service atftpd start Job for atftpd.service failed. See "systemctl status atftpd.service" and "journalctl -xn" for details. 

Глядя на файл определения сервиса systemd, все выглядит довольно прямо:

 # cat /usr/lib/systemd/system/atftpd.service [Unit] Description=Advanced TFTP Server [Service] EnvironmentFile=/etc/sysconfig/atftpd ExecStart=/usr/sbin/atftpd --user $ATFTPD_USER --group $ATFTPD_GROUP $ATFTPD_OPTIONS $ATFTPD_DIRECTORY StandardInput=socket и # cat /usr/lib/systemd/system/atftpd.service [Unit] Description=Advanced TFTP Server [Service] EnvironmentFile=/etc/sysconfig/atftpd ExecStart=/usr/sbin/atftpd --user $ATFTPD_USER --group $ATFTPD_GROUP $ATFTPD_OPTIONS $ATFTPD_DIRECTORY StandardInput=socket 

И файл окружения, как представляется, определяет допустимые значения для всех переменных:

 # grep ^ATFT /etc/sysconfig/atftpd ATFTPD_USER="tftp" ATFTPD_GROUP="tftp" ATFTPD_OPTIONS="--daemon --logfile /var/log/atftpd/atftp.log" ATFTPD_USE_INETD="no" ATFTPD_DIRECTORY="/srv/tftpboot" ATFTPD_BIND_ADDRESSES="" 

В ручном запуске команд успешно запускается демон:

 # systemctl start atftpd.service Job for atftpd.service failed. See "systemctl status atftpd.service" and "journalctl -xn" for details. # ps aux | grep tftp[d] # source /etc/sysconfig/atftpd # /usr/sbin/atftpd --user $ATFTPD_USER --group $ATFTPD_GROUP $ATFTPD_OPTIONS $ATFTPD_DIRECTORY # ps aux | grep tftp[d] tftp 1907 0.0 0.0 11596 152 ? Ss 23:18 0:00 /usr/sbin/atftpd --user tftp --group tftp --daemon --logfile /var/log/atftpd/atftp.log /srv/tftpboot 

Поскольку я новичок в atftpd, но я не знаю, что может быть неправильным. Я установил --daemon и --logfile явно в $AFTPD_OPTIONS , но в соответствии с текстом справки файла конфигурации, который по умолчанию должен быть по умолчанию.

Диагностический текст полностью:

 # systemctl start atftpd.service Job for atftpd.service failed. See "systemctl status atftpd.service" and "journalctl -xn" for details. # systemctl status atftpd.service atftpd.service - Advanced TFTP Server Loaded: loaded (/usr/lib/systemd/system/atftpd.service; static) Active: failed (Result: resources) Mar 13 22:59:55 server systemd[1]: atftpd.service failed to run 'start' task: Invalid argument # journalctl -xn -- Logs begin at Thu 2015-03-05 22:21:19 CET, end at Fri 2015-03-13 23:33:13 CET. -- Mar 13 23:25:38 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:98:d6:bb:20:90:a2:86:dd SRC=fe80:0000:0000:0000:189b:b08a:4ad3:89bf DST=ff02:0000:0000:0000:00 Mar 13 23:28:00 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:f0:24:75:e4:6e:54:86:dd SRC=fe80:0000:0000:0000:1c6a:034e:81fc:bb59 DST=ff02:0000:0000:0000:00 Mar 13 23:28:15 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:f0:24:75:e4:6e:54:86:dd SRC=fe80:0000:0000:0000:1c6a:034e:81fc:bb59 DST=ff02:0000:0000:0000:00 Mar 13 23:29:43 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:1c:ab:a7:98:9c:80:86:dd SRC=fe80:0000:0000:0000:00d4:2bc4:7bd3:85f3 DST=ff02:0000:0000:0000:00 Mar 13 23:30:01 server cron[1912]: pam_unix(crond:session): session opened for user root by (uid=0) Mar 13 23:30:01 server systemd[1913]: pam_unix(systemd-user:session): session opened for user root by (uid=0) Mar 13 23:30:01 server CRON[1912]: pam_unix(crond:session): session closed for user root Mar 13 23:33:10 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:6c:40:08:ae:e7:3a:86:dd SRC=fe80:0000:0000:0000:6e40:08ff:feae:e73a DST=ff02:0000:0000:0000:00 Mar 13 23:33:11 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:b4:18:d1:dd:52:cc:86:dd SRC=fe80:0000:0000:0000:b618:d1ff:fedd:52cc DST=ff02:0000:0000:0000:00 Mar 13 23:33:13 server kernel: SFW2-INext-DROP-DEFLT IN=ens32 OUT= MAC=33:33:00:00:00:fb:6c:40:08:ae:e7:3a:86:dd SRC=fe80:0000:0000:0000:6e40:08ff:feae:e73a DST=ff02:0000:0000:0000:00 

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

РЕДАКТИРОВАТЬ:

Действительно хороший ответ от @jdebp, спасибо!

Чтобы следить за тем, я могу проверить, что сервер запускается, как ожидалось, после возврата моих настроек в файл конфигурации. Это все равно не сработает, но все началось. 😉

Серверная сторона

 $ sudo systemctl status atftpd.{socket,service} atftpd.socket - Advanced tftp Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/atftpd.socket; disabled) Active: active (running) since Mon 2015-03-16 14:45:50 CET; 5h 19min ago Listen: [::]:69 (Datagram) atftpd.service - Advanced TFTP Server Loaded: loaded (/usr/lib/systemd/system/atftpd.service; static) Active: active (running) since Mon 2015-03-16 20:04:49 CET; 16s ago Main PID: 3337 (atftpd) CGroup: /system.slice/atftpd.service └─3337 /usr/sbin/atftpd --user tftp --group tftp /srv/tftpboot Mar 16 20:04:49 server atftpd[3337]: connect: Address family not supported by protocol Mar 16 20:04:54 server atftpd[3337]: connect: Address family not supported by protocol Mar 16 20:04:59 server atftpd[3337]: connect: Address family not supported by protocol Mar 16 20:05:04 server atftpd[3337]: connect: Address family not supported by protocol 

Сторона клиента

 $ atftp --trace --verbose -l nvidia-bug-report.log.gz -p server 69 Trace mode on. Verbose mode on. sent WRQ <file: nvidia-bug-report.log.gz, mode: octet <>> timeout: retrying... sent WRQ <file: nvidia-bug-report.log.gz, mode: octet <>> timeout: retrying... sent WRQ <file: nvidia-bug-report.log.gz, mode: octet <>> timeout: retrying... sent WRQ <file: nvidia-bug-report.log.gz, mode: octet <>> timeout: retrying... tftp: aborting 

EDIT2:

Принуждение демона к использованию ipv4 сделало успешную передачу файла.

 > grep 0\.0 /etc/sysconfig/atftpd /usr/lib/systemd/system/atftpd.socket /etc/sysconfig/atftpd:ATFTPD_BIND_ADDRESSES="0.0.0.0" /usr/lib/systemd/system/atftpd.socket:ListenDatagram=0.0.0.0:69 

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

Потому что вы начинаете не то. Начни правильно. ☺

Подделка здесь

  StandardInput = сокет 

в файле служебной единицы. Это указывает на то, что dæmon ожидает сокета в качестве его стандартного входа, и система ddmd будет поставлять его при нерестах dæmon. «Но что такое сокет?» один спрашивает. systemd не волшебным образом знает, какой сокет использовать, и, конечно же, не подключает службы к каким-либо старым дескрипторам файлов сокетов, которые, по-видимому, просто лежат в процессе №1.

Ответ заключается в том, что, в то время как другие на WWW (несколько лет назад) сделали это по-другому, (более поздняя) упаковка OpenSUSE для atftpd запускает atftpd в качестве полноценной службы, активированной сокетами. В systemd много написано о активации сокета. Это тонко и объясняет, что это выходит за рамки этого ответа. То, что вам нужно знать об этом конкретном сервисе, здесь и сейчас:

Вы, системный администратор, не запускаете / не останавливаете свою службу atftpd, запустив / остановив службу . Вы запускаете / останавливаете гнездовое устройство. Когда сокет встает, systemd контролирует его, и трафик в сокет приведет к тому, что systemd сам запустит сервисный модуль, подключив службу к сокету, который его активировал.

Итак, systemctl start atftpd.socket и systemctl stop atftpd.socket – это команды здесь. (То же самое с enable и disable конечно.) Также используйте systemctl status atftpd.{service,socket} чтобы увидеть статус как сокета, так и сервисных единиц.

(Вы заметите, что файл atftpd.service не имеет

  [Установить] 

, но файл atftpd.socket . Опять же, это подделка, что это модуль сокета, который административно запускает / останавливает / включает / отключает здесь.)

Кстати, содержимое вашего файла /etc/sysconfig/atftpd является фиктивным. Они не соответствуют atftpd.sysconfig который находится в OpenSUSE . OpenSUSE соответствует тому, что системаd была рассказана о dæmon. Ваши локальные модификации не нужны в одном случае и совершенно неправильны в другом.

В вашем /etc/sysconfig/atftpd используется Type=simple но ваш /etc/sysconfig/atftpd использует параметр --daemon . Это несоответствие протокола готовности. Несоответствия протокола готовности заставляют службы не запускаться правильно или (чаще), чтобы (ошибочно) диагностироваться с помощью systemd как сбоя. Таким образом, у вас все еще будет проблема, из-за вашей собственной разработки, даже если вы переключитесь на управление гнездовым устройством вместо сервисного блока. Удалите параметр --daemon который вы добавили. Ваш dæmon не должен быть вилкой и выходом для указания готовности. Это полноценная служба с поддержкой сокетов в OpenSUSE. Правильный файл отправлен.

Аналогично, systemd уже будет записывать весь вывод в syslog, стандартный вывод и стандартную ошибку dæmon; и вы уже обращаетесь к этому журналу с помощью команды journalctl . --logfile необходимости использовать --logfile и настроить дублирующую систему ведения журнала.