系统启动的大致流程如下:
1.加载BIOS的硬件信息与进行POST加电自检,并依据配置取得第一个可启动的装置;
2.读取并运行第一个启动装置内MBR的bootloader(即grub、lilo、spfdisk等程序);
3.依据bootloader的配置加载kernel,kernel会开始侦测硬件与加载驱动程序;
4.硬件驱动成功后,kernel会主动执行/sbin/init,而init读取/etc/inittab获得run-level信息;
5.init读取/etc/rc.d/rc.sysinit,根据run-level在/etc/rc.d/rc#.d/(#表示run-level)下执行相应 的服务进程,执行/etc/rc.d/rc.local下自定义的服务进程;
6.init执行/bin/login程序,进入登陆状态
BIOS
BIOS程序固化在BIOS ROM中,而BIOS设置的参数是放在CMOS RAM中的。
BIOS工作可分为两个阶段:
阶段一:POST加电自检,是BIOS的功能之一,主要用于检测系统关键设备是否正常
阶段二:根据在BIOS中设置的系统启动顺序,读取第一个启动设备的第一个扇区即MBR
Bootloader
Bootloader是MBR中的前446B代码,最主要的功能是读取相应配置找到并加载启动设备中的内核镜像和initrd镜像到内存中。常用的bootloader有grub、lilo和spfdisk,以下以grub为例。
grub通常分为stage1、stage1_5、和stage2三个阶段
stage1和stage1_5用于辅助加载stage2
stage2用于读取grub的配置文件/boot/grub/grub.conf,然后加载内核镜像和initrd镜像到内存中
stage1:将0头0道2扇区读入内存,内容是源代码中的/stage2/start.S,它是stage1_5或stage2的入口
如果start.S加载stage1_5:stage1_5存放在0头0道3扇区向后的位置,具有识别文件系统的能力,此后grub才有能力访问/boot分区/boot/grub/目录下的stage2,将stage2载入内存并执行
如果start.S直接加载:这个时候start.S读取的是存放在/boot分区boot sector中的stage2
安装grub stage1:
# grub
grub> root (hd0,0) 探测磁盘,指定磁盘类型
grub> setup (hd0)
安装grub stage2
# grub-install --root-directory=/path/to/boot's_parent_dir /dev/sda
grub配置损坏后启动系统进入grub> 提示
grub > find (hd#,N)
grub> root (hd#,N)
grub> kernel /PATH/TO/KERNEL_FILE
grub> initrd /PATH/TO/INITRD_FILE
grub> boot
grub.conf文件格式
default=0 # 设定默认启动的title的编号,从0开始
timeout=5 # 等待用户选择的超时时长,单位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景图片
hiddenmenu # 隐藏菜单
password redhat
password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
title Red Hat Enterprise Linux Server (2.6.18-308.el5) # 内核标题,或操作系统名称,字符 串,可自由修改
root (hd0,0) # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为 (hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区;
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet # 内核文件路 径,及传递给内核的参数
initrd /initrd-2.6.18-308.el5.img # ramdisk文件路径
password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
title Install Red Hat Enterprise Linux 5
root (hd0,0)
kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6
initrd /initrd-5
password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
grub-md5-crypt命令用于生成md5加密后的密码串
Kernel初始化
Stage2完成加载内核镜像后便把控制权转交给内核。kernel的初始化过程大致分三步
1.设备探测
2.加载设备驱动程序(可能会从initrd(RHEL6下initramfs)文件中装载驱动模块)
3.以只读方式挂载根文件系统
4.装载第一个进程init(PID=1)
启动程序
/sbin/init:(/etc/inittab)
sysinit:最原始的init程序,串行启动,灵活性差
upstart:RHEL6下使用,ubuntu开发的,并行地启动多个进程,就d-bus管理各进程间的通信
systemd:提供了比upsart更激进的并行启动能力,采用socket/D-Bus activation等技术启动 服务
RHEL5下/etc/inittab的任务:
1.运行默认运行级别;
2.运行系统初始化脚本;
3.运行指定运行级别对应的目录下的脚本;
4.设定Ctrl+Alt+Del组合键的操作;
5.定义UPS电源在电源故障/恢复时执行的操作;
6.启动虚拟终端(2345级别);
7.启动图形终端(5级别);
而RHEL6下只运行默认运行级别
RHEL5下/etc/inittab文件格式
id:runlevels:action:process
id:标识符
runlevels:在哪个级别运行此行
action:在什么情况下执行此行
process:要运行的程序
查看当前系统的运行级别
runlevel:output previous and current runlevel
who -r:
runlevels描述
0:halt
1:single user mode,直接以管理员身份切入 s,S,single
2.multi user mode,no NFS
3.multi user mode,text mode
4.reserved
5.multi user mode,graphic mode
6.reboot
action描述
initdefault:设定默认运行级别
sysinit:系统初始化
wait:等待级别切换至此级别时执行
respawn:一旦程序终止,就在启动一次,如控制端中logout后,又重新启动一个tty
/etc/rc.d/rc.sysinit完成的任务
1.激活udev和selinux
2.根据/etc/sysctl.conf文件,来设定内核参数
3.设定时钟
4.装载键盘映射
5.启动交换分区
6.设定主机名
7.根文件系统检测,检测到后以读写方式重新挂载
8.激活RAID和LVM设备
9.启用磁盘配额
10.根据/etc/fstab检测并挂载其他文件系统
11.清理过期的锁和PID文件
服务类脚本位于/etc/rc.d/init.d/
用法 /etc/rc.d/init.d/服务程序 {start|stop|restart|status|reload|configtest}
各脚本中均有
#chkconfig runlevels SS KK -表示没有级别默认为S*开头的链接
当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为S*开头的链接;除此之外的级别默认创建为K*开头的链接;S后面的启动优先级为SS所表示的数字;K后面关闭优先次序为KK所表示的数字;
#description:用于说明此脚本的简单功能,\续行转行符
chkconfig
--list SERVICE_NAME:缺省时查看所有独立守护服务的启动设定;独立守护进程
--add SERVICE_NAME:加入到服务列表中,会在/etc/rc.d/rc#.d/目录下生成对应的链接
-del SERVICE_NAME:删除
--level RUNLEVELS SERVICE_NAME {on|off}:如果缺省级别指定,默认为2345级别
守护进程的类型:
独立守护进程
xinetd:超级守护进程,需要关联至运行级别,瞬时守护进程的代理人,对瞬时守护进程管理
瞬时守护进程:不需要关联至运行级别
/etc/rc.d/rc.local:
系统最后启动的一个服务,准确说,应该执行的一个脚本;