要了解linux系统的启动流程,先要了解系统的组成
关于系统的组成:
内核+根文件系统组成
内核:由内核核心文件和模块文件组成
1.内核核心文件:一般位于/boot/目录下,命名为vmlinuz-VERSION(版本号)
2.模块文件:位于/lib/modules/VERSION/目录下,存放着内核的众多功能组件(如驱动)
3.initrd:位于/boot下,一般命名为initramfs-VERSION,此文件相当于一个简装版的根文件系统,在内核无法挂载文件系统是加载,辅助内核完成真正的根文件系统挂载
补充一些基本概念:(方便在流程讲解中容易理解)
(1)CMOS:主板上的一块可读写的RAM芯片,保存系统的硬件配置信息
(2)BIOS:基本输入输出系统,写入主板ROM芯片的微系统
(3)MBR:Master Boot Record,共512字节,446字节boot loader,64字节分区表
(4)boot loader:启动管理程序,linux启动管理程序为grub或lilo
系统启动的简要流程:
BIOS开机自检 --> 加载boot loader --> boot load加载内核文件到内存 --> 内核初始化,最后启动init进程 --> init初始化,启动登陆终端
系统的简单启动流程如以上所示,要了解其中的细节,大概需要分为两层来展开,内核层面和用户层面,以下启动流程基于grub展开
内核层面:
1.开机自检:启动电源后,BIOS会读取CMOS中的硬件信息,完成自检后读取“第一启动设备的第一扇区”中的boot loader程序grub
2.grub引导有三个阶段:stage1、stage1_5、stage2
stage1:此阶段并不是直接引导内核,而是指向第二扇区的stage1_5
stage1_5: 识别文件系统并加载stage2
stage2:找到内核并解压至内存,功成身退
3.内核初始化,并尝试以只读方式挂载根文件系统,根文件系统挂载后,内核便加载驱动,最后内核启动第一个进程init
若内核无法完成根文件系统挂载,则需要加载initramfs文件来辅助根的挂载
用户空间层面
4. init程序初始化系统环境,通过读取inittab获取运行级别,加载初始化脚本/etc/rc.d/rc.sysinit,根据相应的运行级别完成服务的停止和启动,最终启动终端
注意:initramfs是非必须的,取决于内核是否能挂载根文件系统
init初始化:(CentOS 5的初始化流程)
init是内核完成初始化最后一步启动的系统第一的进程,其PID为1,init读取inittab配置文件设定运行级别, 然后读取/etc/rc.d/rc.sysinit初始化脚本,完成系统环境初始化,按照运行级别加载和关闭相关服务(相关运行级别服务信息,通过遍历/etc/rc.d/下对应运行级别的目录中的符号连接,符号连接指向/etc/rc.d/ini.d目录下的脚本文件)
最终启动终端
配置文件:/etc/inittab
配置系统运行级别
[[email protected]_linux ~]# cat /etc/inittab # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault:
0 - halt (系统直接关机)
1 - single user mode (单人模式,无需登录,用于维护)
2 - Multi-user, without NFS (无NFS服务的多用户系统)
3 - Full multi-user mode (有网络功能的命令行模式)
4 - unused (系统保留功能)
5 - X11 (加载X Window,与3相似)
6 - reboot (重新启动)
注意:默认runlevel不要设置成0或6,否则系统将会不停关机个重启
配置文件相关语法:
id:runlevel:action:process
id:任务标示
runlevel:运行此任务的级别
action:启动此任务的条件
process:任务
action:
wait:等待切换至此任务所在的级别时执行一次:
respawn:一旦此任务终止,就自动重新启动之:
initdefault:设定默认运行级别:此时,process省略:
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本:
例子:2:2:wait:/etc/rc.d/rc6.d
表示切换至2级别要执行一次rc.6的配置文件
在服务初始化时,优先级别高的服务会先被停止或者启动,被依赖的服务其启动优先级应该高于被依赖的服务,停止优先级应该低于被依赖的服务
/etc/rc.d/rc.sysinit
初始化脚本文件,init通过加载此脚本文件初始化系统环境
初始化信息
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的所有文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 根据/etc/sysctl.conf文件来设置内核参数
(8) 激活lvm及软raid设备
(9) 激活swap设备
(10) 加载额外设备的驱动程序
(11) 清理操作
/etc/rc.d/*.d
rc.d目录下存放以$runevelrc.d命名的文件,内容是对应runlevel
应该停止和启动的服务的符号链接,符号连接指向的是/etc/rc.d/init.d目录下的脚本文件
/etc/rc.local:初始化流程最后指定执行的脚本文件,可通过此文件设定开机自动启动程序
chkconfig:查看运行级别的服务信息
查看
chkconfig [--list] [name]
添加
chkconfig --add name
删除
chkconfig --del name
修改
chkconfig [--level LEVEL] name {no|off|reset}
不指定level默认为2345