linux启动总流程
POST加电自检-->BIOS(Boot Sequence)->MBR(bootloader)->Kernel->initrd->rootfs(/sbin/init)
下面对每个启动流程做详细解释:
POST(加电自检)
计算机本身不执行任何程序,所以系统必须要完成自举的过程,在CPU的控制下,将RAM芯片中的某个程序映射到ROM地址空间,并执其中的指令完成系统硬件健康状况检查,例如存储设备、网卡、CPU、声卡等其他硬件设备是否完好。当检查完成后,所有硬件或基本硬件、核心硬件没有问题,则下一个启动流程->BIOS
BIOS(Boot Sequence)
按照BIOS所设定的系统启动流程,根据引导次序(Boot Sequence)自上而下的寻找对应存储设备上操作系统的MBR,如果MBR存在,则会读取MBR中的bootloader
MBR(bootloader)
会根据MBR所指引的活动分区上寻找系统分区中的 bootloader,bootloader称为是一段程序,占据446字节。在bootloader当中配置了所要引导操作系统的内核所在的位置,因此BIOS被载入内存以后,当它实现将控制权限转交给bootloader以后,bootloader接收整个系统的控制权限,而后根据用户的选择去读取相应操作系统中的内核,并将内核装载入内存的某个空间位置,解压缩,这时kernel就可以在内存中活动,并根据kernel本身功能在内存当中探索硬件并加载硬件驱动程序并完成内核初始化,bootloader会将控制权限转交给内核。
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级别
下面就来说下/etc/inittab所工作那些内容:
/etc/inittab
默认运行级别
0:halt
1: single user mode(单用户维护模式)
2:multi user mode, without NFS(不支持NFS功能)
3: multi user mode, 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
nit处理系统初始化流程/etc/rc.d/rc.sysinit(设置系统环境)
取得网络环境与主机类型->/etc/sysconfig/network
测试与挂载内存设备/proc及/sys
SElinux
启动系统的随机数生成器
设置终端机字体
设置系统启动过程中的欢迎界面
设置系统时间与时区设置/etc/sysconfig/clock
接口设备检测
用户自定义模块加载->/etc/sysconfig/modules/*.modules
根据/etc/sysctl.conf设置内核参数
初始化软件磁盘阵列->/etc/mdadm.conf
初始化LVM文件系统功能
fsck检测磁盘文件系统
磁盘配额
检测,并以读写方式重新挂载根文件系统
清除清除过程当中的临时文件
将启动的相关信息->/var/log/dmesg
启动服务与相关启动配置文件(/etc/rc.d/rc # &/etc/sysconfig )
以默认级别3说明:id:3:initdefault:
l3: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让用户登录->用户登录(完成系统启动)