Machine-id in Linux: controllo e preparazione delle immagini da clonare

Il machine-id è l’identificatore persistente di un’installazione Linux basata su systemd, normalmente conservato in /etc/machine-id. Un riavvio o il cambio del nome host non lo rigenerano. Quando prepari un’immagine da clonare, devi gestire anche questo valore: copiarlo senza inizializzazione può assegnare lo stesso ID a sistemi distinti.

Che cos’è il machine-id?

Il machine-id è un valore di 128 bit. Nel file /etc/machine-id è rappresentato da 32 cifre esadecimali minuscole seguite da una nuova riga; non può essere composto soltanto da zeri. Systemd lo stabilisce durante l’installazione o l’avvio e normalmente lo conserva nei riavvii successivi. Nei sistemi senza stato persistente la gestione può essere diversa.

Non è il nome leggibile del server. Il nome host può essere scelto e cambiato dall’amministratore, mentre il machine-id identifica l’istanza del sistema operativo. Per cambiare il nome senza confonderlo con l’ID, consulta la procedura per cambiare il nome host su Rocky Linux.

È distinto anche dal numero di serie dell’hardware e dall’indirizzo MAC dell’interfaccia di rete. Una sostituzione dell’hardware o una modifica della configurazione di rete non lo cambia automaticamente. Il manuale machine-id di systemd descrive formato, inizializzazione e casi particolari.

Controllare il machine-id attuale

Su un sistema che amministri, questo comando legge il valore senza modificarlo:

cat /etc/machine-id

In un’installazione normalmente inizializzata compare un valore esadecimale di 32 caratteri. Se il file è vuoto o assente, non inserire una stringa arbitraria: immagini, container e filesystem in sola lettura possono usare un’inizializzazione specifica durante l’avvio. Controlla anche man machine-id nella versione di systemd installata.

Non pubblicare il valore reale in articoli, log pubblici o richieste di assistenza. Systemd lo considera riservato, soprattutto rispetto all’esposizione in rete. Per un identificatore stabile che un’applicazione deve esporre, usa una derivazione con una funzione hash crittografica con chiave specifica per l’applicazione, non il valore originale né una sua parte. L’API sd_id128_get_machine_app_specific implementa questo approccio.

Un riavvio o un nuovo nome host cambiano l’ID?

Normalmente no. Il machine-id è persistente per l’installazione del sistema operativo e non viene rigenerato a ogni avvio. È indipendente dal nome host, dall’indirizzo IP e dall’indirizzo MAC.

Due server con nomi diversi e lo stesso machine-id possono indicare un’immagine copiata senza la preparazione necessaria. Occorre controllare la procedura di clonazione e inizializzazione; non basta cambiare il nome host. Viceversa, nomi host uguali non dimostrano che anche gli ID coincidano.

Quando inizializzare nuovamente il machine-id

Il caso tipico è un’immagine del sistema operativo destinata a più macchine virtuali, istanze cloud o container. Una copia del disco può duplicare anche /etc/machine-id. Prepara l’immagine mentre è spenta e lascia che ogni clone ottenga il proprio ID all’avvio. Se il sistema riceve altri identificatori dall’ambiente virtuale, anche questi devono essere distinti per ciascuna istanza.

Non occorre reimpostare l’ID di un server in funzione soltanto per cambiarne il valore. Una duplicazione accertata o la preparazione di un modello di distribuzione sono motivi concreti per pianificare l’operazione. Da questo ID possono derivare identificatori visibili in rete: la guida di systemd per creare immagini in modo sicuro spiega quali dati specifici dell’istanza considerare.

Come lo stato del file influisce sul primo avvio

Eliminare il file e lasciarlo vuoto non produce gli stessi effetti. Scegli se deve essere eseguita anche l’inizializzazione riservata al primo avvio. La tabella descrive il rilevamento ordinario: il parametro del kernel systemd.condition_first_boot= può modificarlo.

Stato del file nell’immagine ID all’avvio Rilevato come primo avvio
File assente Systemd tenta di stabilire un ID Sì
Contiene uninitialized Systemd tenta di stabilire un ID Sì
File presente ma di zero byte Systemd tenta di stabilire un ID No
Contiene un ID valido Viene usato il valore esistente, salvo un’impostazione esplicita di priorità superiore No

