루트를 마운트하기 전에 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

관련 정보