web-dev-qa-db-ja.com

ステートレス(UBI / UBIFS)組み込みLinux環境での永続的なsystemdマシンID

UBI/UBIFSからロードされる読み取り専用のルートファイルシステムを備えた組み込みLinuxマシンがあります。

デバイスが起動するたびに、新しいsystemdマシンIDが作成されます。これは、 ドキュメント を読んで理解できます。

マシンIDは通常、システムのインストール中にランダムなソースから生成され、その後のすべての起動で一定に保たれます。オプションで、ステートレスシステムの場合、空であることが判明した場合、起動時の実行時に生成されます。

Systemd machine-id-setup.c ファイルを読むことで、/ etc/machine-idにmachine-idを生成しようとするという意味でどのように機能するかを理解しています。それは存在しません。それが失敗し、パーティションが読み取り専用の場合、/ run/machine-idに生成され、/ etc/machine-id(シンボリックリンクではありません)にマウントされます。

質問があります、ステートレスデバイスの固定マシンIDを持つことができますか?私が持っている2つのオプションは次のとおりです。

1)マシンIDを不揮発性ストレージ(外部/ eMMC)に保存します。

  • 起動後、/ etc/machine-idが存在するかどうかを確認します
  • 存在しない場合は、systemdサービスを続行して、machine-idを生成するサービス/マウントを渡します(通常どおり)。
  • 新しいサービスファイル:machine-idが生成されたら、この文字列をメモリ/ NANDにないパーティション(eMMC(不揮発性))にコピーします。

したがって、デバイスが少なくとも1回初期化され、machine-idが不揮発性記憶媒体に保存されたので、起動シーケンスは次のようになります。

  • デバイスが起動し、非揮発性パーティションをマウントします。
  • 揮発性でないmachine-idが存在するかどうかを確認します(上記の最初のステップと同じ)
  • このファイルは存在するため、/ etc/machine-idにマウントします
  • / etc/machine-idの作成を処理するサービスファイルは、すでに存在しているため実行されなくなりました。

2)systemd machine-id-setup.c ファイルを変更し、machine-idが生成、保存、保存されるハードコードされたディレクトリを変更します。ただし、systemdシステムファイルを変更する必要があるため、このソリューションは避けたいと思います。

誰かがこれについていくつかの洞察を共有できますか?

ありがとう

2
Brendan

最も簡単で最良のオプションは、おそらくカーネルコマンドライン変数systemd.machine_id公式ドキュメントによる として渡すことです。本当に凝ったものにしたい場合は、実行しているSoCの本当にユニークなもの(シリアル番号、MACアドレスなど)に基づいてブートローダーに生成させることができます。

2
TaborKelly

矛盾する概念を混ぜ合わせようとしています。永続性は状態を意味しますが、システムをステートレスにする必要があります。

あなたが言及したオプションに加えて、「ユニオン」または「オーバーレイ」ファイルシステムの使用を検討することもできます。これにより、OSは最初に永続ファイルシステム上のファイルを検索し、ファイルが存在しない場合はステートレスファイルシステムを確認するように指示されます。これがLiveCDの実装方法であり、明らかに読み取り専用メディアであるファイルを変更できるというほのめかしを与えます。

0
Mark Stosberg

Rootfsの読み取り/書き込み(mount -o remount,rw /)を再マウントし、ランダムに生成されたマシンIDを/etc/machine-idファイルに保存するだけで、この問題を解決しました。

0
I. Nikolaenko