Linux / machine-id の確認方法とシステム複製時の注意事項
machine-idはsystemdベースのLinuxインストールを識別するための固有の値です。通常、/etc/machine-idに保存され、再起動したりホスト名を変更してもそのまま維持されます。サーバーや仮想マシンを複製する際にこの値までコピーすると、異なるシステムが同じIDを持つ可能性があるため注意が必要です。
machine-idとは?
machine-idはローカルシステムを識別するために使用される128ビットの値です。/etc/machine-idファイルには通常、小文字の16進数32文字と改行文字で保存されます。systemdはインストール時や初回起動時にこの値を設定し、それ以降の起動でも同じ値を使用します。
この値は人間が認識しやすいサーバー名ではありません。ホスト名は管理者が設定したり変更できる名前ですが、machine-idはオペレーティングシステムのインストールインスタンスを識別するために使用されます。ホスト名を変更する方法はRocky Linuxでホスト名を変更するを参照してください。
また、machine-idはハードウェアのシリアル番号やネットワークカードのMACアドレスとも異なります。ハードウェアの交換やネットワーク設定の変更だけで値が変わることはありません。形式と初期化動作はsystemdのmachine-id(5)マニュアルに説明されています。
現在のmachine-idを確認する
自分が管理しているシステムで現在の値を確認するには、以下のコマンドを実行します。
cat /etc/machine-id
正常に初期化された一般的なシステムでは、32桁の16進数の値が表示されます。値が空であったりファイルが存在しないからといって、すぐに手動で任意の文字列を入力しないでください。イメージ・コンテナ・読み取り専用のファイルシステムなどでは、ブート段階での初期化方法が異なる場合があります。
実際のIDを投稿、公開ログ、サポート要求画面にそのまま貼り付けないことを推奨します。 systemdの文書では、この値を信頼できない環境、特にネットワークに直接公開してはいけない識別情報として扱うべきとしています。アプリケーションが公開可能な固定の識別子を生成する必要がある場合、元のmachine-idをそのまま使用せず、用途別キーを使用する派生識別子の方式を検討するべきです。
再起動したりホスト名を変更したら変わるでしょうか?
一般的に変わりません。machine-idは起動するたびに新たに作られる値ではなく、システムインストールインスタンスに付く持続的な識別子です。ホスト名、IPアドレス、MACアドレスとも独立しています。
したがって、名前だけが異なる2つのサーバーのmachine-idが同じであれば、単なるホスト名の重複ではなく、複製や初期化のプロセスを確認すべき兆候である可能性があります。逆に、ホスト名が同じだからといってmachine-idも必ず同じというわけではありません。
machine-idを初期化する必要がある場合
代表的な場合は、1つのOSイメージを複数の仮想マシン・クラウドインスタンス・コンテナの基盤として使用する場合です。既にインストールされたシステムのディスクをそのまま複製すると、/etc/machine-idも一緒にコピーされ、異なるインスタンスが同じIDを使用することがあります。新しいインスタンスごとに固有のIDを持たせるには、複製用の元イメージを終了した状態で初期化し、各複製の最初の起動時に新しいIDが設定されるように準備する必要があります。
一方、普段使用しているサーバーで単に値を新しく変更したいという理由だけで初期化する必要はありません。IDが重複している場合や、イメージ配布手順を作成するなど明確な理由がある場合にのみ行ってください。systemdはこの値から派生したネットワーク識別子がある可能性があると説明しています。systemdの安全なイメージ作成ガイドラインも合わせて確認することをお勧めします。
ファイル状態に応じた初回起動時の動作
/etc/machine-idを空にする方法や削除する方法は完全に同じではありません。どの初期化作業まで実行するかを先に決める必要があります。
| イメージのファイル状態 | 新ID作成 | systemdの初回起動判断 |
|---|---|---|
| ファイルなし | 起動中に新しいID設定を試行 | 初回起動と判断 |
uninitialized 記録 |
起動中に新しいID設定を試行 | 初回起動と判断 |
| 存在するが0バイト | 起動中に新しいID設定を試行 | 初回起動とは判断しない |
| 有効な既存ID | 既存の値を使用 | 初回起動とは判断しない |
初回起動と判断された場合、ConditionFirstBoot=yes に指定されたユニットなど、追加の初期化が実行されることがあります。空のファイルは新しいIDを生成できるようにしながらも、このような初回起動処理は開始しません。読み取り専用のファイルシステムでは、一時IDをファイル上にバインドマウントする必要がある場合があるため、ファイルを削除する方法が適切かどうかも確認してください。詳しいルールは machine-id(5) の First Boot Semantics を参照してください。
クローン用イメージで初期化する手順
以下は、停止した複製用イメージのルートファイルシステムを、別の管理システムの/mnt/image-rootにマウントした場合の例です。/mnt/image-rootは実際の場所に置き換えます。管理システム自身のルートや稼働中のVMディスクを対象にせず、マウント元が停止済みイメージの目的の領域であることまで確認してください。イメージ内のetcやvar/lib/dbusを含むパスの途中がシンボリックリンクになって別の場所を参照していないことも確認します。以下は信頼できる管理対象イメージを前提にしており、未知のイメージを安全に処理する仕組みではありません。
- 元のVMまたはイメージを終了し、バックアップやスナップショットを作成します。複数のサーバーのベースとなるテンプレートを修正する場合は、元のものも保持します。
- イメージを別の管理システムにマウントします。以下のコマンドで
/mnt/image-rootが実際のイメージのマウントポイントであるか確認し、二つのIDファイルの状態を確認します。
findmnt --mountpoint /mnt/image-root
ls -l /mnt/image-root/etc/machine-id /mnt/image-root/var/lib/dbus/machine-id
findmntが目的のマウントを示さない場合は止めてください。表示されたというだけでは正しいイメージである保証にはなりません。/var/lib/dbus/machine-idは/etc/machine-idへのリンクか、独立した通常ファイルかを区別します。独立したファイルに古いIDが残ると再利用される可能性があります。絶対パスのリンクを管理システム側から参照すると、そのホスト側へ解決され得る点にも注意してください。
初回起動の初期化も同時に実行する場合は
書き込み可能なイメージでsystemdが初回起動と認識する必要がある場合、マウントポイントを再確認した後、イメージ内のファイルを削除できます。
findmnt --mountpoint /mnt/image-root > /dev/null &&
sudo rm -- /mnt/image-root/etc/machine-id
ファイルを残す必要があるイメージなら、以下のようにuninitializedと改行を記録できます。削除する方法とはどちらか一つを選びます。teeやtruncateはリンク先へ書き込むため、対象がシンボリックリンクなら実行せず、イメージ内の構成を確認してください。
findmnt --mountpoint /mnt/image-root > /dev/null &&
test ! -L /mnt/image-root/etc/machine-id &&
printf 'uninitialized\n' | sudo tee /mnt/image-root/etc/machine-id > /dev/null
/var/lib/dbus/machine-idが別の一般ファイルで以前のIDが保存されている場合、このファイルも初期化する必要があります。先に実行したls -lでシンボリックリンクではないことを確認した場合に限り、終了したイメージに対して次のコマンドを実行します。
findmnt --mountpoint /mnt/image-root > /dev/null &&
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
シンボリックリンクであれば上記のコマンドを実行せず、リンクが指す対象とディストリビューションの構成を確認してください。systemdは/etc/machine-idが空であるか存在しない場合、別のD-Bus IDを再利用できるため、二つのパスの関係を確認する過程が重要です。
新しいIDだけを作成し、最初の起動作業を避けたい場合
最初の起動専用ユニットを再実行せずIDだけを新しく設定したい場合は、イメージ内のファイルを空のファイルとして残します。
findmnt --mountpoint /mnt/image-root > /dev/null &&
test ! -L /mnt/image-root/etc/machine-id &&
sudo truncate -s 0 -- /mnt/image-root/etc/machine-id
この場合、systemdはファイルが空であるため新しいIDを設定できますが、これを最初の起動と判断しません。読み取り専用イメージで空のファイルを残す方法も関連する場合があります。この方法を選んでも別のD-Bus IDファイルに以前の値が残っている場合は、前節の確認と初期化が必要です。イメージ作成ツールの動作と最初の起動ユニットの必要性も合わせて確認してください。
作業後はイメージを正常にアンマウントし、複製を起動します。各/etc/machine-idが異なることを管理環境内で比較し、実際の値は公開しません。空のファイルにしただけで必ず新しい乱数を使うとは限りません。D-Bus ID、仮想マシンやコンテナが提供するIDなどを再利用する場合があるため、複製ごとの仮想マシン識別情報も固有であることを確認します。systemd-machine-id-setupも既存の値を再利用し得ます。詳しくはsystemd-machine-id-setup(1)を参照してください。
よく見られる2つのコマンドの意味と限界
次の2つは資料で見かけるコマンドを比較するための引用です。稼働中のサーバーで実行する手順ではありません。前節の停止済みイメージを対象とする方法と区別して読んでください。
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
最初のコマンドは /etc/machine-id ファイルを削除せず、0バイトにします。その後のブートで systemd が新しい ID を設定することがありますが、前の表のように空ファイルは初回ブートと判断されないため、初回ブート専用ユニットを実行する目的には適しません。既に実行中の systemd やサービスが使用している ID が、このコマンドだけで即座に変更されることもありません。
2番目のコマンドは D-Bus の ID パスを削除します。このファイルが以前の ID を保持している別の通常のファイルであれば、再利用を防ぐために必要な場合があります。しかし、該当パスが /etc/machine-id を指すシンボリックリンクである場合、rm -f ではリンクのみが削除されます。-f のため、ファイルが存在しなくてもエラーは表示されないので、コマンドを実行したという事実だけで 2 つの ID が正しく初期化されたと判断してはいけません。
2つのコマンドを実際に運用中のサーバーにそのままコピーして実行することは推奨されません。まず ls -l /etc/machine-id /var/lib/dbus/machine-id でファイルとリンクの関係を確認し、複製用イメージであれば前節のように停止したイメージで処理してください。初期化後には、各複製を起動して新しい ID が保存されているか、サービスが正常に動作するか確認する必要があります。systemd は /etc/machine-id が空の場合、D-Bus ID だけでなく環境で提供される他の ID も利用できます。machine-id(5) の初期化手順を参照してください。
すでに運用中のサーバーで ID の重複を発見した場合
運用中のサーバーの/etc/machine-idをすぐに削除したり、空にした後でサービスを使用し続ける方法は推奨されません。実行中のプロセスが既存のIDを記憶している可能性があり、ジャーナル・ネットワーク・アプリケーションの状態に影響を与える可能性があります。まずどのサーバーがオリジナルでどのサーバーが複製かを確認し、変更する複製を決めて停止時間を計画してください。
影響を受けるサービスとデータのバックアップを確保した後、複製を停止し、別の環境でディスクイメージを修正する手順が安全です。その後起動して、新しいIDが設定されているか、他のサーバーと重複していないか、ネットワーク接続と関連サービスが正常かを検証します。VMテンプレート全体を準備する作業の場合、machine-id以外のSSHホストキー、ランダムシード、ホスト名なども各インスタンスに合わせて処理する必要があります。Red HatのVMテンプレート作成手順はvirt-sysprepを使用した方法について説明しています。このツールは他のシステム状態も初期化できるため、対象と実施作業を確認した上で使用する必要があります。
よくある質問
machine-idをパスワードや認証トークンのように使用してもよいですか?
だめです。これはシステム識別子であり、ユーザーを認証するための秘密鍵ではありません。元の値を外部に漏らしてはいけませんが、それ自体をパスワードとして設計してもいけません。
値が同じなら、二つのシステムは完全に同じシステムですか?
そうとは限りません。複製の過程で同じIDがコピーされた可能性があるため、実際のシステム構成とイメージ配布の過程を確認する必要があります。
hostnamectlでホスト名を変更するとmachine-idも変わりますか?
いいえ。ホスト名とmachine-idは目的と保存場所が異なる別の値です。ホスト名を変えただけで/etc/machine-idが新たに生成されることはありません。
クローン用イメージでは、ファイルを削除するのと空にするのとどちらが正しいですか?
初回起動専用の初期化が必要な場合は、ファイルをなくすかuninitializedの状態にしておき、IDだけ新たに設定する場合は空のファイルを残します。読み取り専用ファイルシステムやイメージツールの要件も確認する必要があります。




