実際のデバイスノード(例:/dev/sda1
)ではなく、ルートデバイスが/dev/root
として、または実際のファイルシステムではなくmtab
として表示されるさまざまなLinuxシステムで見ました。は、それがrootfs
というファイルシステムであると言います(/proc/filesystems
では実際のファイルシステムとして表示されますが、<linux-kernel-source-tree>/fs
にはコードがありません)。特定の属性を使用して実際のルートデバイスノード(rdev、Chromium OS rootdevなど)を決定するために、さまざまなユーティリティが作成されています。非常に小さな組み込みデバイスがルートデバイス用の/dev
デバイスノードを必ずしも持つ必要がないことをどこかで読む以外、これに対する論理的な説明は見つかりません。 (これは本当ですか、もしそうなら、それが私の質問への答えですか?)mtabが本当の代わりに/dev/root
と言うことがあるのはなぜですか(そして、私はそれがrootdev
と一度だけ見たかもしれないと思います)デバイスノード、そしてどうすれば常に実際のデバイスノードと言わせることができますか?カーネルは、最初にcmdlineのroot
パラメーターに従ってルートデバイスをマウントし、次にinit/systemd
がfstab
に従ってルートデバイスを再マウントします。よろしいですか? もしそうなら、私はinit
がmtab
を維持していると思います。私の理論が正しい場合、init
に実際のルートデバイスノードをmtab
に書き込む方法を教えてください。/etc/mtab
は実際には/proc/mounts
へのシンボリックリンクであることに気づきました。これは、mtab
がカーネルによって維持されていることを意味します。では、ルートデバイスのノードパスが/dev/root
ではなく、mtab
に実際のデバイスノードを含めるように指示する代わりに、カーネルを構成/パッチするにはどうすればよいですか?
これは通常、initramfsを使用した場合のアーティファクトです。
カーネルのドキュメントから( https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt )
Rootfsとは何ですか?
Rootfsはramfs(または、有効になっている場合はtmpfs)の特別なインスタンスであり、2.6システムには常に存在します。 initプロセスを終了できないのとほぼ同じ理由で、rootfsをアンマウントすることはできません。空のリストをチェックして処理する特別なコードを用意するのではなく、特定のリストが空にならないようにするだけの方がカーネルにとっては小さくて簡単です。
ほとんどのシステムは、rootfsを介して別のファイルシステムをマウントし、それを無視します。 ramfsの空のインスタンスが占めるスペースの量はごくわずかです。
したがって、rootfs
はinitramfs用に作成されたルートファイルシステムであり、アンマウントできません。
に関してで /dev/root
、私はこれについてあまり確信がありませんが、正しく思い出せば/dev/root
は、initrdを使用すると作成されます(initramfsとは異なります)。
Gentooにはこれを正確に行うパッチがあります(実際のルートデバイスが表示されることを保証します)。あなたはそれをここで見つけることができます: https://lkml.org/lkml/2013/1/31/574
Linuxでは、_/dev/root
_(存在する場合)は、ブート時に作成された実際のデバイスへのシンボリックリンクです。
_readlink /dev/root
_または_cat /proc/cmdline
_を使用して、ブートしたカーネルのroot
パラメータを確認し、その背後にある実際のデバイスを見つけます。
男からdracut(8)
ただし、正常な起動を続行するための目的は、ルートボリュームを見つけて、ファイルシステムを指すシンボリックリンク/ dev/rootを作成することです。