Quando rileva il primo avvio, systemd può eseguire unità con ConditionFirstBoot=yes e ulteriori inizializzazioni. Un file vuoto consente di stabilire l’ID senza attivare questo rilevamento. Nei filesystem in sola lettura serve inoltre un file esistente su cui montare temporaneamente, tramite bind mount, il file con l’ID; se manca, l’avvio può incontrare un errore. Le regole sono nella sezione First Boot Semantics di machine-id.

Preparare l’ID in un’immagine da clonare

Gli esempi seguenti presuppongono che un’immagine spenta sia già montata da un sistema di amministrazione separato in /mnt/image-root. Sostituisci il percorso con il punto di montaggio effettivo. Non applicare i comandi al /etc/machine-id del sistema amministrativo o di un server in esecuzione. Scegli una sola modalità di preparazione del file, in base alle esigenze del primo avvio.

  1. Spegni la macchina virtuale e conserva un backup o uno snapshot recuperabile. Se prepari un modello a partire da una copia, mantieni intatto l’originale.
  2. Monta l’immagine sul sistema separato. Controlla che il punto di montaggio corrisponda davvero al disco scelto e ispeziona i due percorsi dell’ID:
findmnt --mountpoint /mnt/image-root
ls -l /mnt/image-root/etc/machine-id /mnt/image-root/var/lib/dbus/machine-id

Se findmnt non mostra il punto di montaggio previsto, fermati. La presenza di un mount da sola non certifica che sia il disco corretto: controlla dispositivo e destinazione. Prima di scrivere, verifica anche che le directory intermedie come etc e var/lib/dbus nell’immagine non siano collegamenti che portano fuori dal percorso previsto. Il file D-Bus può essere un collegamento simbolico verso /etc/machine-id oppure un file separato: nel secondo caso un vecchio valore può essere riutilizzato da systemd.

Eseguire anche l’inizializzazione del primo avvio

Su un’immagine scrivibile che deve essere riconosciuta come un primo avvio, dopo aver verificato disco e percorsi puoi rimuovere il file dentro l’immagine. La verifica findmnt viene ripetuta prima dell’operazione; se fallisce, la parte dopo && non viene eseguita.

findmnt --mountpoint /mnt/image-root &&
  sudo rm -- /mnt/image-root/etc/machine-id

In alternativa, se il file deve rimanere presente, puoi scrivere uninitialized seguito da una nuova riga. Scegli questo metodo oppure la rimozione precedente. Il controllo rifiuta un collegamento simbolico come file finale: non usare tee per seguire un collegamento assoluto dell’immagine verso il filesystem dell’amministratore.

findmnt --mountpoint /mnt/image-root &&
  test ! -L /mnt/image-root/etc/machine-id &&
  printf 'uninitialized\n' | sudo tee /mnt/image-root/etc/machine-id > /dev/null

Se il percorso D-Bus è un file regolare separato con il vecchio ID, rimuovi anche quello dall’immagine spenta. Il controllo seguente richiede un file regolare che non sia un collegamento simbolico; se non corrisponde a questo caso, fermati e verifica il motivo.

findmnt --mountpoint /mnt/image-root &&
  test -f /mnt/image-root/var/lib/dbus/machine-id &&
  test ! -L /mnt/image-root/var/lib/dbus/machine-id &&
  sudo rm -- /mnt/image-root/var/lib/dbus/machine-id

Se è un collegamento simbolico, mantienilo e controlla destinazione e struttura prevista dalla distribuzione. Un collegamento assoluto verso /etc/machine-id va interpretato rispetto alla radice del sistema quando verrà avviato, non seguito con scritture dal sistema amministrativo. Il problema da evitare è un vecchio ID in un file D-Bus separato che systemd potrebbe riutilizzare.

Stabilire l’ID senza attivare le azioni del primo avvio

Se le unità riservate al primo avvio non devono essere riattivate, lascia un file vuoto nell’immagine. Il comando seguente richiede un file regolare esistente che non sia un collegamento simbolico: non continuare se i controlli falliscono.

findmnt --mountpoint /mnt/image-root &&
  test -f /mnt/image-root/etc/machine-id &&
  test ! -L /mnt/image-root/etc/machine-id &&
  sudo truncate -s 0 -- /mnt/image-root/etc/machine-id

