atftpd não iniciará no opensuse tumbleweed em systemd

1

Eu tentei instalar o atftpd hoje.

O pacote foi instalado com sucesso:

# zypper se atftp
Loading repository data...
Reading installed packages...

S | Name  | Summary                         | Type   
--+-------+---------------------------------+--------
i | atftp | Advanced TFTP Server and Client | package

Mas o serviço não foi iniciado após a instalação.

# 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.
[...]

Eu removi o sinalizador de execução e me livrei da mensagem de erro, mas o serviço ainda não inicia.

# 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.

Olhando para o arquivo de definição de serviço systemd, tudo parece bastante simples:

# 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

E o arquivo de ambiente parece definir valores válidos para todas as variáveis:

# 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=""

A execução manual dos comandos inicia com êxito o daemon:

# 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

Como eu sou novo no atftpd, uso o tumbleweed e o systemd eu realmente não sei o que pode estar errado. Eu configurei --daemon e --logfile explicitamente em $AFTPD_OPTIONS , mas de acordo com o texto de ajuda do arquivo de configuração que deve ser o padrão de qualquer forma.

O texto de diagnóstico completo:

# 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

Por que o serviço se recusa a iniciar? O que posso fazer para corrigir isso?

EDITAR:

Resposta muito boa por @jdebp, obrigado!

Para acompanhar, posso verificar se o servidor é iniciado como esperado depois de reverter meus ajustes no arquivo de configuração. Ainda não funciona, mas começa. ;)

Lado do servidor

$ 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

Lado do cliente

$ 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:

Forçar o daemon a usar o ipv4 tornou a transferência de arquivos bem-sucedida.

> 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
    
por azzid 13.03.2015 / 23:29

1 resposta

1

Why does the service refuse to start? What can I do to fix it?

Porque você está começando a coisa errada. Comece a coisa certa. ☺

O sorteio aqui é

StandardInput=socket
no arquivo da unidade de serviço. Isto indica que o daemon está esperando um soquete como sua entrada padrão, e espera-se que o systemd o forneça ao gerar o daemon. "Mas que tomada é essa?" Ninguém pergunta. O systemd não sabe magicamente qual soquete usar, e certamente não conecta serviços a nenhum descritor de arquivo de soquete antigo que ele tenha no processo # 1.

A resposta é que, enquanto outros na WWW (vários anos atrás) fizeram isso de maneira diferente, o (mais recente) pacote do OpenSUSE para o atftpd executa o atftpd como um serviço ativado por socket . Há muita coisa escrita sobre ativação de socket no systemd. É sutil e explicar isso está além do escopo desta resposta. O que você precisa saber sobre esse serviço específico, aqui e agora, é o seguinte:

Você, o administrador do sistema, não inicia / interrompe o serviço atftpd iniciando / interrompendo a unidade serviço . Você inicia / pára a unidade socket . Quando o socket está ativo, o systemd o monitora, e o tráfego para o socket fará com que o próprio systemd inicie a unidade service , conectando o serviço ao o soquete que o ativou.

Portanto, systemctl start atftpd.socket e systemctl stop atftpd.socket são os comandos aqui. (O mesmo com enable e disable , claro.) Use também systemctl status atftpd.{service,socket} para ver o status das unidades de soquete e de serviço.

(Você notará que o arquivo atftpd.service não tem

[Install]
seção, mas o arquivo atftpd.socket faz. Novamente, é uma oferta que é a unidade socket que administrativamente inicia / pára / ativa / desativa aqui.)

A propósito, o conteúdo do seu arquivo /etc/sysconfig/atftpd é falso. Eles não correspondem ao o atftpd.sysconfig que está no OpenSUSE . O OpenSUSE combina com o que o sistema já foi informado sobre o daemon. Suas modificações locais são desnecessárias em um caso e completamente erradas no outro.

Sua unidade de serviço systemd é padronizada como Type=simple , mas seu /etc/sysconfig/atftpd está usando a opção --daemon . Essa é uma incompatibilidade de protocolo de prontidão. As incompatibilidades do protocolo de prontidão fazem com que os serviços não sejam iniciados corretamente ou (mais comumente) sejam (mal) diagnosticados pelo systemd como defeituosos. Então você ainda tem um problema, de sua própria autoria, mesmo quando você mudou para controlar a unidade de soquete em vez da unidade de serviço. Remova a opção --daemon que você adicionou. O seu daemon não deve ser bifurcando-e-saindo para indicar prontidão. É um serviço ativado por soquete totalmente desenvolvido no OpenSUSE. O arquivo enviado está certo.

Similarmente, o systemd irá gravar toda a saída no syslog, na saída padrão e no erro padrão pelo daemon; e você já acessou esse diário com o comando journalctl . Não é necessário usar --logfile e configurar um sistema de log duplicado.

    
por 15.03.2015 / 23:48