我的内核命令行如下所示:
root=31:0 ro noinitrd console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs
我认为第一个root
条目通过其主要和次要设备号来标识磁盘,第二个条目通过其名称来标识它。我可以确认 确实rootfs
已打开,/dev/mtdblock2
但我不知道如何解释31:0
。
答案1
当您多次提供相同的选项时,不同的模块会有不同的行为。我知道您可以说console=
多次,并且您会得到多个控制台(我们将其用于在帧缓冲区和串行端口上都有主控制台的机器)。
但是,您只能有一个根分区,因此root=
几乎肯定会覆盖先前看到的值,几乎肯定会以从左到右的方式覆盖。这得到了内核源代码的证实,在 中init/do_mounts.c
,函数root_dev_setup()
负责对root=
选项进行操作,它所做的就是将参数 key 存储在变量中。 bootparamroot=31:0
被 覆盖root=/dev/mtdblock2
,或者至少在我刚刚检查的 2.6.25 源代码树中是这样的。
顺便说一句,如果你精通 C,name_to_dev_t()
同一个文件中的函数负责解析 的值root=
,非常有启发性!
该x:y
表示法是标准 Unixism 的“major:minor”,这是 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
第一列标识驱动程序类型(b
对于块、c
对于字符)。左侧的两列Jan
是格式中的主要数字和次要数字major, minor
。
您可以root=
使用major:minor 表示法为任何块设备提供独立于其名称的名称。
设备号的完整列表位于内核源代码树中的 下Documentation/devices.txt
。 31:0 似乎指的是 /dev/rom0,系统上的第一个 ROM 卡。
答案2
使用标签 ( root=LABEL=...
) 以标签而不是设备名称挂载文件系统。
http://www.ibm.com/developerworks/linux/library/l-boot-rootfs/index.html