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 서비스를 시작/중지하지 마십시오.제공하다단위. 당신은 시작/중지소켓단위. 언제. . . 언제소켓Up, systemd는 이를 모니터링하고 소켓에 대한 트래픽으로 인해 systemd가 발생합니다.그 자체시작제공하다장치에서 서비스를 활성화하는 소켓에 서비스를 연결합니다.

여기의 명령도 마찬가지입니다 systemctl start atftpd.socket. (물론 과 동일합니다 systemctl stop atftpd.socket.) 소켓 및 서비스 장치의 상태를 보는 데에도 사용할 수 있습니다.enabledisablesystemctl status atftpd.{service,socket}

atftpd.service( 파일이 없다는 것을 알 수 있습니다.

[설치하다]
부분적으로는 atftpd.socket문서가 그렇습니다. 다시 말하지만, 이것은 경품입니다.소켓시작/중지/활성화/비활성화 장치는 여기에서 관리됩니다. )

그런데 당신 문서의 내용은 /etc/sysconfig/atftpd가짜입니다. 일치하지 않아atftpd.sysconfig오픈수세에서. OpenSUSE는 systemd가 데몬에 대해 알고 있는 것과 일치합니다. 어떤 경우에는 로컬 수정이 필요하지 않고 다른 경우에는 로컬 수정이 완전히 잘못되었습니다.

시스템 서비스 단위의 기본값은 이지만 Type=simple해당 /etc/sysconfig/atftpd옵션을 사용하고 있습니다 --daemon. 이는 준비 프로토콜 불일치입니다. 준비 프로토콜 불일치로 인해 서비스가 올바르게 시작되지 않거나 (더 일반적으로) systemd에서 오류로 진단될 수 있습니다. 그래서 당신은 것입니다아직서비스 유닛이 아닌 컨트롤 소켓 유닛으로 전환하더라도 스스로 제작하는 문제에 봉착하게 됩니다. --daemon추가한 옵션을 제거하세요 . 귀하의 데몬은아니요준비 상태를 나타내기 위해 포크하고 종료합니다. OpenSUSE의 성숙한 소켓 활성화 서비스입니다. 전달된 문서가 정확합니다.

마찬가지로 systemd도이미작업하는 동안 데몬의 모든 출력을 syslog, 표준 출력 및 표준 오류에 기록합니다.이미이 로그에 액세스하려면 명령을 사용하십시오 journalctl. --logfile중복된 로깅 시스템을 사용하고 설정할 필요가 없습니다 .

관련 정보