我正在启动 linux mint(版本 4.14.13+)而不使用initrd
/ initramfs
,并且我看到它/sbin/modprobe
在挂载根文件系统之前运行。我想知道这怎么可能。printk
每当使用文件系统时,我都会对内核进行检测,这就是我知道它/sbin/modprobe
被使用的方式。
以下链接包含dmesg
我启动的完整输出:dmesg 输出
[ 3.175001] Used file system /sbin/modprobe!
[ 3.179080] Used file system /dev/console!
[ 3.844276] Used file system /dev/md0!
[ 3.899302] VFS: Mounted root (ext4 filesystem) on device 8:17.
[ 3.951578] devtmpfs: mounted
[ 3.987527] Used file system /bin/sh!
答案1
我不认为它运行成功/sbin/modprobe
。但这里有一些东西让我感兴趣。看起来它尝试/dev/console
在“devtmpfs:mounted”或“Mounted root(ext4 文件系统)”之前打开,并且没有其他尝试打开/dev/console
.但我认为内核必须/dev/console
从某些文件系统打开以进行初始化(在您的情况下为 /bin/sh )...
看起来如果你没有 initramfs,内核会创建一个非常简单的假的。如果我没理解错的话,这就是为什么它可以/dev/console
在安装真正的根文件系统之前打开。
https://github.com/torvalds/linux/blob/v4.14/init/noinitramfs.c
/*
* Create a simple rootfs that is similar to the default initramfs
*/
static int __init default_rootfs(void)
{
int err;
err = sys_mkdir((const char __user __force *) "/dev", 0755);
if (err < 0)
goto out;
err = sys_mknod((const char __user __force *) "/dev/console",
S_IFCHR | S_IRUSR | S_IWUSR,
new_encode_dev(MKDEV(5, 1)));
if (err < 0)
goto out;
err = sys_mkdir((const char __user __force *) "/root", 0700);
if (err < 0)
goto out;
return 0;
/root
内核代码中的其他地方依赖该目录来挂载并转换到真实的root=
文件系统。
引入此函数的提交澄清了此特定函数仅在编译出 initrd 和 initramfs 支持时才使用。因此,否则,如果您在启动内核时没有传递特定的 initramfs,并且没有指定要内置到内核中的 initramfs,则“默认 initramfs”将提供 和/dev/console
。/root
https://github.com/torvalds/linux/commit/c33df4eaaf41fd3e34837a6ae9a5f9970c393d9f