Linux 命令行中的多个 root 选项

Ati*_*liz 6 linux boot kernel root-filesystem

我的内核命令行如下所示:

root=31:0 ro noinitrd console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs
Run Code Online (Sandbox Code Playgroud)

我认为第一个root条目通过其主要和次要设备号标识磁盘,第二个条目通过其名称标识它。我可以确认rootfs确实是 on/dev/mtdblock2但我不知道如何解释31:0

Ale*_*ios 12

当您多次提供相同选项时,不同模块的行为会有所不同。我知道你可以说console=多次,你会得到多个控制台(我们将它用于在帧缓冲区和串行端口上都有主控制台的机器)。

但是,您只能有一个根分区,因此root=几乎可以肯定会以从左到右的方式覆盖先前看到的值。内核源代码证实了这一点init/do_mounts.c,函数root_dev_setup()负责作用于root=选项,它所做的只是将参数键存储在变量中。bootparamroot=31:0被 覆盖root=/dev/mtdblock2,或者至少在我刚刚检查的 2.6.25 源代码树中是这种情况。

顺便说一句,如果你会C,name_to_dev_t()同文件中的函数负责解析 的值root=,很有启发!

x:y符号是主要的标准 Unixism:次要,这是 Unices 识别设备的方式。传统上,主要是标识硬件驱动程序的 8 位数字,次要是标识设备本身的 8 位数字。数字有两个命名空间major:字符设备和块设备。您可以通过键入 来查看两者cat /proc/devices,并且可以通过说 来查看当前处于活动状态的内容ls -la /dev。下面是一个例子:

ls -la /dev/zero /dev/sda
brw-rw---- 1 root disk 8, 0 Jan 12 22:01 /dev/sda
crw-rw-rw- 1 root root 1, 5 Jan 12 22:01 /dev/zero
Run Code Online (Sandbox Code Playgroud)

第一列标识驱动程序类型(b用于块,c用于字符)。左边的两列Janmajor, minor格式中的主要和次要数字。

您可以root=使用主要:次要表示法给出任何与其名称无关的块设备。

设备编号的完整列表位于内核源代码树中的Documentation/devices.txt. 31:0 似乎指的是 /dev/rom0,系统上的第一个 ROM 卡。