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.