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 :
-
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.
-
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!
-
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.