服务器或PC机从按下电源按钮开始,会首先进行自检流程,其实一个非常复杂的过程,只见屏幕上字幕乱飞,各种check和ok,那么其间究竟发生了什么事情呢?
启动又称为boot,而boot的原意为靴子,那么启动与靴子有什么关系呢?其实boot是boot是bootstrap(鞋带)的缩写,它来自于一句谚语:
"pull oneself up by one's bootstraps"
意思为拉着自己的鞋带儿把自己拉起来,这肯定是不可能的事情,但是在早期PC还没有问世的时候,研发的工程师门用这句话来比喻计算机的开机流程是一个很复杂的过程,因为计算机要运行就得先运行程序,但是计算机还没有运行的时候又怎么运行程序呢?
所以工程师们要想尽各种办法,在计算机启动之前将一小段程序放进内存,然后计算机才能正常工作,所以工程师们把这个过程称为“拉鞋带儿(bootstraps)”,慢慢就习惯称为boot了。
下面开始介绍计算机的启动流程:
一:BIOS阶段:
在上世纪70年代初期,只读内存(read0only memory,缩写为ROM)问世,开机的第一个程序被预先写入到ROM内置芯片,当计算机通电后,第一件事情就是读取位于ROM中的程序,这个程序后来被叫做基本输入输出系统(basic input/output system),就是现在每台PC都有的BIOS。
1.1:加电自检:
BIOS启动后会首先进行硬件检测,即检测硬件是否满足计算机的启动条件,BIOS是计算机厂商在计算机出厂之前就写入到芯片的,因此每个厂商的BIOS还不尽相同,硬件自检称为(Poer-On Self-Test),缩写为POST,自检会检测内存、CPU、风扇、硬盘等信息,如果有硬件不符合要求会发出不同的声音进行提示,如果检测通过则会在屏幕输出硬件信息。
1.2 启动顺序:
在BIOS对硬件自检通过之后,BIOS会把启动控制权交给下一阶段的启动程序,下一阶段的启动程序需要进行提前设置,可以设置硬盘启动、光驱启动、网卡启动、USB启动等方式,BIOS会选择排在第一行的作为第一启动项,如下:
二:主引导阶段:
BISO安装预先设定好的启动顺序,将启动控制权交给排在第一位的存储设备。
然后计算机会读取该设备的第一个扇区512字节,叫做“主引导记录”(Master boot record,缩写为MBR),硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和分区有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,每个分区16个字节,所以只能有最多4个分区,硬盘中分区有多少以及每一分区的大小都记在其中,第三部分是magic number,占2个字节,固定为55AA,MBR是由安装操作系统时写入到硬盘里面的,它的主要功能是在开机从BIOS接到引导后,检测硬盘分区表是否完整,如果分区表有问题则会显示一个横杠在屏幕闪动或GRUB界面,然后在分附表中查找标记为活动的分区,并将活动分区的第一逻辑扇区装在到内存,将引导交予活动分区继续引导,MBR由系统引导代码段、分区表和有效标志组成,MBR分区表的最大可寻址的存储空间只有2Tb,当PC加电BIOS自检完毕后将控制权交给MBR中的引导代码段,由MBR代码加载操作系统完成启动过程,MBR信息不能存在于不可分区的媒介或高级分区,如软盘、LVM等分区中,是因为系统开机时没有相关驱动,无法识别有效的分区信息。
另外MBR信息是可以备份的,也建议将服务器的MBR信息备份一下,复制到安全的地方,以避免突然断电等非正常关机后导致MBR丢失而无法开机,以下方法可以将当前计算机的MBR进行提取:
dd if=/dev/sda of=/root/mbr bs=1 count=512
即从sda读取512个块,每个块大小为1字节,即512字节,也就是将整个MBR导出成mbr文件文件导出后是二进制文件,是无法使用cat或vim等命令直接打开或编辑的,但是可以使用od命令查看od命令常用参数:-Ax :左边地址显示用十六进制显示-tx1 :显示内容以十六进制显示,并以一个字节为一个显示单位
使用以下命令查看MBR信息:
[root@linux-node1 ~]# od -tx1 -Ax /root/mbr 000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b 000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc 000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c 000090 b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 0000a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 0000b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 0000c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd 0000d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 0000e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 0000f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 000100 f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 000110 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 000120 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 000130 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 000140 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e 000150 b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f 000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 0001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 #以上为主引导程序(boot loader) 0001b0 00 00 00 00 00 00 00 00 b1 d3 05 00 00 00 80 20 #第一个分区信息 0001c0 21 00 83 9f 06 19 00 08 00 00 00 40 06 00 00 9f #第二个分区信息,83为标准linix分区,这里是boot分区 0001d0 07 19 8e 98 79 1f 00 48 06 00 00 38 40 00 00 98 #第三个分区信息,8e是LVM分区 0001e0 7a 1f 8e fe ff ff 00 80 46 00 00 80 b9 09 00 00 #第四个分区信息 0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa #55 aa为分区合法标志,表示磁盘可以引导系统启动,即有活动分区
#第一个分区表信息,从80开始到06结束,80表示可启动分区,20/21/00是开始磁头/开始扇区/开始柱面,第五字节83是分区信息,6第-8字节9f/06/19字节结束磁头/结束扇区/结束柱面,第9-12字节
00/08/00是分区前的隐藏扇区,是8个隐藏的扇区,是保护此分区表,第13-16字节00/00/40/06是分区大小总共的扇区。
第二个分区到第四个分区一次类推。
从备份恢复mbr的命令:
dd if=/root/mbr of=/dev/sda bs=1 count=512
总结:
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
在此阶段,启动引导会识别一个激活的主分区,并将下一步的引导交于主分区继续进行启动引导,这样就到了第三阶段。
三、第三阶段:硬盘启动
计算机在 上一个阶段读取了主引导记录前面的446字节的引导代码之后,会运行事先安装在此分区的“启动管理器(boot loader)”,由用户选择启动的操作系统,在linux RHEL 7版本之前,通常是Grub引导,由此将控制权交给操作系统继续引导,如下:
四、第四阶段:操作系统
控制权转交给操作系统后,操作系统的内核vmlinuz首先被载入内存,以Linux系统为例,先载入/boot目录下面的kernel,内核加载成功后,第一个运行的程序是/sbin/init,它产生出init进程,这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的子进程,然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码,至此,全部启动过程完成。