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,等待一下。
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,等待一下。
相关文章推荐
- fedora学习笔记 4:用grub命令行启动系统 推荐
- fedora学习笔记 5:关于用grub命令启动系统的补充
- 通过grub进入命令行启动系统
- [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- 通过在uefi shell 命令行启动grub
- Grub 命令行启动Windows全过程
- 用grub命令行启动系统
- 用grub命令行启动系统
- Linux启动时显示Grub命令行及修改
- grub命令行启动Windows
- 通过GRUB命令行编辑启动Linux操作系统
- GRUB命令行启动
- ubantu gen更改双系统默认启动项和grub命令行启动
- grub命令行启动系统
- 手动通过grub命令行启动Linux或者win系统
- win8 ubuntu双系统通过grub命令行启动ubuntu
- Oracle学习.Windows 命令行 启动ORACLE服务与实例
- Linux启动时显示Grub命令行及修改
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)