오늘 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
.) 소켓 및 서비스 장치의 상태를 보는 데에도 사용할 수 있습니다.enable
disable
systemctl 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
중복된 로깅 시스템을 사용하고 설정할 필요가 없습니다 .