initramfsがルートファイルシステムを読み取り専用でマウントする理由

initramfsがルートファイルシステムを読み取り専用でマウントする理由

roルートファイルシステムがinitramfs(およびinitrd)にマウントされるのはなぜですか?

例えばGentoo initramfsガイドルートファイルシステムをマウントするには、次のコマンドを使用します。

mount -o ro /dev/sda1 /mnt/root

以下はなぜできませんか?

mount -o rw /dev/sda1 /mnt/root

これには妥当な理由があるかもしれませんが(関連するかもしれませんswitchroot)、どこにも文書化されていないようです。

ベストアンサー1

これ初期仮想ディスク(initrd)は通常、実際のルートファイルシステムをマウントして直接起動するために必要なものだけを含むルートファイルシステムの単純なバージョンです。

initrdが存在する理由は、最新のシステムでは、ブートローダがルートファイルシステムを確実に見つけるほどスマートではないからです。ブートローダのような小さなプログラムでは、扱うにはあまりにも多くの可能性があります。 NFSルート、非標準RAIDカードなどを検討してください。ブートローダはBIOSのみを使用し、そのタスクを実行するためにブートセクタに入ることができるすべてのコードを使用する必要があります。

initrdはブートローダのどこかに保存されています。できるそれを見つけると、一般的に占める追加スペースが誰にも邪魔にならないほど小さくなります。 (コンパクトな組み込みシステムには通常、「実際の」ルートはなく、initrdのみがあります。)

initrdは価値があります。 initrdが破損してもシステムは起動しないため、すべての状況でその内容を保存する必要があります。これを保証するために、デザイナーが選択した設計の1つは、ブートローダーがinitrdを読み取り専用でロードできるようにすることでした。これを達成するための他の原則もあります。たとえば、「実際の」ルートを持たない小さなシステムでは、アイテムを保存するために別々に/tmpマウントできます。/var/cacheinitrdの変更はほとんど発生しないため、非常に注意してください。

正常に戻るはいinitrdは読み取り専用なので、最初は読み取り専用としてマウントされる実際のルートファイルシステムです。その後、同じ理由で可能な限り長い間読み取り専用のままになります。デフォルト設定によっては、実際に完了する必要がある実際のルートへのすべての書き込みは、システムの起動まで、または少なくともデフォルト設定を満たすことができない起動プロセスの後半まで延期されます。

この読み取り専用フェーズで発生する最も重要なことは、ルートファイルシステムが完全にアンマウントされていることを確認することです。これは、initrdに任せることなくブートローダが確実に実行できることです。ただし、ルートファイルシステムいいえ除去はきれいですか?その後、それをfsck確認して修正するために呼び出す必要があります。したがって、「実際の」ルートに切り替わるのを待つのではなく、このステップを処理した場合、どこで入手initrdできるのでしょうか。fsckビルド時にfsckコピーする必要があると言うかもしれませんが、initrd今は大きくなりました。最も重要なことは、どの fsckコピーしてもらえますか? Linuxシステムはしばしば12を超える異なるファイルシステムを使用します。initrd実際の根を作るのに必要な根だけをコピーしましたか?ルートファイルシステムが後で別の種類のファイルシステムに移行され、誰かがinitrdを再構築するのを忘れた場合に備えて、利用可能なinitrdすべてのプログラムをここにコピーしてサイズを増やしましたか?fsck.foo

Linuxブートシステムの設計者は、これらの問題でinitrdに負担をかけないことを賢く選択しました。実際のルートファイルシステムチェックは、initrdよりも実行に適しているため、実際のルートファイルシステムに委任します。

起動プロセスが十分に進行して安全に実行されると、initrdは実際のルートディレクトリで置き換えられます。pivot_root(8)、ファイルシステムは読み書きモードで再マウントされます。

おすすめ記事