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


12

ルートファイルシステムがroinitramfs(およびinitrd)にマウントされている理由は何ですか。

たとえば、Gentoo initramfsガイドはルートファイルシステムをマウントします:

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

以下はなぜですか?

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

おそらく良い理由がある(そしてそれはおそらくを含むswitchroot)ことがわかりますが、どこにも文書化されていないようです。

回答:


19

初期RAMディスク(initrdの)は、典型的には、それに起動オフ実際のルートファイルシステムと手をマウントするために必要とされることのみを含むルートファイルシステムの機能縮小版です。

initrdが存在するのは、最近のシステムでは、ブートローダーを十分にスマートにしてルートファイルシステムを確実に検出できないためです。ブートローダーのような小さなプログラムがカバーする可能性は多すぎます。NFSルート、非標準のRAIDカードなどを検討してください。ブートローダーは、BIOSに加えて、ブートセクターに詰め込めるコードを使用して作業を行う必要があります。

initrdは、ブートローダー見つけられる場所に保存されます。また、サイズが小さいため、通常、余分なスペースが必要になることはありません。(小さな組み込みシステムでは、通常「実際の」ルートはなく、initrdのみです。)

initrdは貴重です。initrdが壊れるとシステムが起動できないため、その内容はすべての条件下で保存する必要があります。これを保証するために設計者が行った1つの設計選択は、ブートローダーがinitrdを読み取り専用でロードするようにすることです。これに向けて機能する他の原則もあります。たとえば、「実際の」ルートが存在しない小規模なシステムの場合でも/tmp/var/cache物を格納するために個別にマウントするなどです。initrdの変更はめったに行われないため、非常に注意深く行う必要があります。

そこに戻って通常の場合に取得され、実際のルートファイルシステムは、それが最初に読み取り専用でマウントされたinitrdがあったので。同じ理由で、可能な限り読み取り専用に保持されます。実行する必要がある実際のルートへの書き込みは、システムが起動されるまで、または優先的に、または少なくとも起動プロセスの後半でその優先設定が満たされなくなるまで延期されます。

この読み取り専用フェーズで発生する最も重要なことは、ルートファイルシステムをチェックして、正常にマウント解除されたかどうかを確認することです。これは、ブートローダーをinitrdに任せる代わりに確かに実行できることですが、ルートファイルシステムきれいにアンマウントされなかった場合はどうなりますか?次に、呼び出しfsckて確認し、場合によっては修正する必要があります。それで、「実際の」ルートへのハンドオフまで待つのではなく、このステップを担当した場合、どこでinitrdget fsckが発生しますか?あなたがコピーする必要があると言うことができるfsckinitrdそれを構築するとき、今それは大きいです。その上で、どれ fsckをコピーしますか?Linuxシステムは定期的に数十種類のファイルシステムを使用しています。その時に実際のルートに必要なものだけをコピーしますかinitrd創造された?ルートファイルシステムが後で他のファイルシステムタイプに移行され、誰かがinitrdの再構築を忘れた場合に備えて、initrd利用可能なすべてのfsck.fooプログラムをコピーしてのサイズにバルーンを付けますか?

Linuxブートシステムアーキテクトは、これらの問題をinitrdに負担させないことを賢明に選択しました。彼らはinitrdよりもそれを行うのに良い立場にあるので、彼らは実際のルートファイルシステムのチェックを実際のルートファイルシステムに委任しました。

安全に実行できる程度にブートプロセスが完了すると、initrdは実際のルートの下からでスワップアウトpivot_root(8)され、ファイルシステムは読み書きモードで再マウントされます。


4
initramfsは読み取り専用でマウントされていません。カーネルはそれを/としてマウントされた読み取り/書き込みtmpfsに解凍します。また、pivot_root()は廃止されたinitrdで使用されますが、ほとんどのシステムで最近使用されているinitramfsでは使用されません(ファイルの名前がinitrdである場合でも)。initrdでは、pivot_rootは/ sbin / initを実行する前に行われ、fsckを実行してr / wを再マウントしました。initramfsを使用すると、initramfs内のすべてのファイルを削除してから、chrootして実際のルートに移動し、/ sbin / initを実行します。
psusi

0

これは、起動時にルートファイルシステムが常に最初は読み取り専用でマウントされるためです。さまざまなセルフテストが完了すると、ルートファイルシステムが読み取り/書き込みとして再マウントされ、他のファイルシステムのマウントが開始されます。


0

私が考えられる理由の1つは、ある種の腐敗を防ぐためです。たとえば、ext4ファイルシステムをext2(またはその逆)としてマウントできます。これはroモードでは安全ですが、initramからrwをマウントすると互換性のないフォーマット変更が発生する可能性があります。

もう1つの理由があります。initramfsにはおそらくfsckがありませんが、rwをマウントする前にファイルシステムを確認する必要がある場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.