为什么在某些 Linux 系统上,根文件系统显示为 /dev/root 而不是 /dev/在 mtab 中?

为什么在某些 Linux 系统上,根文件系统显示为 /dev/root 而不是 /dev/在 mtab 中?

/dev/sda1我在各种 Linux 系统上看到,根设备不是真正的设备节点(例如: ),而是显示为/dev/root,或者不是真正的文件系统,mtab而是一个名为的文件系统rootfs(在 中显示为真正的文件系统/proc/filesystems,但是)中没有代码<linux-kernel-source-tree>/fs。已开发出各种实用程序来使用某些属性来确定真正的根设备节点(例如 rdev 和 Chromium OS rootdev)。除了在某处读到非常小的嵌入式设备并不总是必须/dev为其根设备提供设备节点之外,我找不到任何合乎逻辑的解释。(这是真的吗?如果是的话,这就是我问题的答案吗?)为什么 mtab 有时会说/dev/root(我想我可能见过它说rootdev一次)而不是真实的设备节点,我怎样才能让它总是说真实设备节点?内核首先按照rootcmdline中的参数挂载根设备,然后init/systemd根据 重新挂载fstab,对吗?如果是这样,那么我认为init维持mtab。如果我的理论是正确的,我怎样才能将init真正的根设备节点写入mtab我注意到这/etc/mtab实际上是到 的符号链接/proc/mounts,这意味着mtab由内核维护。那么,如何配置/修补内核以包含真实的设备节点,而不是说根设备节点路径/dev/rootmtab

答案1

这通常是使用 initramfs 的产物。

来自内核文档(https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

什么是 rootfs?

Rootfs 是 ramfs(或 tmpfs,如果启用的话)的一个特殊实例,它始终存在于 2.6 系统中。您无法卸载 rootfs 的原因与您无法终止 init 进程的原因大致相同;内核不必使用特殊的代码来检查和处理空列表,而是更小、更简单地确保某些列表不会变空。

大多数系统只是在 rootfs 上挂载另一个文件系统并忽略它。 ramfs 的空实例占用的空间量很小。

因此,这rootfs是为 initramfs 创建的根文件系统,并且无法卸载。

关于/dev/root,我对此不太确定,但如果我没记错的话,/dev/root它是在使用 initrd (与 initramfs 不同)时创建的。

答案2

Gentoo 有一个补丁可以做到这一点(确保显示真正的根设备)。你可以在这里找到它:https://lkml.org/lkml/2013/1/31/574

答案3

在 Linux 中,/dev/root如果存在,则它是引导时创建的实际设备的符号链接。

您可以使用readlink /dev/rootcat /proc/cmdline查看root启动内核的参数,从而找出其背后的真实设备。

来自男人dracut(8)

但是,要继续成功启动,目标是找到根卷并创建指向文件系统的符号链接 /dev/root。

相关内容