了解 initramfs 的简单配置文件

了解 initramfs 的简单配置文件

有人可以解释一下下面发生了什么吗?

# This is a very simple, default initramfs

    dir /dev 0755 0 0
    nod /dev/console 0600 0 0 c 5 1
    nod /dev/tty 0666 0 0 c 5 0
    nod /dev/null 0600 0 0 c 1 3
    nod /dev/mem 0600 0 0 c 1 1
    nod /dev/kmem 0600 0 0 c 1 2
    nod /dev/zero 0600 0 0 c 1 5
    nod /dev/random 0600 0 0 c 1 8
    nod /dev/urandom 0600 0 0 c 1 9

    dir /dev/pts 0755 0 0
    nod /dev/ptmx 0666 0 0 c 5 2

    nod /dev/ttyS0 0666 0 0 c 4 64
    nod /dev/ttyS1 0666 0 0 c 4 65
    nod /dev/ttyS2 0666 0 0 c 4 66

    dir /bin 755 0 0
    dir /proc 755 0 0

    file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/hello/hello 755 0 0
    slink /bin/init hello 777 0 0

我们实际上想在这里实现什么目标?

这类似于这个

一般来说,我很清楚我们正在尝试从 init (代码中的最后一行)运行 (hello )。

答案1

该文件是内核源代码树中 gen_init_cpio 程序的输入文件。

它生成一个 cpio 存档,适用于初始化文件系统与文件/目录/设备(=节点)/...在输入文件中列出。

语法是

file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>\n
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>

ETC。

启动时实际运行哪些程序取决于initinitramfs 中的程序。这里的init程序是一个符号链接hello

答案2

@jofel 已经以令人钦佩的准确性回答了这个问题 - 不过,它应该实现的是从内核空间到用户空间的切换。当内核加载时,它确保所有系统都可以运行,然后它会寻找init.没有init系统的启动将永远无法启动 - 您将永远无法与机器交互。

几年前,内核开发人员决定他们厌倦了支持 1001 种和不同可能的根设备配置 - 由于可能的根文件系统和根设备类型组合的数量庞大,处理启动计算机变得过于复杂。所以他们放弃了尝试。

Initramfs自 2.6 起内置于每个 Linux 内核。从那时起,在所有情况下,用户空间都从那里开始——内核将计算机系统的控制权交给init,然后坐下来观看烟花,并摆脱整个事件的影响。

你的问题中的文件描述的目录树是编译到内核本身的Linux根目录。它是内核会费心寻找的唯一根设备;其余的一切取决于init.

相关内容