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冗長ロギングシステムを使用して設定する必要はありません。

おすすめ記事