一、详解 Linux 启动流程及需要使用到的配置文件
POST 加电自检 --> BIOS(Boot Sequence) -> MBR(bootloader) -> Kernel ->initrd ->rootfs(/sbin/init)
下面对每个启动流程做详细解释:
1.1、POST(加电自检)
计算机本身不执行任何程序,所以系统必须要完成自举的过程,在 CPU 的控制下,将 RAM 芯片中的某个程序映射到 ROM 地址空间,并执行其中的指令完成系统硬件健康状况检查,例如存储设备、网卡、CPU、声卡等其他硬件设备是否完好。当检查完成后,所有硬件或基本硬件、核心硬件没有问题,则下一个启动流程 -> BIOS。
1.2、BIOS(Boot Sequence)
按照 BIOS 所设定的系统启动流程,根据引导次序(Boot Sequence)自上而下的寻找对应存储设备上操作系统的 MBR,如果 MBR 存在,则会读取 MBR 中的 bootloader。
1.3、MBR(bootloader)
会根据 MBR 所指引的活动分区上寻找系统分区中的 BootLoader,BootLoader 称为是一段程序,占据 446 字节。在 BootLoader 当中配置了所要引导操作系统的内核所在的位置,因此 BIOS 被载入内存以后,当它实现将控制权限转交给 BootLoader 以后,BootLoader 接收整个系统的控制权限,而后根据用户的选择去读取相应操作系统中的内核,并将内核装载入内存的某个空间位置,解压缩,这时 kernel 就可以在内存中活动,并根据 kernel 本身功能在内存当中探索硬件并加载硬件驱动程序并完成内核初始化,BootLoader 会将控制权限转交给内核。
1.4、Kernel(初始化)
我们知道 kernel 是完成探索硬件及加载硬件驱动程序,并以读写的方式挂载根文件系统。那么这里就出现一个比较诡异的问题,是什么问题呢?
我们又知道,想要访问真正的根文件系统(rootfs)的话,就必须加载根文件系统中的设备,这时根文件系统又没有挂载,要挂载根文件系统又得加载根文件系统中的驱动程序,那怎么办呢?这是就用到了 initrd 文件了。在来说下 kernel 初始化所要工作的内容做下简单总结:
探测硬件 -> 加载驱动(initrd)-> 挂载根文件系统 -> rootfs(/sbin/init)
initrd 功能介绍:
其实说白了 initrd 就是一个虚拟的文件系统,里面有 /、lib、bin、sbin、usr、proc、sys、var、dev、boot 等一些目录,其实你会发现里面的目录有点像真的 / 对吧,所有我们称之为虚拟的根文件系统,作用就是将 kernel 和 真的根文件系统建立关联关系,让 kernel 去 initrd 中加载根文件系统所需要的驱动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程 init。
/sbin/init(/etc/inittab):
/sbin/init 启动会用到 /etc/inittab 所定义的条目,如:默认登录级别 id:3:initdefault:(这里就是默认启动3级别)。
下面就来说下 /et/inittab 所工作哪些内容:
/etc/inittab:
默认运行级别:
0:halt
1:single user mode(单用户维护模式)
2:multi user mode,without NFS(不支持 NFS 功能)
3:multi user mod,text mode(字符界面)
4:reserved(系统保留)
5:multi user mode,graphic mode(图形化界面)
6:reboot(重启)
系统初始化(/etc/rc.d/rc.sysinit):
检测,并以读写方式挂载根文件系统;
设定主机名;
检测并挂载 /etc/fstab 中其它文件系统;
启动 swap 分区;
初始化外围硬件设备驱动;
根据 /etc/sysctl.conf 设定内核参数;
激活 udev 和 SELinux;
激活 LVM 和 RAID 设备;
清理过期锁文件和 PID 文件;
装载键映射 --> 键盘上每个键的功能;
运行制定级别的服务脚本:
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0 - rc6
K* ##只要是以 K 开头的文件均执行 stop 工作
S* ##只要是以 S 开头的文件均执行 start 工作
0-99 (执行次序,数字越小越先被执行)
init 执行 /etc/rc.d/rc.local:
init 执行中断机模拟程序 mingetty 来启动 login 进程,最后等待用户登录。
下面再来说下 /etc/inittab 的语法及格式:
/etc/inittab 格式及语法(:)
[设置选项]:[runlevel]:[init 操作行为]:[命令选项]
- 设置选项:
代表 init 主要工作选项 - 运行级别:
0 - 6 - init 操作行为:
initdefault:代表默认运行级别
sysinit:代表系统初始化操作选项
ctrlaltdel:代表重启的相关设置
wait:代表上一个命令执行结束后方可执行下面的操作
respawn:代表后面字段可以无限制再生(reboot) - 命令选项:
一些命令,不过通常都是脚本
init 处理流程:
根据 /etc/inittab 设置进行处理:以默认级别3说明:id:3:initdefault:
default runlevel->/etc/rc.d/rc.sysinit->/etc/rc.d/rc5.d->ctrlatdel->set "pf" and "pr"->mingetty->login
init 处理系统初始化流程 /etc/rc.d/rc.sysinit(设置系统环境):
取得网络环境与主机类型 -> /etc/sysconfig/network
测试与挂载内存设备 /proc 及 /sys
SElinux
启动系统的随机数生成器
设置终端机字体
设置系统启动过程中的欢迎界面
设置系统时间与时区设置 /etc/sysconfig/clock
接口设备检测
用户自定义模块加载 -> /et/sysconfig/modules/*.modules
根据 /etc/sysctl.conf 设置内核参数
初始化软件磁盘阵列 -> /etc/mdadm.conf
初始化 LVM 文件系统功能
fsck 检测磁盘文件系统
磁盘配额
检测,并以读写方式重新挂载根文件系统
清除清除过程当中的临时文件
将启动的相关信息 -> /var/log/dmesg
启动服务与相关启动配置文件(/etc/rc.d/rc # &/etc/sysconfig):
以默认级别3说明:id:3:initdefault:
i3:3:wait:/etc/rc.d/rc 3
找到 /etc/rc.d/rc3.d
以 K* 开头的文件,并运行 /etc/rc.d/rc3.d/K* stop
以 S* 开头的文件,并运行 /etc/rc.d/rc3.d/S* start
/etc/rc.d/rc#.d/ 里面的文件链接的都是 /etc/rc.d/init.d 的文件
用户自定义开启启动程序(/etc/rc.d/rc.local):
可以根据自己的需求将一些执行命令或是脚本写到 /etc/rc.d/rc.local 里,当开机时,就可以加载啦
根据 mingetty 程序调用 login 让用户登录 -> 用户登录(完成系统启动)