Como Atribuir um Hostname Estático a uma Máquina Linux
Um hostname estático é um rótulo legível por humanos, configurado de forma permanente e atribuído a um sistema Linux, que persiste após reinicializações e não é substituído por serviços de rede como o DHCP. Ao contrário de um hostname transitório — que pode ser definido dinamicamente pelo daemon de rede e redefinido na próxima inicialização — um hostname estático é armazenado em disco e permanece autoritativo independentemente de como a máquina obtém o seu endereço IP.
Esta distinção é extremamente importante em ambientes de produção. Quando executa um VPS ou um servidor dedicado, um hostname estável é a âncora para entradas SSH known-hosts, Nomes Alternativos de Sujeito de certificados TLS, identificadores syslog, etiquetas de destino Prometheus e nomes principais Kerberos. Um hostname que muda silenciosamente após uma renovação DHCP pode quebrar todos estes simultaneamente.
O Que É Exatamente um Hostname Linux?
O Linux rastreia três classes distintas de hostname, cada uma servindo um propósito diferente:
| Tipo de Hostname | Localização de Armazenamento | Âmbito | Sobrevive à Reinicialização |
|---|---|---|---|
| Estático | /etc/hostname | Identidade persistente do sistema | Sim |
| Transitório | Apenas em tempo de execução do kernel | Temporário, definido por NTP/DHCP | Não |
| Estético | /etc/machine-info | Nome de exibição UTF-8 (espaços permitidos) | Sim |
O hostname estático é o que configura intencionalmente. O hostname transitório é o que o kernel está a usar atualmente — normalmente idêntico ao estático, a menos que um servidor DHCP ou systemd-timesyncd o tenha substituído. O hostname estético é puramente cosmético (por exemplo, "Alex's Web Server") e nunca é usado em DNS ou SSH.
Os hostnames estáticos válidos seguem as regras RFC 1123: apenas letras minúsculas, dígitos e hífenes; sem sublinhados; sem hífenes no início ou no fim; máximo de 63 caracteres por rótulo; máximo de 253 caracteres no total para um nome de domínio totalmente qualificado (FQDN).
Verificar o Hostname Atual
Antes de fazer quaisquer alterações, audite o estado atual dos três tipos de hostname:
hostnamectlExemplo de saída num sistema baseado em systemd:
Static hostname: old-server-name
Pretty hostname: Old Server Name
Transient hostname: dhcp-assigned-name
Icon name: computer-server
Chassis: server
Machine ID: a1b2c3d4e5f6...
Boot ID: 9f8e7d6c5b4a...
Operating System: Ubuntu 22.04.3 LTS
Kernel: Linux 5.15.0-91-generic
Architecture: x86-64Se o Hostname Transitório diferir do Hostname Estático, o seu cliente DHCP está a substituir o valor estático — um problema abordado na secção de persistência abaixo.
Para sistemas sem hostnamectl, utilize:
hostname
cat /etc/hostname
uname -nMétodo 1: Utilizar hostnamectl (Distribuições Baseadas em systemd)
Este método aplica-se ao Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux e qualquer distribuição que execute systemd como PID 1.
Passo 1: Definir o Hostname Estático
sudo hostnamectl set-hostname new-static-hostnamehostnamectl escreve o valor em /etc/hostname, chama a syscall sethostname(2) para atualizar o kernel em execução imediatamente e notifica systemd-hostnamed — tudo atomicamente. Não é necessária reinicialização.
Para definir os três tipos de hostname simultaneamente:
sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transientPasso 2: Verificar a Alteração
hostnamectlConfirme que o campo Hostname Estático mostra o seu novo valor. Verifique também se o kernel o reconheceu:
hostnamePasso 3: Atualizar /etc/hosts
hostnamectl não atualiza /etc/hosts automaticamente. Não atualizar este ficheiro faz com que sudo emita o aviso unable to resolve host, quebra aplicações que chamam gethostbyname() no hostname local e pode fazer com que serviços baseados em Java (Elasticsearch, Kafka) falhem no arranque.
sudo nano /etc/hostsO ficheiro deve conter no mínimo:
127.0.0.1 localhost
127.0.1.1 new-static-hostname.yourdomain.com new-static-hostnameA segunda linha usa 127.0.1.1 (não 127.0.0.1) para o próprio hostname da máquina em sistemas da família Debian. Em sistemas da família RHEL, use o endereço IP primário real em vez disso:
192.168.1.50 new-static-hostname.yourdomain.com new-static-hostnameSe estiver a gerir um VPS com cPanel, a ferramenta de alteração de hostname do cPanel trata de /etc/hosts automaticamente, mas deve verificar o resultado manualmente na mesma.
Método 2: Editar Manualmente /etc/hostname (Distribuições Sem systemd)
Este método aplica-se a versões mais antigas do Debian/Ubuntu que usam SysVinit ou Upstart, Alpine Linux, Gentoo com OpenRC, Void Linux e sistemas embebidos.
Passo 1: Editar /etc/hostname
sudo nano /etc/hostnameO ficheiro deve conter exatamente uma linha — o hostname curto sem espaços em branco finais ou nova linha além do terminador de linha padrão:
new-static-hostnamePasso 2: Atualizar /etc/hosts
sudo nano /etc/hostsAplique o mesmo mapeamento descrito no Método 1.
Passo 3: Aplicar a Alteração Sem Reinicializar
Notifique o kernel em execução do novo hostname imediatamente:
sudo hostname new-static-hostnameEm sistemas com systemd-hostnamed disponível mesmo sem adoção completa do systemd:
sudo systemctl restart systemd-hostnamedEm sistemas SysVinit puros, o comando hostname acima é suficiente. A alteração entra em vigor para todos os novos processos; as shells existentes ainda mostrarão o prompt antigo até abrir uma nova sessão de terminal ou executar:
exec bashMétodo 3: Substituição do Cloud-Init (Crítico para Instâncias VPS na Nuvem)
Este é o cenário mais frequentemente ignorado. Em plataformas de nuvem — incluindo a maioria dos fornecedores de VPS — o cloud-init é executado em cada inicialização e redefine o hostname para o que a API de metadados da instância retorna. A sua alteração em /etc/hostname será silenciosamente substituída na próxima reinicialização.
Para que um hostname estático sobreviva ao cloud-init, edite /etc/cloud/cloud.cfg:
sudo nano /etc/cloud/cloud.cfgEncontre ou adicione a seguinte diretiva:
preserve_hostname: trueEm alternativa, crie um ficheiro de substituição drop-in para evitar modificar a configuração gerida pelo pacote:
sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOFApós esta alteração, o cloud-init deixará de tocar no hostname nas inicializações subsequentes.
Impedir que o DHCP Substitua o Hostname Estático
Mesmo sem o cloud-init, um cliente DHCP pode substituir o hostname transitório. A correção depende do cliente DHCP que a sua distribuição utiliza.
Para dhclient (legado Debian/Ubuntu)
Edite /etc/dhcp/dhclient.conf:
sudo nano /etc/dhcp/dhclient.confAdicione ou modifique:
send host-name "new-static-hostname";
supersede host-name "new-static-hostname";A diretiva supersede garante que o cliente ignora qualquer hostname oferecido pelo servidor DHCP.
Para systemd-networkd com systemd-resolved
Edite ou crie um ficheiro .network em /etc/systemd/network/:
[DHCP]
SendHostname=yes
UseHostname=noUseHostname=no impede que o hostname oferecido pelo DHCP substitua o estático.
Para NetworkManager (a maioria das distribuições de desktop e servidores modernos)
sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yesPara impedir que o NetworkManager aceite um hostname do DHCP completamente, adicione a /etc/NetworkManager/NetworkManager.conf:
[main]
hostname-mode=nonePropagação do Hostname: O Que Mais Precisa de Saber
Definir o hostname no sistema operativo é necessário, mas não suficiente num ambiente em rede. Considere estes sistemas a jusante:
- Registos DNS diretos e inversos: Atualize o registo A e o registo PTR da sua zona DNS. Sem um registo PTR correspondente, muitos servidores de correio rejeitarão o email de saída e algumas ferramentas de segurança sinalizarão o host como suspeito.
- Certificados SSL/TLS: Se o seu hostname fizer parte do CN ou SAN de um certificado, precisa de um novo certificado. Os certificados SSL associados ao hostname antigo produzirão erros de validação.
- Registo de domínio e propagação DNS: Se o hostname mapear para um FQDN público, atualize o registo DNS no seu registador de domínio e aguarde o tempo de propagação baseado em TTL.
- Agentes de monitorização: O exportador de nós Prometheus, Datadog, Zabbix e agentes similares usam o hostname como etiqueta. Após uma alteração de hostname, as métricas históricas podem aparecer sob uma identidade de host diferente.
/etc/ssh/ssh_known_hosts: Os ficheiros known-hosts de todo o cluster que referenciam o hostname antigo devem ser atualizados.- Ficheiros de configuração de aplicações: Qualquer hostname codificado em configurações de aplicações, strings de ligação JDBC ou listeners anunciados de brokers de mensagens deve ser atualizado.
Comparação: Métodos de Configuração de Hostname
| Método | Compatibilidade de Distribuição | Requer Reinicialização | Trata Cloud-Init | Atualização Atómica |
|---|---|---|---|---|
hostnamectl set-hostname | Distribuições systemd | Não | Não (necessita de preserve_hostname) | Sim |
Editar /etc/hostname manualmente | Todas as distribuições | Não (com cmd hostname) | Não | Não |
Cloud-init preserve_hostname | Instâncias na nuvem | Não | Sim | N/A |
Configuração do cliente DHCP (supersede) | Todas as distribuições | Não | Não | Não |
NetworkManager nmcli | Sistemas geridos por NM | Não | Não | Sim |
Casos Extremos e Armadilhas do Mundo Real
Armadilha 1: O ciclo de aviso sudo. Se definir o hostname mas se esquecer de atualizar /etc/hosts, cada invocação de sudo imprimirá sudo: unable to resolve host new-static-hostname. Isto não é fatal, mas adiciona latência a cada comando privilegiado e inunda os registos.
Armadilha 2: Os serviços Java recusam-se a iniciar. O InetAddress.getLocalHost() do Java resolve o hostname via gethostbyname(). Se o hostname não estiver em /etc/hosts ou não for resolvível via DNS, serviços como Elasticsearch, Kafka e Cassandra lançam UnknownHostException no arranque.
Armadilha 3: Hostname com sublinhados. Apesar de serem amplamente usados informalmente, os sublinhados em hostnames violam o RFC 952 e o RFC 1123. Alguns resolvedores DNS, bibliotecas TLS e componentes Kubernetes irão rejeitá-los ou tratá-los incorretamente. Use sempre hífenes.
Armadilha 4: FQDN vs. hostname curto. hostnamectl armazena apenas o hostname curto (por exemplo, web01). O FQDN (por exemplo, web01.example.com) é resolvido combinando o hostname curto com a lista de pesquisa de domínio em /etc/resolv.conf ou /etc/systemd/resolved.conf. Defina Domains=example.com em resolved.conf ou search example.com em resolv.conf para que hostname --fqdn retorne o valor correto.
Armadilha 5: Isolamento de contentores e namespaces. Dentro de um contentor Docker ou namespace LXC, hostnamectl pode falhar com Failed to connect to bus: No such file or directory porque systemd-hostnamed não está em execução. Use hostname new-name diretamente, ou defina o hostname no momento da criação do contentor via docker run --hostname ou a chave hostname: em docker-compose.yml.
Lista de Verificação Prática para Decisões
Use esta lista de verificação antes e depois de cada alteração de hostname num ambiente de produção:
- Confirme que o novo hostname está em conformidade com o RFC 1123 (minúsculas, apenas hífenes, máximo 63 caracteres por rótulo)
- Execute
hostnamectlantes da alteração e guarde a saída para fins de auditoria - Defina o hostname estático com
hostnamectl set-hostnameou editando/etc/hostname - Atualize
/etc/hostscom o hostname curto e o FQDN na mesma linha - Se o sistema for uma instância na nuvem, defina
preserve_hostname: truena configuração do cloud-init - Se o DHCP estiver ativo, configure o cliente DHCP para ignorar os hostnames oferecidos pelo servidor
- Atualize os registos DNS A e PTR
- Renove ou reemita quaisquer certificados TLS que referenciem o hostname antigo
- Reinicie os serviços dependentes do hostname (syslog, agentes de monitorização, aplicações Java)
- Abra uma nova sessão de shell e verifique se
hostname,hostname --fqdnehostnamectlretornam valores consistentes - Verifique
/var/log/syslogoujournalctl -bpara quaisquer erros pós-alteração que referenciem o hostname antigo
FAQ
O hostnamectl set-hostname requer uma reinicialização para entrar em vigor?
Não. O hostnamectl chama a chamada de sistema sethostname(2) imediatamente, atualizando o kernel em execução em tempo real. A alteração também é escrita em /etc/hostname para persistência. Os novos processos e as novas sessões de shell verão o hostname atualizado sem qualquer reinicialização.
Por que o meu hostname reverte após cada reinicialização num VPS na nuvem?
O cloud-init está quase certamente a substituí-lo. Adicione preserve_hostname: true a /etc/cloud/cloud.cfg ou crie um ficheiro drop-in em /etc/cloud/cloud.cfg.d/99_hostname.cfg com a mesma diretiva. Esta é a causa mais comum de reversão de hostname em máquinas alojadas na nuvem.
Qual é a diferença entre 127.0.0.1 e 127.0.1.1 em /etc/hosts?
127.0.0.1 é o endereço de loopback padrão mapeado para localhost. As distribuições da família Debian usam 127.0.1.1 como endereço de loopback secundário especificamente para o próprio hostname da máquina, evitando conflitos quando a máquina não tem IP estático. Em sistemas da família RHEL e máquinas com IP fixo, use o endereço IP primário real para o mapeamento do hostname.
Posso usar um sublinhado num hostname Linux?
Tecnicamente o sistema operativo aceitará, mas não deve fazê-lo. Os sublinhados violam o RFC 952 e o RFC 1123. Causam falhas na resolução DNS (o BIND rejeita-os por padrão), na validação de certificados TLS e na nomenclatura de nós Kubernetes. Use exclusivamente hífenes.
Como verifico se o hostname é totalmente consistente em todas as camadas do sistema?
Execute a seguinte sequência e confirme que todas as saídas correspondem:
hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"Se algum destes retornar valores diferentes, uma das camadas — cloud-init, cliente DHCP ou NetworkManager — ainda está a substituir a configuração estática.
