注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

Linux系统启动过程详解(一)

系统管理 彭东稳 7310次浏览 已收录 0个评论

Centos5.x启动过程图

Linux系统启动过程详解(一)

Post加电自检

CPU访问BIOS程序用来检测硬件是否正常;BIOS(basic input output system)基本输入输出系统,BIOS是我们电脑最开始执行的程序。它会读取CMOS中的信息来了解硬件情况,比如CPU的总线时钟、启动设备的搜索顺序、硬盘大小与型号、系统时间、即插即用设备、各设备的I/O地址、中端请求等。之后BIOS开始做开机自检,比如确定可用的内存会检测一下。确定时钟速度等。如果检测没有问题,就会对硬件初始化按照BIOS中的BOOT Sequence来启动存储设备。最后从启动设备中读取MBR,并将控制权交给MBR中的程序。

BIOS这东西几乎是所有PC的标配,历史甚为久远,可以追溯到1984年。怎么看也算是一个老革命了。但它却是一个固执的死心眼,不管你是什么操作系统,它从来不买账,一定要从MBR做入口。所有作为操作系统,都会要跟MBR打交道。

MBR引导

有时候容易将Boot Sector(引导扇区)与MBR混淆在一起说。严格上讲应该是Boot Sector是由MBRDPTdisk partition table,磁盘分区表)和BRIDboot record ID,引导记录标识)但部分组成。而Boot sector存在于可启动磁盘的0磁道0扇区,占用512字节。

BIOS不管读MBR还是DPT时,会将Boot Sector的全部内容读到内存中。读到什么位置呢?位于0X7c00ROM位置,然后跳转到哪里,将控制权交给MBR,这也就决定了MBR一定是在Boot Sector最前面,否则BIOS就将控制权交给DPT了。实际情况是DPT要占用64字节,BRID要占用2字节。所以留给MBR的只有446字节。从个头上看是MBR>DPT>BRID这么排序的。

它主要用来告诉计算机从选定的可启动设备的哪个分区来加载引导加载程序(Boot loader),

MBR:有446字节,就是一段空间。(后被Bootloader占用)

DPT(Partition Table):分区表占用64字节;每个主分区占用16字节;一共可以描述4个分区,而就拿一个硬盘2T来说那么MBR的分区表最多也就支持8T大小的硬盘存储空间。在大就没辙了吗?有办法,使用GPT,叫GUID分区表。这玩意单个分区支持18EB

BRID(boot record ID)引导记录标识占用2字节;BIOS会检查BRID这东西,也就是Boot sector的最后两个字节。看它是不是“0x55AA”这样的内容。不是就玩死机,是就交权。至于交权给MBR后怎么办,那就不是BIOS查操心的事了。

Linux系统启动过程详解(一)

GRUB菜单

bootloader

GRUB(grand unified bootloader)简称“极好的统一引导加载器”。敢这么嚣张,因为几乎所有的Linux发行版都使用它。而且还能驱使一直仰着高贵的头的solaris的新版本中也开始采用GRUB作为它的引导加载器。在类UNIX这个世界里,GRUB是绝对的老大。

bootloader即引导加载器,这个是什么呢?bootloader是在操作系统内核运行之前运行的一小段程序。它负责将操作系统内核装入内存,然后将电脑的控制权交给操作系统。它还会搜集电脑的硬件信息、初始化硬件设备、安排内存布局,从而将电脑的软硬件环境整理得井井有条。其实这并不是最重要的功能,因为这些BIOS都能干,由于死心眼的BIOS是始终坚定不移地读取MBR并跳转。而MBR也没什么能耐。哪个操作系统占了这台电脑就是哪个操作系统说了算。这显然不是最好的。于是就制定了“多启动规范”而很多bootloader就是实现这个“多启动规范”的对象。

GRUB的功能

在早期的Linux发行版上,普遍采用的遵守多启动规范的BootloaderLILO。据官方称LILOLinux loader的缩写。但是没有过几年就被GRUB干掉了。据说LILO现在都用在陷入是平台上。

GRUB是一个很牛叉的bootloader,主要表现在以下几点:

1. GRUB是动态可配置的,它在启动时读取配置信息,且允许启动时修改。

2. GRUB提供菜单供用户选择要启动的操作系统。通过向配置文件中添加相关信息,GRUB可以控制150个甚至更多的菜单选项。

3. GRUB支持的操作系统非常广泛。

4. GRUB具有多种形式的用户界面,多数Linux发行版利用GRUB的图形界面,提供带有漂亮背景的启动菜单。甚至还能支持鼠标操作。如果使用文本界面,还能利用串口实现远程终端启动。

