mount.nfs: Falha ao resolver servidor

1

Eu tenho um problema com o cliente nfs não sendo capaz de resolver um nome DNS resolvível.

[root@testserver-2 ~]# host nfs-server-host-name
nfs-server-host-name has address 10.37.4.131

[root@testserver-2 ~]# nslookup nfs-server-host-name
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   nfs-server-host-name
Address: 10.37.4.126

[root@testserver-2 ~]# showmount -e nfs-server-host-name
clnt_create: RPC: Unknown host

[root@testserver-2 ~]# ss -lnp |grep rpc
LISTEN     0      128                       *:111                      *:*      users:(("rpcbind",7627,8)

[root@testserver-2 ~]# mount -t nfs -o defaults,auto,proto=tcp nfs-server-host-name:/ifs/exports/EXPORT /mnt/export
mount.nfs: Failed to resolve server nfs-server-host-name: Name or service not known

A resolução local é configurada via dnsmasq:

[root@testserver-2 ~]# cat /etc/resolv.conf
options rotate timeout:2 attempts:4
nameserver 127.0.0.1
nameserver 10.1.1.1
nameserver 8.8.8.8

[root@testserver-2 ~]# cat /etc/dnsmasq.conf 
resolv-file=/etc/resolv.conf
server=/nfs-server-host-name/10.37.4.1 #IP address of Isilon smart connect resolver
listen-address=127.0.0.1

configuração nsswitch (padrão Centos 6):

[root@testserver-2 ~]# grep hosts /etc/nsswitch.conf
hosts:      files dns

Por favor, note que nfs-server-host-name resolving é tratado por um resolvedor de conexão inteligente Isilon, que é configurado como um resolvedor para nfs-server-host-name localmente via dnsmasq e funciona (como visto no exemplo acima). Substituir nfs-server-host-name por um endereço IP não é uma opção, pois há vários nós NFS que são balanceados pelo resolvedor, portanto, o IP é variável e não pode ser codificado. Portanto, é OK que os dois resultados acima de hosts e nslookup sejam diferentes. Este é o comportamento pretendido e esperado.

Por favor, note também que nfs-server-host-name é um exemplo muito preciso do nome do host. O nome do host real parece quase idêntico, não é um FQDN. Na verdade, não há pontos no nome do host. Este é um recurso que eu não estou no controle.

Quando montado manualmente com um endereço IP de nó válido, a exportação é bem montada. Quando o endereço de um nó é colocado em /etc/hosts , ele é montado. Quando resolvido via DNS, ele não funciona para o cliente nfs, mas funciona para outras ferramentas da rede, como hosts, escavação ou ping.

Este parece ser um problema não tão incomum, mas todas as dicas que encontrei até agora dizem "substituir hostname por IP", algo que não posso fazer.

O que eu senti falta?

    
por mikky 11.05.2016 / 14:31

2 respostas

2

Ainda estou para descobrir qual é o problema real , mas a solução é remover a opção rotate de /etc/resolv.conf e colocar um ponto depois de nfs-server-host-name em /etc/fstab para impedir a pesquisa de domínio (que ocorreu mesmo quando não havia a opção search em /etc/resolv.conf ), ou seja:

nfs-server-host-name.:/nfs/export/...
                    ^
                    ^---up here

Pode ter algo a ver com a opção de configuração do kernel CONFIG_NFS_USE_LEGACY_DNS, que está definida como yes no meu kernel.

O comportamento do nfs-client (e nfs-client apenas) foi que ele consultou apenas o servidor de nomes second em /etc/resolv.conf , não importando quantos fossem, desde que a opção rotate fosse presente. No entanto, funcionou quando não havia nenhum segundo servidor de nomes. Me bate ...

    
por 12.05.2016 / 15:36
2

O comando showmount tem uma chamada RPC que usa gethostbyname_r para tentar obter informações para um nome de host. Não faz muito para interpretar os erros retornados por ele. Você poderia fazer um teste para ver qual é realmente o erro? Este código é modificado a partir do código glibc clnt_gen.c real visto aqui

Exemplo de fonte C:

#include <netdb.h>
#include <alloca.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char **argv)
{
    struct hostent hostbuf, *h;
    size_t hstbuflen;
    char *hsttmpbuf;
    char *hostname;
    int herr;

    if (argc != 2)
    {
      exit(-1);
    }
    hostname = argv[1];

    hstbuflen = 1024;
    hsttmpbuf = alloca(hstbuflen);
    while (gethostbyname_r (hostname, &hostbuf, hsttmpbuf, hstbuflen, &h, &herr) != 0 || h == NULL)
    {
        if (herr != NETDB_INTERNAL || errno != ERANGE)
        {
            printf("gethostbyname_r error: %s\n", hstrerror(herr));
            exit(0);
        }
        else
        {
            hstbuflen *= 2;
            hsttmpbuf = alloca (hstbuflen);
        }
    }
}

Salve isto como ghbntest.c e compile com o comando gcc -o ghbntest ghbntest.c . Execute usando ./ghbntest nfs-server-host-name . Exemplo de saída:

$ ./ghbntest 12345.example.com
gethostbyname_r error: Unknown host
    
por 11.05.2016 / 17:19