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