5. GRUB拥有丰富的控制台命令与用户交互,载入操作系统之前,在GRUB的交互菜单界面下,按c键可以进入控制台。这个控制台与Linux的控制台很相似,提供类似shell的功能。

6. GRUB可以从镜像文件中启动操作系统。GRUB可以在它所支持的文件系统中找到操作系统的镜像文件,并启动这个操作系统。

7. GRUB支持多种语言。

GRUB的工作流程

目前GRUB所使用的GRUB的全称应该是GNU GRUB。也就是GNU组织山寨出来的。但以上的所有功能都是这个山寨出来的GRUB,现在的GRUB已经更新到第二代了。当然第一代也很流行。

第一代的GRUB使用三段式引导启动:

第一段是占MBR的坑,这是对付死心眼子的BIOS的唯一办法,但是GRUB要发挥功能,在MBR的那点地盘上折腾不起来,只能交个大的兄弟上,编译好的GRUB对应这个阶段会产生一个名为stage1的文件,大小一定是512.

第二段放在紧接MBR后面的固定位置,因为放别的地方会找不到。这里大概有30k左右的代码。主要是文件系统的驱动程序,目的就是为了能够找到名为stage2的文件。这个文件的内容是GRUB的主要功能代码。那既然MBR的代码是stage1,主功能代码是stage2,显然没有第二阶段啊!因为官方从来不叫第二阶段,这只是大家的理解。对应这一阶段编译出来的文件名是stage1_5,所以官方说这是1.5阶段。设置这一阶段是为了stage2可以乱放。可是30k左右的代码并不能支持所有文件系统啊。所以这阶段的代码是不确定的。stage2放在什么文件系统上,这部分就是什么文件系统的驱动。

第三段,由于stage2受文件系统管理,所以在空间上基本上就没什么障碍了。这就是我们说的第三阶段吗,提供一切能够提供的功能。

具体文件

Linux系统启动过程详解(一)

第二代的GRUB2

既然是第二代那么进步肯定不小,最主要的是不用手工编写配置复杂的配置文件了,但是让玩Linux的不写配置文件那是不现实的事情,所以只能试极大地简化。简化到只需要提供几个参数,或者回答yes or no就行了。

GRUB2使用四个阶段,而且采用了比较霸道的方式,即必须提供1M的空白空间,来放置它的核心代码。这1M的空间放在哪儿无所谓,但必须放在2T以内,否则找不到。所以就出现了大于2T磁盘分区要注意了这个问题。

GRUB2的第一段与GRUB1相同,也是占MBR的坑。这阶段的代码改名了,叫boot.img。更贴切一些了。当然大小是不变的512。它不去找什么stage1_5了。而是去那1M的空间中找diskboot.img。这个diskboot.img就是第二阶段的代码,大小也是512.GRUB核心文件core.img的第一个扇区。这阶段的代码就是继续将core.img文件余下的部分读到内存中,然后继续执行。第三阶段比较有趣,开始加载内核模块。注意这不是LINUX的内核模块,是GRUB的内核模块。这样设计的好处是core.img可以做的很小,可配置型和扩展型非常高。第四阶段次啊是启动操作界面,供用户选择要启动的操作系统。

说来说去,不管GRUB是一代还是二代,都脱离不了MBR。其实这个不是绝对的。完全没必要跟死心眼的BIOS较劲。GRUB的第一阶段代码是可以安装到别的地方的。不管是主分区还是逻辑分区,当然必须是第一扇区,而且要求所安装的分区是活动分区。

处理器执行BIOS程序,加载Boot sector后执行MBR需要读取Bootloaderstage1,找到stage1_5,然后根据stage1_5找到stage2,执行GRUB的配置文件。由配置文件的设定再去执行一系列操作。如加载内核

以下是GRUB的配置文件“/boot/grub/grub.conf”

/boot/grub/grub.conf中可以看到 root (hd0,0)这一行实际上是指定了/目录的所在的位置,但这个根并不是真正的根,而是/所在的位置,可以理解成/boot是处在(hd0,0)/boot,而这里的(hd0,0)指的是第一个磁盘的第一个分区,GRUB不是通过文件系统来访问内核的,以因为此时内核还没有启动,不存在文件系统,而是直接访问第一个磁盘的第一个分区(通过MBR中的分区表来识别分区),而识别MBR中的分区的文件系统,则是由GRUB通过加载自身携带的系统文件来实现的,这些文件在/boot/grub目录中。

系统启动部分之Post加电自检、MBR引导、GRUB菜单这三部分不管是centos5.xcentos6.x还是centos7.x都是一样的。唯一不同的是从加载内核开始往后就改变了很多。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)or分享 (0)
关于作者:

您必须 登录 才能发表评论!