Como garantir que o nfs-server não seja iniciado até que ele possa resolver nomes de host? (16.10)

4

Resumo : Existe uma maneira de garantir que o servidor NFS não seja iniciado pelo systemd até que possa resolver adequadamente os nomes de máquinas clientes especificados em /etc/exports ?

Descrição do problema : Descobri que os compartilhamentos NFS não estão disponíveis adequadamente após o servidor (executando 16.10) ser reinicializado. Os clientes obtêm erros "acesso negado pelo servidor", até que exportfs -ra ou service nfs-server restart seja executado manualmente no servidor. Depois disso, tudo funciona como esperado.

O /etc/exports do servidor contém apenas:

/mnt/raidarray clientmachine(rw)

em que clientmachine é o nome do host da máquina cliente do NFS na rede local.

Identificação do problema : A saída de systemctl status nfs-server (abaixo) deixa claro o problema: o nome do cliente não pode ser resolvido no momento em que o servidor NFS foi iniciado.

● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled
Active: active (exited) since Tue 2017-01-17 16:47:38 CST; 26min ago
Main PID: 1520 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4915)
CGroup: /system.slice/nfs-server.service
Jan 17 16:47:38 servermachine exportfs[1511]: exportfs: Failed to resolve clientmachine
Jan 17 16:47:38 servermachine systemd[1]: Started NFS server and services.

NetworkManager-wait-online.service está ativado, o que eu compreendi serve para garantir que network.target (em que nfs-server depende) não é satisfeito até que network-online.target seja satisfeito.

Coisas que não ajudaram :

  1. Caso eu tenha entendido mal o que o NetworkManager-wait-online.service faz, tentei adicionar um After=network-online.target e Wants=network-online.target ao nfs-server.service explícito. Isso não conserta nada. Eu vejo a nova dependência aparecer em systemctl list-dependencies , mas a resolução de nomes ainda falha na inicialização. Portanto, parece que network-online.target não garante que a resolução do nome do host possa acontecer.

  2. Alguns googling sugeriram que exigir nss-lookup.target garantiria que a resolução da rede estivesse disponível, mas adicioná-la como Wants e / ou After dependency a nfs-server.service também não corrige as coisas!

  3. Adicionar uma dependência Wants e / ou After em systemd-resolved.service em vez de nss-lookup.target também não corrige as coisas.

Depois de adicionar todas essas dependências, nfs-server é iniciado muito tarde no processo de inicialização (pouco antes dos itens de login da área de trabalho), mas ainda não é possível resolver os hosts. Com base em systemd-analyze plot , parece que nmbd está encravado nessa época, mas não sei se isso está relacionado.

Informações de configuração : Esta é uma versão para desktop do kubuntu 16.10 que é basicamente uma nova instalação.

NetworkManager.service está ativado e systemd-networkd.service está desativado - não alterei isso do padrão.

Aqui está a definição do serviço NetworkManager-wait-online :

[Unit]
Description=Network Manager Wait Online
Documentation=man:nm-online(1)
Requisite=NetworkManager.service
After=NetworkManager.service
Before=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
RemainAfterExit=yes
[Install]
WantedBy=network-online.target

Como solução alternativa, eu poderia codificar endereços IP em vez de nomes de host em /etc/exports ou /etc/hosts , mas isso parece um pouco frágil. Existe uma resposta melhor?

EDIT - Atualização : seguindo os conselhos do @ muru abaixo, eu tentei fazer um script esperar para resolver nomes de host - só para ver quanto tempo demora. Meu script tem que esperar dezenas de segundos após o systemd-resolved iniciar antes que ele possa realmente resolver um host. Isso é muito bizarro. Eu me pergunto se é realmente um problema de rede local? Parece que talvez um arquivo codificado (e de atualização automática, talvez, conforme sugerido pelo @ mark-stosberg) /etc/exports ou /etc/hosts esteja garantido.

    
por zachrahan 18.01.2017 / 05:37

3 respostas

0

Com base no comentário do @ muru, criei um script python para aguardar a resolução de DNS:

import socket
import time
import itertools

TIMEOUT = 30
HOSTS = ['stanford.edu', 'google.com', 'example.com']

def main():
    hosts = itertools.cycle(HOSTS)
    t0 = time.time()
    for host in hosts:
        t = time.time()
        elapsed = t - t0
        if elapsed > TIMEOUT:
            break
        try:
            socket.getaddrinfo(host, None, proto=socket.IPPROTO_TCP)
            print('Resolved {} at t = {}'.format(host, elapsed))
            break
        except socket.gaierror:
            print('Could not resolve {} at t = {}'.format(host, elapsed))
        time.sleep(0.25)
        t = time.time()

if __name__ == '__main__':
    main()

Salvei esse script como /etc/systemd/system/nfs-server.service.d/wait_for_dns.py (primeiro é preciso criar o diretório pai) e, em seguida, executei sudo systemctl edit --full nfs-server , adicionando o seguinte antes de outras linhas ExecStartPre:

ExecStartPre=/usr/bin/python3 /etc/systemd/system/nfs-server.service.d/wait_for_dns.py

Isso funcionou bem, embora certamente pareça um pouco trabalhoso e pode ser melhorado de várias maneiras. (Acabei desistindo do NFS nesse contexto; foi mais uma dor do que valeu a pena.)

    
por zachrahan 14.03.2018 / 17:44
0

Em termos do que você está tentando fazer com systemd , você já tentou fazer a melhor coisa, que é definir seu serviço para ser iniciado após network-online . Eu li muitas perguntas systemd e outras pessoas relataram problemas com a rede não estarem totalmente on-line quando fazem isso.

Recomendo a ideia de colocar endereços IP em /etc/exports ou /etc/hosts , como você recomenda. Isso simplifica uma importante tarefa de montagem de disco durante a inicialização.

Para tornar o sistema mais robusto, você pode usar um cron job ou timer de sistema que verifica periodicamente para ver se o DNS dos hosts interessantes foi alterado. Em caso afirmativo, atualize automaticamente /etc/hosts com os novos valores.

    
por Mark Stosberg 18.01.2017 / 15:33
0

Eu tive o mesmo problema em uma instalação do Ubuntu 16.04.03 LTS.
O exportfs não foi executado corretamente após uma reinicialização e, portanto, o nfs-kernel-server não foi iniciado corretamente.
Eu tentei adicionar um sono para o caso de início em /etc/init.d/nfs-kernel-server, mas isso não ajudou.
Eu também tentei algumas dicas encontradas link
Eu finalmente resolvi o problema adicionando a seguinte linha ao /etc/rc.local

systemctl restart nfs-kernel-server
    
por user333869 23.01.2018 / 11:17