atftpd 不会在 systemd 下的 opensuse tumbleweed 上启动

atftpd 不会在 systemd 下的 opensuse tumbleweed 上启动

我今天尝试安装 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

环境文件似乎为所有变量定义了有效值:

# 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、suse tumbleweed 和 systemd 的新手,我真的不知道可能出了什么问题。我已经在 中明确设置了--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

编辑2:

强制守护进程使用 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

答案1

为什么服务拒绝启动?我能做什么来修复它?

因为你开始了错误的事情。开始做正确的事。 ☺

这里的赠品是

标准输入=套接字
在服务单元文件中。这表明守护进程需要一个套接字作为其标准输入,并且 systemd 预计在生成守护进程时提供它。 “但是那是什么插座?”有人问。 systemd 不会神奇地知道要使用哪个套接字,并且当然不会将服务连接到它恰好位于进程 #1 中的任何旧套接字文件描述符。

答案是,虽然 WWW 上的其他人(几年前)采取了不同的做法,atftpd 的(更新的)OpenSUSE 打包将 atftpd 作为成熟的套接字激活服务。有很多关于 systemd 中套接字激活的文章。它很微妙,解释它超出了这个答案的范围。您现在需要了解的有关此特定服务的信息是:

您,系统管理员,不要通过启动/停止 atftpd 服务来启动/停止您的 atftpd 服务。服务单元。您启动/停止插座单元。当。。。的时候插座起来了,systemd对其进行监控,到socket的流量会导致systemd本身开始服务单元,将服务连接到激活它的套接字。

这里的命令systemctl start atftpd.socket也是如此。 (当然与和systemctl stop atftpd.socket相同。)还可以用来查看套接字和服务单元的状态。enabledisablesystemctl status atftpd.{service,socket}

(您会注意到该atftpd.service文件没有

[安装]
部分,但atftpd.socket文件确实如此。再说一次,这是一个赠品,它是插座在此管理启动/停止/启用/禁用的单元。)

顺便说一下,你的文件内容/etc/sysconfig/atftpd是假的。他们不匹配atftpd.sysconfigOpenSUSE 中的。 OpenSUSE 与 systemd 所获悉的有关守护进程的内容相匹配。在一种情况下,您的本地修改是不必要的,而在另一种情况下,您的本地修改是完全错误的。

您的 systemd 服务单元默认为,Type=simple但您/etc/sysconfig/atftpd正在使用该--daemon选项。这是准备协议不匹配。就绪协议不匹配会导致服务无法正确启动,或者(更常见)被 systemd(错误)诊断为失败。所以你会仍然即使您切换到控制套接字单元而不是服务单元,也会遇到您自己造成的问题。删除--daemon您添加的选项。您的守护程序应该不是分叉并退出以表明已准备就绪。它是 OpenSUSE 中成熟的套接字激活服务。交付的文件是正确的。

同样,systemd 将已经记录守护进程的所有输出到系统日志、标准输出和标准错误;而你是已经使用命令访问该日志journalctl。没有必要使用--logfile和设置重复的日志系统。

相关内容