ルートをマウントする前にmodprobeを実行する方法は? (initrdなし)

ルートをマウントする前にmodprobeを実行する方法は? (initrdなし)

initrd/なしでLinux Mint(バージョン4.14.13+)を起動しましたが、ルートファイルシステムがマウントされる前に実行されている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。ところで、ここに私が興味を持っているものがあります。 "devtmpfs:mounted" または "Mounted root (ext4 ファイルシステム)" 以前に/dev/console開こうとしたようです/dev/console/dev/console)...

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

おすすめ記事