挂载 root 之前如何运行 modprobe? (无 initrd)

挂载 root 之前如何运行 modprobe? (无 initrd)

我正在启动 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

相关内容