Embora pareça ser um FAQ, mas eu nunca consegui encontrar uma maneira adequada de alterar o nome do host com o nome do domínio no Debian/Ubuntu.
Em primeiro lugar, muitas "respostas" ou escritas estão erradas ao colocar nome de host com nome de domínio (FQDN) em /etc/hostname
, como this , this e this , porque
A referência Debian diz que o nome do host não deve usar o FQDN :
3.5.5. O nome do host
O kernel mantém o nome do host do sistema . O script init no nível de execução S que está com link simbólico para " /etc/init.d/hostname.sh " define o nome do host do sistema no momento da inicialização (usando o comando hostname ) para o nome armazenado em " /etc/hostname ". Esse arquivo deve conter apenas o nome do host do sistema, não um nome de domínio totalmente qualificado.
Também, de man hostname
, diz,
"
/etc/hosts
Geralmente, é aqui que se define o nome de domínio aliando o nome do host ao FQDN." e "Um FQDN consiste em um nome de host curto e o nome de domínio DNS. A menos que você esteja usando bind ou NIS para pesquisas de host, você pode alterar o FQDN e o nome de domínio DNS (que faz parte do FQDN) no arquivo /etc/hosts Arquivo."
OK. O acima é o que eu deveria fazer, mas é isso que estou recebendo:
$ cat /etc/hostname
coral
$ head -1 /etc/hosts
127.0.0.1 coral.my.domain.org localhost
$ dnsdomainname
ht.home
$ cat /etc/resolv.conf
domain ht.home
search ht.home
nameserver 192.168.0.1
# after I change it to --
$ cat /etc/resolv.conf
# Fixed resolv.conf file
domain my.domain.org
search my.domain.org
nameserver 192.168.0.1
# everything just gone wrong --
$ dnsdomainname
dnsdomainname: No address associated with hostname
$ hostname -f
hostname: No address associated with hostname
$ hostname -d
hostname: No address associated with hostname
Atualizar
Eu fiz um rastreamento em hostname -f
, e parece que o erro "Nenhum endereço associado ao nome do host" vem de libresolv.so
:
$ strace -o /tmp/strace.log hostname -f
hostname: No address associated with hostname
$ grep -E 'openat|close|No address' /tmp/strace.log
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
close(3) = 0
close(3) = 0
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
close(3) = 0
close(3) = 0
write(2, "No address associated with hostn"..., 35) = 35
Qualquer ajuda apreciada.
$ uname -rm
5.10.0-6-amd64 x86_64
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux bullseye/sid
Release: testing
Codename: bullseye
Seu "FQDN" é determinado por diferentes programas de duas maneiras diferentes:
Fazendo uma pesquisa de 'hosts' para seu nome de host (usando as mesmas funções Glibc que normalmente são usadas para resolver endereços IP) e retornando o nome de domínio "canônico" que produziu a resposta.
Por exemplo, isso é o que getaddrinfo() com flags=AI_CANONNAME retornaria no campo ai_canonname, e o que gethostbyname() retornaria no campo ht_name. De fato, o inetutils
hostname -f
literalmente chama gethostbyname() e imprime o ht_name resultante se a pesquisa for bem-sucedida.Isso pode ser tratado via /etc/hosts ou via DNS, então o que acontece a seguir depende dos módulos listados em nsswitch.conf, na ordem:
O módulo 'files' verifica em /etc/hosts o nome literal do host ( sem nada anexado). Se encontrar uma entrada correspondente, o primeiro nome dessa entrada será o nome canônico, o restante serão aliases. O endereço IP é retornado, mas ignorado.
Então você pode ter uma entrada como esta:
O FQDN deve ir no campo "nome canônico", mas o nome do host curto deve estar presente entre os aliases, caso contrário, uma correspondência não será encontrada.
(O endereço real não importa aqui, apenas a existência da entrada. Mas como gethostbyname() é somente IPv4,
hostname -f
ignorará entradas /etc/hosts para endereços IPv6, enquanto programas usando getaddrinfo(AI_CANONNAME) as incluirão.)O módulo 'dns' faz uma consulta DNS 'A' para o nome de host fornecido, combinado com um domínio de pesquisa de /etc/resolv.conf. Assim, com hostname
coral
e resolv.confsearch my.domain.org
, uma pesquisa Acoral.my.domain.org
será feita.(Como os domínios de pesquisa são determinados na Glibc? $LOCALDOMAIN é usado primeiro, depois 'domain' ou 'search' de resolv.conf, o que ocorrer por último, e finalmente o nome do host do kernel é verificado se ele possui um domínio.)
Qualquer nome na resposta DNS que tenha o registro A será retornado como o nome canônico (ou seja, seu FQDN); se houver CNAMEs, seus domínios serão retornados como aliases. Por exemplo, se a consulta produzir estes resultados:
então
coral.home.domain.net
será o nome canônico e os outros dois nomes na coluna da esquerda serão aliases.(O endereço IP retornado real ainda não importa. A mesma nota sobre gethostbyname() sendo somente IPv4 se aplica.)
Vários outros módulos como 'myhostname' ou 'ldap' ou 'nis' também podem ser envolvidos. O primeiro na lista que produz uma resposta vence. O erro "Nenhum endereço associado ao nome do host" só é retornado se nenhum módulo encontrar um resultado para a consulta.
Ou, fazendo uma pesquisa de 'hosts' para o seu nome de host e, em seguida, fazendo uma pesquisa inversa para o endereço IP resultante. Eu acho que isso é muito menos comum, mas ocorre no entanto.
Estas são pesquisas diretas sem mágica por trás delas. A pesquisa direta de 'hosts' geralmente é feita usando gethostbyname() somente IPv4, retornando um endereço IP, e o inverso usando gethostbyaddr().
Em /etc/hosts, com o módulo 'files', você desejará novamente uma entrada praticamente igual à acima - com seu FQDN como primeiro nome e seu nome de host curto como um dos aliases na mesma linha. Quando for feita uma pesquisa inversa por endereço IP, o primeiro nome será retornado.
No DNS, com o módulo 'dns', a pesquisa direta é novamente feita da mesma forma que acima (com o domínio de pesquisa com sufixo).
As duas pesquisas são independentes; é possível que um seja tratado via /etc/hosts e o outro via DNS, etc.
Para bisbilhotar o método nº 1:
Não – vem do código nsswitch de alto nível na libc, depois de tentar chamar todos os módulos habilitados (primeiro nss_files, depois nss_dns→libresolv) e nenhum deles retornou uma resposta.
Eles não estão totalmente errados; O resolvedor de DNS Glibc na verdade pega o domínio do seu nome de host do kernel e o usa como o domínio de 'pesquisa' de fallback se um não estiver especificado no resolv.conf.
Portanto, ele não é retornado imediatamente como seu FQDN, mas influencia o processo exatamente da mesma maneira como se você tivesse
search
oudomain
em /etc/resolv.conf. Não apenas para pesquisas de FQDN locais, mas para qualquer pesquisa de DNS feita por meio de funções Glibc. (Veja a função domain_from_hostname() em resolv/res_init.c)