Linux系统启动流程说难其实也算不上很难;
先看一个系统启动的流程图:
1、加载BIOS
计算机电源加电质检,首先加载基本输入输出系统(basic input output system,BIOS),BIOS中包含硬件CPU、内存、硬盘等信息,包括设备启动的顺序、硬盘信息、内存信息、时钟信息等,加载完BIOS信息后,计算机大概就知道启动的顺序了,计算机就按顺序进行启动。
BIOS
基本输入输出系统(basic input output system)。BIOS是一组固话在计算机主板上的只读内存镜像芯片上的一段程序,他保存着计算机最基本的输入输出程序,系统设置信息,开机后自检程序和系统自启动程序。主要功能就是为了计算机提供最直接的硬件设置和控制。我的理解是:可以类比成空调的说明书,有了这个说明书,我们就知道空调是怎么工作,是多少匹的,从哪出冷风热风,开空调之后空调调用了哪些零件,零件坏了我们怎么去修。
2、读取MBR
读取完BIOS信息,计算机将会查找BIOS所指明的硬盘MBR引导扇区(硬盘上第0磁道第一个扇区,512字节),将里面的内容赋值到0x7c00地址所在的物理内存中执行。(被复制的内容是bootloader),然后进行引导。具体到linux上就是GRUB。
MBR
硬盘分区初始化个数主要是MBR和GPT格式两种
如果使用MBR格式,操作系统会自己创建主引导记录扇区(master boot record,MBR),MBR就在这块磁盘的0号磁道0号柱面1号扇区。
主要的作用是操作系统对磁盘读写的时候,判断分区是不是合法以及分区引导信息的定位。
主引导扇区总共是512个字节,MBR只是占了446个字节,另外的64个字节是硬盘的分区表(disk partition table,DPT),最后两个字节是分区的结束标志。
为什么是0x7c00
主要是因为沿袭了以前的系统,保持兼容性。
我上网查过,以前的操作系统是86-DOS。这个操作系统需要的内存最少是32KB。因为,内存地址从0x0000开始编号,32KB的内存就是0x0000~0x7FFF。
8088芯片本身需要占用
0x0000~0x03FF
,用来保存各种中断处理程序的储存位置。(主引导记录本身就是中断信号INT 19h的处理程序。)所以,内存只剩下0x0400~0x7FFF
可以使用。为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:
0x7FFF-512-512+1=0x7C00
3、GRUB引导
GRUB启动引导其是计算机启动过程的第一个软件程序,计算机读取GRUB配置之后,会根据配置信息来启动硬盘中不同的操作系统。
GRUB
GRUB是GNU的一个项目。叫多操作系统启动程序,可以支持多操作系统的引导,他允许计算机同时拥有多个操作系统,并且在计算机启动的时候选择希望运行的操作系统。
Linux常见的引导程序包括LILO、GRUB、GRUB2.CentOS7 Linux 默认使用的是GRUB2。
GRUB和GRUB2的区别
最表象的是GRUB2用了模块化的设计,不用像GRUB分为stage1、stage1.5、stage2三个阶段。
4、加载kernel
通过grub设定的内核映像的地址,计算机读取内存映像并解压内核,内核会被放在内存里,并且调用start_kernel()函数来启动一些初始化函数并且初始化各种设备。完成Linux核心环境的建立。
5、设置inittab运行等级
内核加载好之后,会启动Linux操作系统第一个守护进程init,然后通过该进程读取/etc/inittab文件,/etc/inittab文件的作用就是设定Linux的运行等级。
Linux常见运行级别:
0:关机模式。
1:单用户模式。
2:无网络支持的多用户模式。
3:字符界面多用户模式。
4:保留,未使用。
5:图形化界面。
6:重启模式。
我们一般启动默认就是字符界面多用户模式。init 0和init 6是我比较喜欢用来关机和重启的两个命令。(因为算是比较短的,讲究高效嘛~)
6、加载rc.sysinit
读取完运行级别,linux系统执行的第一个用户层文件/etc/rc.d/rc.sysinit,里面包括设定path运行变量、设定网络配置、启动swap分区、设定/proc、系统函数、配置SELINUX等。可以去研究一下/etc/rc.d的脚本。
7、加载内核模块
读取/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
8、启动运行级别程序
根据第五步的设定,系统会运行rc0.d到rc6.d相应的脚本来完成初始化工作和启动相应的服务
[root@Master ~]# ls /etc/rc5.d/
K50netconsole S10network S95jexecS开头的表示系统即将启动的程序,如果K开头的代表停止该服务,后面的数字是启动顺序编号。
9、读取rc.local文件
系统启动完成相应服务之后,就会读取该文件,我们可以把我们需要开机启动的东西或者把我们开机不想启动的东西从这个文件里修改。
[root@Master ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.touch /var/lock/subsys/local
10、执行/bin/login程序
执行这个操作就会到系统提示输入用户名和密码的页面。整个启动流程完成。