您的位置:首页 > 其它

grub启动命令行学习(一)

2015-03-01 10:41 169 查看
这两天一口气看完了《古董局中局》,一共3本,也算是小小的实践了下新年愿望要多读书,然后又强烈推荐给同事,昨天晚上那个同事说看了下,很不错,然后根据“君子棋”的场景把一个工作上的问题解决了,然后我今天也仔细思考了下,发现也可以总结一下:

1、看代码,首先要明白这段代码的意义。《古董局中局》中的“君子棋”中,之所以沈一诚能功成身退,最重要的就是分析了吴阎王的心理,利益所驱。当然我们分析代码不是分析人心,也没那么复杂,但是每段代码和函数必定有他的作用,你搞清楚了作用再回头去解析代码,就相当于是清楚了某个人的动机,再去分析他的行为(PS:所以我最近也在看推理小说,是不是感觉有点破案的感觉)。

2、典故,有的时候就是没什么道理。比如把内核加载到一个地址0x90000,比如串口的端口号0x2f8。这些都是在不断的发展过程中,前人遗留下来的规则,然后约定俗成,你又不能去改,久而久之就遗留了下来,有些人不知道的,就像找到了一件古董,不懂这个是为什么。比如唐代是以肥为美,然后再看看武媚娘的现代剧,你估计就要抓狂抽风了,所以有的时候看ReadMe,然后推测以前的用法,真的是和现代的考古一样有成就感。

下面言归正传,昨天在调试grub的ramdisk,发现有问题,于是仔细google了下grub的命令行,结合帖子,好好理解了一番,当然也还有一些疑问。说起ramdisk,刚入职的时候,就有人分配任务让去网络安装linux。于是就需要ramdisk,于是上网找资料,结果找了一大堆资料,总算搞定了,但是呢,很多东西不明白,比如一些命令initrd,比如initrd用到的img文件,现在总算是清楚了,迟到的爱。

首先搞清楚ramdisk的作用,也就是为什么要去做ramdisk。

因为内核不能包含所有驱动,因此内核只会包含一些基本的驱动,然后内核启动后,在去加载其他一些驱动和模块。所以linux启动分成2部分,一部分为内核,一部分为系统相关模块。

1、网络无盘引导,通过网络传递内核文件到内存,然后引导操作系统,不需要硬盘

2、提高文件读写效率,由于文件系统在内核直接操作,比操作硬盘,或者U盘等存储介质要快的多。

3、待补充

以前内核是不支持ramdisk,是在linux2.6以后的版本才开始支持内存文件系统,下面把整个流程分析如下:(改成图片)

         

grub的启动命令行如下:

set root=(hd0,1)

linux /vmlinuz-2.6.32.4 root=/dev/ram console=ttyS0,115200n8 rootwait

initrd /initrd.img-2.6.32.4

boot

内核 :vmlinuz-2.6.32.4

内核以外的支持:initrd.img-2.6.32.4

传递给内核的参数:root=/dev/ram console=ttyS0,115200n8 rootwait

linux命令实际上进行了2个操作,一个操作是把内核导入内存,找到内核的入口,另外一个作用就是,传递启动参数到内核。

initrd命令把initrd.img导入到内存,并且告诉内核,这个文件在内存哪个位置,方便内核去找。实际上传统方式是放在一个固定地址段,而uefi方式则是申请的一段内存(具体在哪里就是动态分配的了)

其中在内核linux-3.2.1\Documentation\x86中boot.txt介绍了整个内核和initrd放在内存中位置的演变,就像刚才我说到的考古

另外要使能ramdisk,需要在内核选项里面使能RAM disk support和initial RAM disk(initrd) support 选项

而且系统默认的ramdisk的大小是4M,一共会创建16个,启动成功后,可以在/dev/目录下看到/dev/ram0 到/dev/ram15一共16个设备,这里有个疑问就是ramdisk最大能支持多大的initrd。因为最后root是会mout到/dev/ram上,如果太大,是不是会报错?而且编译选项里可以指定ramdisk_size这个大小是所有16个设备加起来的大小,还是指定的某一个的大小呢?

grub指定好参数后,然后跳转到内核,grub的使命就到此结束了,内核先加载自己,之后就会去解析initrd文件,解析后会执行initrd中的,init进程,只有会加载驱动模块,然后挂载root到/dev/ram上,整个启动过程就完成了。

补充一个小知识:

rootwait,同事突然告诉我只有U盘需要加rootwait,而硬盘不用加,后来看了ramdisk解释如下:是因为U盘的驱动加载到USB硬件能正常使用,需要几秒钟的时间,因此如果驱动加载好,就直接去读U盘会读取不到,导致出错,所以要加上rootwait,等待一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: