详解Linux中的f配置⽂件grub是什么:
grub是引导操作系统的程序,它会根据⾃⼰的配置⽂件,去引导内核,当内核被加载到内存以后,
内核会根据grub配置⽂件中的配置,到根分区所使⽤的⽂件系统对应的驱动,通过根分区⽂件系统
对应的驱动,挂载根分区,从⽽达到启动操作系统的⽬的。
在了解grub以前,请先⼤体上了解⼀下centos5/6的启动过程,然后再理解grub就更容易了,
还记的我们以前总结过的centos5系统启动流程吗,如下图,此处我们重点讨论下图红框中的步骤。
centos5/6中使⽤grub作为bootloader,也就是说,操作系统想要启动,就要靠它,
早期的linux中,使⽤LILO(linux loader)进⾏操作系统的引导⼯作,但是因为LILO
的功能⽐较简单,随着发展,出现了grub, GRUB:Grand Unified Bootloader
centos5\6中使⽤的是grub的0.97版本:grub legacy
centos7中使⽤的是grub2
此处,我们讨论的grub就是grub legacy
grub legacy的3个阶段:
grub的代码分三个阶段被加载.
grub stage 1 :
存在启动硬盘的0柱⾯,0磁道,第⼀个扇区中,即MBR中,MBR的前446个字节为以引导代码,
也就是grub stage 1,所谓的stage1 ,作⽤只有⼀个,就是到grubstage1.5,然后将其加载的
到内存。
grub stage 1.5 :
它的作⽤就是⽤来识别常见的不同类型的⽂件系统,从⽽到"/boot⽬录所在的分区"对应的⽂件
系统的驱动,驱动多⼤、存在于哪些扇区中,这些都是在安装操作系统的时候根据⽤户的设置⾃
动⽣成的,我们有了"/boot⽬录所在分区"的⽂件系统驱动,那么/boot/grub/stage2这样的⽐较
⼤的⽂件可以直接操作了。
grub stage 2 :
grub真正的核⼼程序,能让⽤户以菜单⽅式将操作系统加载、新增参数、修改选项,这些全都是
stage2的功⽤, 前⾯的grub stage 1和grub stage 1.5所做的事情就是为了运⾏grub stage 2 ,
然后由stage 2借助f再去引导系统启动。
与grub相关的⽂件:
grub的代码都是⼆进制代码,我们暂时不做研究,grub是引导操作系统的程序,它会根据⾃⼰的
配置⽂件,去引导内核,当内核被加载到内存以后,内核会根据grub配置⽂件中的配置,到根分
区所使⽤的⽂件系统对应的驱动,通过根分区⽂件系统对应的驱动,挂载根分区,从⽽启动系统,
我们刚才提到了"内核"、“根分区”、"⽂件系统的驱动"这些名词,现在,我们来看看他们都长什么
样⼦,先来看看"内核",如下图
没错,/boot/⽬录下的vmlinuz-2.6.32-642.el6.x86_64就是内核⽂件,2.6.32-642就是内核的版本号,el6是操作系统的版本,x86_64是内核对应的平台,这个内核⽂件就是centos6中最最重要的核⼼
grub就是引导它,从⽽完成启动操作系统的⽬的。当grub把内核加载到内存以后,内核需要去挂
载根分区,但是,如果要使⽤根分区,则必须获取到根分区⽂件系统的驱动,那么,这个驱动放
在哪⾥呢,其实你已经看到了,如下图
根分区⽂件系统的驱动就放在initramfs-2.6.32-642.el6.x86_64.img这个⽂件中,它和内核⽂件都
在/boot⽬录中。内核通过这个⽂件,即可获得 根分区所使⽤的⽂件系统 对应的驱动,然后即可
挂载根分区,但是,如果有多个分区,内核怎么知道那个分区是根分区呢?或者说,如果有多个
设备,内核怎么知道根⽂件系统挂载在哪个设备上呢?内核是不知道的,所以,内核需要grub告诉
它,那grub⼜怎么知道根⽂件系统在哪⾥呢?grub需要读取⾃⼰的配置⽂件,配置⽂件中保存了根
⽂件系统的位置。
grub配置⽂件详解:
grub的配置⽂件是什么样⼦的呢,/boot/f⽂件就是grub的配置⽂件,现在,我们
就来了解⼀下它,通过了解f中的配置,来了解grub的⼯作流程,打开f⽂件,
如下图⼀内容。
我们在前⾯已经重复解释了grub的作⽤,它⽤于引导操作系统启动,先引导内核,由内核去挂载根分
区所以,在配置⽂件中,我们能够看到kernel、root、initrd等关键字,这些关键字所指定的值,都是系统
引导时所必须的,现在,我们对这些配置项进⾏编号,并对他们⼀⼀进⾏解释。
下⾯解释的编号对应图⼀中的编号:
1、从注释可以看出,这个f是由anaconda程序⽣成的,anaconda就是我们安装操作系统时候使
⽤的安装向导。
2、注释中有提⽰我们:你有⼀个单独boot分区,这意味着kernel⽂件和initrd⽂件的路径是相对于/boot分区来说的,因为我们的boot分区对应的设备是/dev/sda1,所以,此处⽤root(hd0,0)表⽰,其中,hd
0表⽰第⼀块硬盘,逗号后⾯的0表⽰第⼀个分区,也就是说(hd0,0)表⽰第⼀块硬盘的第⼀个分区,也就是我们正
在使⽤的/dev/sda1, 有的同学会产⽣疑问,sda1为什么不⽤(sda,1)表⽰呢,我把这个问题理解成"历史问题",以前⼤家习惯了使⽤这种⽅式去表⽰,所以⼀直没有改变它。
总之:root (hd0,0)表⽰kernel⽂件和initrd⽂件所在分区,⽽不是指"根分区"。
上图⼀中的情况是"/boot⽬录"对应⼀个单独的分区,此处我们称为boot分区,⽽且boot分区是第⼀块盘的
第⼀个分区,下图⼆中的情况为"/boot⽬录"并不是⼀个单独的分区,所以/boot⽬录在根分区中,"/"对应
根分区,⽽且,根分区并不是所在硬盘的第⼀个分区,所以,我们可以看到,下图⼆中的root (hd0,1) 的
意思是kernel⽂件和initrd⽂件在第⼀块硬盘的第⼆个分区上,也就是我们平常使⽤的/dev/sda2 ,那么,
以此类推,如果kernel和initrd⽂件存在于第3块硬盘的第2个分区上,我们应该使⽤root(hd2,1)表⽰。
3、其中default=0表⽰有多个grub引导菜单时,选择哪⼀个作为默认启动引导菜单,也就是说,当有多个
title时,默认选择哪个title中的配置作为默认引导配置,default=0表⽰默认使⽤第⼀个title菜单中的配
置。其中timeout=5表⽰如果5秒以内,⽤户没有选择任何⼀个title,则使⽤default中指定的title菜单中
的配置进⾏引导。
4、引导时的背景图⽚,此项不建议设置,因为如果此项配置的背景图⽚并不存在,那么在引导时会出现
错误,此配置可以对⽐图⼀和图⼆,就可以更加深刻的理解(hd0,0)的含义。
5、表⽰在系统启动时,隐藏所有title菜单,并不让⽤户直接看到启动菜单,如果⽤户不做任何⼲预,则默
认启动default所指定的title。
为了⽅便⼤家对⽐着解释信息查看,我把图⼀中的下半部分截取⼀份。
6、title直译为"标题",可以理解为⼀个grub引导的配置列表,可以存在多个title,也就是说可以⽤不同的
配置去引导系统,title下⾯配置项都属于当前title,我们可以看到,图⼀中的title是CentOS 6 (2.6.32-642.el6.x86_64),
也就是说,此title下⾯的引导配置项,都是属于CentOS 6 (2.6.32-642.el6.x86_64)这个菜单的引导配置项。
7、指定这个配置列表中的kernel和initrd所在的分区,这个配置项就是前⾯编号2中所描述的kernel⽂件所在
的分区,跟编号2的意思完全⼀样(具体意思参考编号2),只是编号2是在注释中,编号7是CentOS 6 (2.6.32-642.el6.x86_64)的配置项,也就是说,编号7只在CentOS 6 (2.6.32-642.el6.x86_64)这个title的范围内⽣
效,⽽且再次强调:
root (hd0,0)表⽰kernel⽂件和initrd⽂件所在分区,⽽不是指"根分区"。
8、此处我们只说明红框中的内容,红框中的内容也是grub配置⽂件中的核⼼,它指明了kernel⽂件的位置,
我们说过grub需要将内核加载到内存,所以grub需要知道kernel⽂件到底在哪⾥,图⼀中,此项的配置为
linux内核文件放在哪kernel /vmlinuz-2.6.32-642.el6.x86_64,⽽我们说过,vmlinuz-2.6.32-642.el6.x86_64⽂件存在于/boot/⽬录中,
⽽图⼀中,/boot⽬录为⼀个单独的分区,也就是说在图⼀中,此项可以写成kernel (hd0,0)/vmlinuz-2.6.32-642.el6.x86_64
但是,因为我们在编号7中已经指定了root(hd0,0),所以,图⼀中,此项写成kernel /vmlinuz-2.6.32-642.el6.x86_64
同样的道理,我们看看图⼆,图⼆中,/boot⽬录并不是对应⼀个单独的分区,也就是说/boot⽬录在"/"⽬
录下,⽽"/"⽬录对应的分区为(hd0,1), 所以,图⼆中,此项写成kernel /boot/vmlinuz-2.6.32-642.el6.x86_64 , 那
么,也就是说,到底怎样配置这些参数,都是⾮常灵活的,如果我们⼿动对这些参数进⾏配置,必须根据
实际情况进⾏配置,⽽不能死记硬背,我们可以套⽤这些格式,但是不能被这些格式"套住"。其中,ro 表
⽰以只读的⽅式挂载根分区,此配置是为了安全,并不是必须这样配置,不写ro不会影响启动。
root=UUID=488de085-08b9-4554-917e-4bc78059a998指明了根分区所对应的设备,此处使⽤了UUID的语法表
⽰分区,我们也可以使⽤设备名的表⽰⽅法,表⽰根分区的所在位置,⽐如,图⼀中,"/boot"对应的分区是
/dev/sda1, "/"对应的分区是/dev/sda2, 那么,root=UUID=488de085-08b9-4554-917e-4bc78059a998则可以使⽤
另⼀种表达⽅式,root=/dev/sda2,其实它的作⽤就是告诉内核,根分区的位置在哪⾥,明⽩了吗?那么,
我们来想⼀个问题,如果根⽂件系统创建在逻辑卷上,⽽没有使⽤分区,这个时候,我们应该怎么指定呢?
没错,指定对应的逻辑卷即可,⽐如root=/dev/mapper/vg0-root,当然,也可以设置为root=UUID=逻辑卷的UUID。
其实,如果根⽂件系统在⼀个分区上,我们最好还是使⽤UUID的写法⽐较好,因为,在添加或删除分区时,
分区对应的设备名称有可能发⽣改变,所以,使⽤UUID表⽰根的位置,是最保险的做法。
注意:这个配置项的root才表⽰根分区,或者表⽰根⽂件系统对应的逻辑卷,不要跟编号7的配置搞混淆了。
⽽红框以外还有很多参数,很多都是启动内核时使⽤的参数,所以暂时不解释了。
9、initrd/initramfs-2.6.32-642.el6.x86_64.img 这个设置是什么意思呢,我们在⼀开始就解释过,如果内核想
要挂载根分区,内核必须能够驱动根分区,所以,内核必须获取到根分区所使⽤的⽂件系统的驱动,⽽initramfs-2.6.32-642.el6.x86_64.img这个⽂件中就包含了内核所需要寻的驱动。
initrd就是关键字,它指定了initramfs⽂件的位置,⽽在centos5中,此⽂件的⽂件名就叫initrd-2.6.18-194.el5.img
到centos6中,initrd⽂件才改名为initramfs,细⼼的你应该已经发现,图⼀和图⼆中的此项配置不是完全⼀样的,
图⼀中,此项配置为initrd /initramfs-2.6.32-642.el6.x86_64.img
图⼆中,此项配置为initrd /boot/initramfs-2.6.32-642.el6.x86_64.img
你肯定知道我要说什么了,没错,我⼜要开始啰嗦了,它们的配置之所以不同,是因为,图⼀中"/boot"⽬录对
应的是⼀个单独的分区,图⼆中"/boot"⽬录并没有对应⼀个单独的分区,⽽是在"/"⽬录中,
所以,再次强调,具体的配置要根据实际情况⽽定,⼀定不要⽣搬硬套。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论