Il file vuoto permette a systemd di stabilire l’ID, senza classificare l’avvio come il primo. È utile anche per il montaggio temporaneo nei filesystem in sola lettura. Resta necessario verificare l’eventuale file D-Bus separato, come sopra. Se l’immagine non contiene il file o usa una struttura diversa, segui il metodo del suo strumento di preparazione invece di forzare questi comandi.

Smonta regolarmente l’immagine e avvia un clone. Controlla che ciascuna istanza abbia un ID valido e distinto, confrontando i valori soltanto nell’ambiente amministrativo fidato. systemd-machine-id-setup non garantisce da solo un valore casuale: può riutilizzare un ID D-Bus o altre fonti disponibili, e il suo comportamento con --root differisce dall’esecuzione ordinaria. Il manuale di systemd-machine-id-setup descrive l’ordine di scelta. Anche gli UUID forniti dall’ambiente virtuale devono essere unici tra i cloni.

Significato e limiti di due comandi spesso suggeriti

Non eseguire la coppia seguente come procedura ordinaria su un server attivo. È riportata per spiegare il significato di comandi che compaiono in altre guide; per un modello di clonazione usa invece la procedura sull’immagine spenta.

sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id

Il primo comando riduce /etc/machine-id a zero byte senza eliminarlo. Un file vuoto può consentire di stabilire l’ID al prossimo avvio, ma non attiva il rilevamento del primo avvio. Non sostituisce immediatamente l’ID già conservato dai processi in esecuzione.

Il secondo rimuove il percorso dell’ID D-Bus. Se è un file regolare separato con il vecchio ID, rimuoverlo può impedirne il riutilizzo. Se è un collegamento verso /etc/machine-id, rm elimina soltanto il collegamento. Con -f anche l’assenza del file non genera un errore: l’esito del comando non dimostra che la preparazione dell’ID sia corretta.

Controlla prima la relazione tra i percorsi con ls -l /etc/machine-id /var/lib/dbus/machine-id. Nei modelli di clonazione intervieni a sistema spento e verifica ogni clone dopo l’avvio. Systemd può usare valori forniti dall’ambiente oltre all’ID D-Bus; un’impostazione esplicita tramite systemd.machine_id= o --machine-id= ha priorità sul file. La sezione Initialization del manuale machine-id descrive questi casi.

Se server già in funzione hanno ID duplicati

Non svuotare il file continuando poi a usare il server come se l’identità fosse già cambiata. I processi possono conservare il vecchio valore e lo stato di journal, rete o applicazioni può risentirne. Identifica originale e clone, scegli l’istanza da correggere e pianifica l’interruzione dei servizi.

Conserva backup dei dati e dei servizi interessati, spegni il clone e prepara il suo disco da un ambiente separato. Dopo l’avvio verifica unicità dell’ID, rete e servizi. Per tornare alla situazione precedente, ripristina il backup o snapshot coerente del clone spento; non distribuire di nuovo un modello con l’ID duplicato. Una preparazione completa può richiedere anche chiavi host SSH, nomi host, semi casuali e altri dati specifici dell’istanza. La guida Red Hat ai modelli di macchine virtuali illustra virt-sysprep: controlla quali operazioni esegue, perché modifica anche configurazioni diverse dal machine-id.

Domande frequenti

Posso usare il machine-id come password o token di autenticazione?

No. È un identificatore del sistema, non una credenziale di autenticazione. Mantieni riservato il valore originale, ma non usarlo come password.

ID uguali dimostrano che due sistemi sono identici?

No. L’ID può essere stato copiato durante la clonazione. Controlla configurazione e preparazione delle immagini invece di dedurre che si tratti della stessa macchina.

Cambiare il nome host con hostnamectl cambia anche il machine-id?

No. Nome host e machine-id hanno scopi e memorizzazione distinti. Il cambio del nome non rigenera /etc/machine-id.

Nell’immagine da clonare devo eliminare o svuotare il file?

Per attivare anche l’inizializzazione del primo avvio, rimuovilo o usa uninitialized. Per evitare quelle azioni, lascia un file vuoto. Verifica anche D-Bus, identificatori dell’ambiente virtuale, filesystem in sola lettura e requisiti del preparatore di immagini.