Linux / Machine-id: consultar e preparar imagens clonadas
O machine-id é um identificador persistente de uma instalação Linux baseada em systemd, normalmente guardado em /etc/machine-id. Reiniciar ou mudar o nome do host não costuma alterá-lo. Ao preparar uma imagem para clonagem, é preciso tratar esse identificador para que cópias distintas não reutilizem o mesmo valor.
O que é o machine-id?
O valor tem 128 bits, normalmente representados por 32 caracteres hexadecimais minúsculos e uma quebra de linha. Um identificador válido não pode ser composto apenas de zeros. O systemd o estabelece durante a instalação ou a inicialização e normalmente o mantém nas inicializações seguintes.
Esse valor não é o nome legível do servidor. O administrador pode escolher e alterar o hostname, enquanto o machine-id identifica a instalação do sistema operacional. Para renomear um servidor, consulte o procedimento de hostnamectl no Rocky Linux.
Também não é o número de série do equipamento nem o endereço MAC de uma interface. Trocar hardware ou configurações de rede não o modifica por si só. O manual machine-id(5) do projeto systemd descreve o formato e a inicialização.
Consultar o identificador atual
Em um sistema que você administra, consulte o valor localmente com:
cat /etc/machine-id
Uma instalação inicializada normalmente mostra 32 caracteres hexadecimais. Se o arquivo estiver vazio ou ausente, investigue o fluxo da imagem, do contêiner ou do sistema de arquivos somente leitura antes de inserir qualquer texto. O estado do arquivo tem significado para o processo de inicialização.
Não publique o identificador real em capturas, registros públicos ou pedidos de suporte. O systemd o considera confidencial. Para um identificador estável que uma aplicação precise expor, use uma derivação com hash criptográfico e chave específica da aplicação, em vez do valor original ou de um trecho dele. Isso não transforma o machine-id em senha ou token de autenticação.
Reiniciar ou renomear o host altera o ID?
Normalmente, não. O identificador pertence à instalação e não é recriado a cada reinicialização comum. É independente do hostname, do IP e do MAC. Sistemas sem estado e opções explícitas de inicialização podem ter outro fluxo; não confunda esses casos com a persistência de uma instalação normal.
Se servidores com nomes diferentes tiverem o mesmo machine-id, verifique se a clonagem copiou um valor já inicializado. Nomes iguais também não provam que os IDs sejam iguais. Faça a comparação em um ambiente de administração confiável, sem divulgar os valores.
Quando preparar uma nova identidade
O caso principal é uma imagem usada como base para várias máquinas virtuais, instâncias de nuvem ou contêineres. Uma cópia direta do disco pode copiar /etc/machine-id. Prepare uma cópia da imagem com o sistema desligado e deixe cada instância estabelecer sua identidade ao iniciar; não volte a iniciar o modelo preparado antes de copiá-lo, pois isso pode inicializar novamente o valor do modelo.
Não há motivo para trocar rotineiramente o ID de um servidor em uso. Planeje a alteração quando houver duplicação ou um processo de criação de imagens. Identificadores de rede podem derivar desse valor; as orientações do systemd para criar imagens também tratam outros estados específicos de cada instância.
Como o estado do arquivo afeta o primeiro boot
Remover o arquivo e deixá-lo vazio não são operações equivalentes. A tabela resume a detecção normal do systemd, sem uma opção como systemd.condition_first_boot= que substitua essa detecção. A criação de uma identidade pode reutilizar fontes fornecidas pelo ambiente; não é garantia de geração aleatória.
| Estado na imagem | Identidade ao iniciar | Primeiro boot por detecção normal |
|---|---|---|
| Arquivo ausente | O systemd tenta estabelecer uma identidade | Sim |
Contém uninitialized |
O systemd tenta estabelecer uma identidade | Sim |
| Existe com zero bytes | O systemd tenta estabelecer uma identidade | Não |
| Contém um ID válido | Usa o valor existente | Não |
Quando há detecção de primeiro boot, unidades com ConditionFirstBoot=yes e outras inicializações podem ser executadas. Um arquivo vazio permite estabelecer uma identidade sem acionar essa detecção normal. Em uma imagem somente leitura, um arquivo existente pode ser necessário para receber uma montagem temporária sobre ele; a ausência do arquivo pode impedir esse mecanismo. Consulte as regras de primeiro boot no manual antes de escolher o estado.
Preparar a identidade em uma imagem para clonagem
O exemplo abaixo pressupõe uma imagem confiável, desligada e sem edição concorrente, montada por outro sistema Linux em /mnt/image-root. Tenha uma cópia ou um snapshot anterior. Não use a raiz do sistema de administração nem uma montagem de uma instância ainda em execução. O procedimento usa Bash, findmnt do util-linux e utilitários GNU; layouts diferentes, permissões insuficientes e caminhos não previstos devem levar à interrupção, não à retirada das verificações.
- Desligue a imagem e preserve um backup ou snapshot. Mantenha a origem intacta se estiver preparando uma cópia.
- Monte os sistemas de arquivos da imagem em outro sistema Linux, confirme o alvo e inspecione os dois caminhos de ID. Não deixe outro processo editar ou iniciar a imagem durante a operação.
image_root=/mnt/image-root
verificar_id_imagem() {
local alvo parte
case "$image_root" in /*) ;; *) return 1 ;; esac
case "$1" in
etc/machine-id|var/lib/dbus/machine-id) ;;
*) return 1 ;;
esac
[ "$image_root" != / ] &&
[ "$(realpath -e -- "$image_root")" = "$image_root" ] &&
findmnt --mountpoint "$image_root" > /dev/null || return 1
for parte in etc var var/lib var/lib/dbus; do
[ -d "$image_root/$parte" ] &&
[ ! -L "$image_root/$parte" ] || return 1
done
alvo="$image_root/$1"
[ -f "$alvo" ] && [ ! -L "$alvo" ] &&
[ "$(stat -c %h -- "$alvo")" = 1 ] &&
[ "$(realpath -e -- "$alvo")" = "$alvo" ]
}
findmnt --mountpoint "$image_root"
ls -l -- "$image_root/etc/machine-id" "$image_root/var/lib/dbus/machine-id"
Defina image_root com o ponto de montagem físico real, absoluto e sem barra final. Confira a origem e todas as montagens da imagem: findmnt encontrar um ponto de montagem não prova que ele seja a imagem correta ou esteja desligado. A função de verificação recusa caminhos fora da lista, raiz com resolução diferente, diretórios simbólicos, arquivo ausente, link simbólico e arquivo com mais de um hard link (ligação ao mesmo arquivo). É uma proteção conservadora para este layout, não um isolador para imagens não confiáveis. Mantenha o mesmo terminal para usar a função nos próximos blocos.
Permitir também a inicialização de primeiro boot
Para uma imagem gravável que deva ser reconhecida como primeiro boot, escolha a remoção do arquivo regular dentro da imagem. Reconfirme o alvo antes de executar. Se o arquivo já estiver ausente, essa condição já favorece o primeiro boot; não crie um valor antigo para satisfazer a verificação.
verificar_id_imagem etc/machine-id &&
sudo rm -- "$image_root/etc/machine-id"
Como alternativa, para um arquivo regular que deva continuar presente, grave uninitialized e uma quebra de linha. Escolha esta opção ou a remoção, conforme a imagem; não execute ambas. As verificações exigem que o arquivo regular já exista e seja exclusivo.
verificar_id_imagem etc/machine-id &&
printf 'uninitialized\n' | sudo tee "$image_root/etc/machine-id" > /dev/null
Se /var/lib/dbus/machine-id for um arquivo regular separado que ainda guarda a identidade anterior, ele também pode provocar reutilização. Depois de confirmar esse caso e o alvo offline, remova somente esse arquivo:
verificar_id_imagem var/lib/dbus/machine-id &&
sudo rm -- "$image_root/var/lib/dbus/machine-id"
Se esse caminho for um link simbólico para /etc/machine-id, preserve o link e examine seu destino. Um link absoluto dentro de uma árvore montada pode apontar para o sistema de administração quando seguido por ferramentas comuns; o mesmo risco existe se os diretórios pais ou /etc/machine-id forem links. Os blocos de modificação deste exemplo recusam esses layouts e arquivos com hard links. Para um layout não atendido, use o procedimento específico do criador da imagem ou ferramentas que operem conscientemente sobre a imagem.
Preparar um ID sem as ações de primeiro boot
Se a intenção for permitir uma identidade sem disparar os trabalhos exclusivos de primeiro boot, deixe o arquivo existente vazio dentro da imagem:
verificar_id_imagem etc/machine-id &&
sudo truncate -s 0 -- "$image_root/etc/machine-id"
O arquivo passa a ter zero bytes, e a detecção normal não considera isso primeiro boot. Ainda é necessário tratar um ID D-Bus separado e conferir fontes fornecidas pelo hipervisor ou contêiner. Uma opção de linha de comando que forneça um machine-id tem prioridade; limpar o arquivo não anula essa opção. A escolha também deve atender aos requisitos de uma imagem somente leitura e do criador da imagem.
Ao terminar, desmonte a imagem corretamente e inicie uma cópia para verificar a identidade e os serviços. Cada instância precisa receber fontes de identidade apropriadas; não suponha que o UUID do hipervisor será diferente sem conferir o provisionamento. O manual systemd-machine-id-setup(1) explica que a ferramenta pode reutilizar IDs existentes, em vez de sempre gerar um valor aleatório. Para inicializar uma imagem montada, o projeto também documenta systemd-firstboot. Esses utilitários têm finalidades diferentes de deixar um modelo genérico sem identidade.
Por que truncar e remover dois caminhos não basta
Duas sugestões frequentes são truncar /etc/machine-id e remover o caminho de ID do D-Bus. Antes de interpretar esses efeitos, inspecione os tipos de arquivo sem alterá-los:
ls -l -- /etc/machine-id /var/lib/dbus/machine-id
Truncar para zero bytes mantém o arquivo, mas não obriga a execução de unidades exclusivas de primeiro boot. Também não troca imediatamente a identidade já guardada por processos em execução. Por isso, esvaziar o arquivo em um servidor ativo não equivale a preparar uma imagem offline para a inicialização de cada cópia.
Remover o caminho D-Bus pode evitar reutilização quando ele é um arquivo regular separado. Se for um link, a remoção elimina o link, sem apagar o arquivo ao qual ele aponta. A opção -f ainda pode esconder a ausência do caminho; obter êxito na remoção não comprova que o processo de identidade inteiro foi preparado corretamente.
Não aplique essas duas ações como rotina em um servidor em execução. Verifique o layout e use o procedimento offline apropriado. A comparação final entre instâncias e a verificação de rede e serviços são necessárias porque o systemd pode obter a identidade de fontes além do arquivo D-Bus.
Se servidores em operação já têm IDs duplicados
Identifique o original e a cópia, escolha qual instância terá a identidade alterada e planeje a indisponibilidade. Não apague o arquivo de um servidor ativo e presuma que o conjunto de processos passará a usar outro ID de forma consistente. Registros do journal, rede e aplicações podem depender da identidade anterior.
Preserve backups e a configuração dos serviços, desligue a cópia e trabalhe no disco a partir de outro ambiente. Depois de iniciar, confira identidade distinta, rede e aplicações. Um modelo completo também exige tratar chaves de host SSH, sementes aleatórias e outros estados por instância. O manual oficial do virt-sysprep descreve operações de preparação; muitas podem estar ativas por padrão, então examine a lista e selecione conscientemente o conjunto. Não é uma ferramenta limitada ao machine-id nem deve editar uma VM ativa.
Perguntas frequentes
Posso usar machine-id como senha ou token?
Não. É um identificador de instalação, não uma credencial de autenticação. Preserve a confidencialidade do valor original e use o mecanismo apropriado de autenticação para a aplicação.
IDs iguais provam que são o mesmo sistema?
Não. Uma clonagem pode ter copiado o valor. Examine a configuração e o processo de implantação antes de concluir que as instalações são a mesma entidade.
Alterar o hostname com hostnamectl muda o machine-id?
Normalmente, não. Os dois valores têm funções e configurações diferentes; renomear o host não cria uma nova identidade de instalação.
Devo remover o arquivo ou deixá-lo vazio no modelo?
Na detecção normal, ausente ou uninitialized permite primeiro boot; vazio não o aciona. Confira também opções de inicialização, ID D-Bus, fontes do hipervisor e requisitos de somente leitura. Nenhum desses estados sozinho comprova a identidade distinta de todas as cópias.




