Linux学习笔记<十七>――Linux系统启动流程

系统启动的大致流程如下:

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:

wKioL1XKvMDwLG6lAABCX8QcUwo542.jpg


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:

系统最后启动的一个服务,准确说,应该执行的一个脚本;



你可能感兴趣的:(grub,启动流程,Linux学习)