关于Grub kernel 命令行的参数问题



关于Grub kernel 命令行的参数问题

我们硬盘安装 Linux 一般会用到类似下面的命令:
kernel (hd0,2)/vmlinuz root=/dev/ram0 ramdisk_size=32000 devfs=mount,dall
我是新手刚接触有些不解,google+baidu了一下,明白了一点,记录下来,也方便一同学习的菜菜鸟战友们。
kernel 是Gurb的一个命令,用来加载Linux内核
这个(hd0,2)是指定内核所在的分区,(hd0,2)是因不同机器而异的,可以用
find /vmlinuz 来查看。这个vmlinuz不一定是相同,例如magic linux 中就是mbvmlinuz。这个因发行版本有细微的差异。

那么(hd0,2)/vmlinuz 就指定了vmlinuz这个文件的位置。

再看root=/dev/ram0.这句话是指定挂载根分区的位置。即指定根目录.每个进程都有一个根目录,最终来源就是这个root。是Linux的root文件系统所在的硬盘分区位置。

很多直接写作类似:root=/dev/hda8 这样的语句直接指定。
至于这个/dev/ram0,引用一段来自新浪Blog memonote的话来启迪下说明问题:
—————————————————————-
指定根设备是通过内核参数“root=”来完成的。以GRUB引导器的配置为例:
kernel /boot/bzImage ro ramdisk_size=65536 root=/dev/ram0
initrd /boot/initrd.img
其中 ramdisk_size=65536 说明初始RAM盘的大小为64MB,root=/dev/ram0 说明根的位置。
下面第二个例子来自一台在hda1安装了Redhat 9的机子:
kernel /boot/vmlinuz-2.4.20-8 ro root=/dev/hda1
initrd /boot/initrd-2.4.20-8.img
很明显,这里 root=/dev/hda1 指定了真实的根,其启动过程包含根的转换。
但是这里没有指定 ramdisk_size,因为initrd的缺省大小是4MB,而initrd-2.4.2
0-8.img比较小,所以用缺省值即可。
——————————————————————————
这里我们关注的是 ram0, 为了更好的说明问题,我们引用如下
linux2.4内核对initrd的处理流程如下:
1. boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。

2. 在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。

3. 内核以可读写的方式把 /dev/ram0 设备挂载为原始的根文件系统。


4. 如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

5. 执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。

6. /linuxrc 执行完毕,真正的根文件系统被挂载。

7. 如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从 / 移动到 /initrd。否则如果 /initrd 目录不存在, /dev/ram0 将被卸载。
+++++++++++++++++++++++++++++++++++++++++++++

我来说说自己的理解:这里ram0是一个虚拟的内存设备,是被自动创建来存储ininrd的。在内核初始化过程中,内核把 /dev/initrd 设备的内容解压缩并拷贝到 /dev/ram0 设备上。并把 /dev/ram0 设备挂载为原始的根文件系统。如果像这样指定/dev/ram0,那么/dev/ram0 被指定为真正的根文件系统。如果没有指定,而是直接用/dev/hda8这样直接指定真正的根文件系统,那么将用默认的ram0存储initrd,并以一定的方式做转换,将根文件系统挂载到hda8,这两种方式ram0都是要用的,不同的是,第一种直接把ram0做为根文件系统了,第二种用完了ram0,还要把根转换到hda8.

那么这样应该比较清楚了吧。(我表达能力欠缺。。大家见谅,有些语无伦次)
来看我搜索到的来自LinuxSir的一个提问
请问devfs=mount,dall 是什么意思?
是mount d盘上的iso吗?
可不可以是call或者eall
devfs字面意思是设备文件系统,mount是挂载,dall是所有类型。
其实devfs是一种可以自动挂载分区的特性,用devfs=mount,dall指定开启了这种特性。不过好像有些版本的内核不支持这种特性,这我就不太清楚了,总之,搞清楚它是干什么的还是有益的。