今天我来说一说重量级的知识,开机启动流程。
首先我说明一下,我们的根文件系统是挂载在LVM设备上的。
那我先以一个简单的图示来说明一下
1.BIOS加电自检,加载硬件信息与进行自我测试,并依据取得第一个可启动的设备;
2.读取并执行第一个启动设备内的MBR的前446字节的Bootloader(grub程序)
3.boot loader加载内核到内存中,内核解压缩并搜索虚拟文件系统(InitialRAM Disk),然后以只读的方式挂载根文件系统。kernel开始检测硬件与加载驱动程序
4.内核加载完成后,就会调用系统的第一个进程/sbin/init,并在其配置文件/etc/inittab的协助下执行操作
5.执行/etc/rc.d/rc.local文件,开机启动后执行的最后一个文件,是用户自定义的文件。
6.最后执行终端模拟程序mingetty来启动login进程,提示用户登录
下面我来说一说其中具体的细节:
先来说一说Boot loader
Boot loader:安装操作系统时,装进MBR。有两款比较著名的程序:
LILO(LInux LOader),内核的分区必须在1024之前,不支持大硬盘
GRUB(GRand Unified Bootloader),把自己分成两段,其实作用很明显,第一段放在446字节里,为了引导第二段。第二段则放在分区/boot/grub/里,此目录下有grub的配置文件grub.conf (grub是在grub.conf的支配下运行的)
grub的功能:
1.能够实现启动哪个操作系统
2.grub的编辑模式可以直接向内核传递参数。
3.加密保护功能
grub 的配置文件grub.conf
格式如下所示:
default=0 ,默认启动第一个title
timeout=5 ,设置超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz ,显示的背景图片
hiddenmenu ,启动时不显示菜单
title mylinux ,title名称
root (hd0,0)
kernel /vmlinuz-2.6.18-238.el5
initrd /initrd-2.6.18-238.el5.img
root (hd0,0) ,root 表示用于定义你的grub的第二阶段用到的一些文件包括配置文件和kernel文件所在的分区的,(hd0,0)表示的是第一块硬盘的第一个主分区。grub不管你是什么硬盘,都叫hd,第一块硬盘hd0,第一个分区0 ,表示为(hd0,0)
kernel:
存放位置:/boot/vmlinuz-2.6.18-238.el5
内核必须放在基本磁盘分区上
内核展开后,也得检查初始化。
rootfs:根文件系统
当kernel加载完成后,开始执行/sbin/init。/sbin/init在根文件系统上,根文件系统在另一个磁盘分区上,我们的内核必须能够读取该磁盘分区才能找到/sbin这个目录,我们的内核能直接读取到/sbin吗?能直接挂载根分区吗?很明显不能。要想能就必须得有根分区所在设备的驱动,因为我们使用的是LVM设备,而一般情况下LVM的驱动是不能做进内核的。那到底该怎么办?此时只能借助额外的工具,让系统实现自举过程。这就是initrd。initrd靠虚拟出一个根文件系统,让内核把它加载进来,提供让内核读取真正的根分区的驱动程序,通过只读方式来挂载根文件系统的。
不过,并不是所有的启动都需要initrd。initrd是在当你的系统启动时无法挂载根目录的情况下,才发挥作用。例如你的设备是特殊的磁盘接口(USB,SATA,SCSI),或者你使用LVM或RAID设备时,才会需要initrd。当你的linux是安装在IDE接口的磁盘上,并且文件系统类型是ext2或ext3,那么不需要initrd也能够顺利启动你的linux。
kernel的主要操作:
1.Device探测
2.驱动程序初始化
3.以只读方式加载根文件系统
4.启动init进程
这些信息记录在/var/log/dmesg, 记录了初始化过程中的所有信息
接下来,就到init了
init的配置文件:/etc/inittab
我们来看一下
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
那我就来介绍一下:
格式为:id:runlevels:action:process
id:标识
runlevels: 主要指定默认启动级别
有哪些具体的action呢?
respawn 表示重新启动
wait 表示只在对应级别下启动一次
initdefault 设定默认启动级别
sysinit 定义系统的初始化过程 /etc/rc.d/rc.sysinit
ctrlaltdel 重启
那每一段具体都代表什么呢?那我就来介绍一下吧。
第一段:定义默认启动级别,也就是说你开机之后所进入的级别
0:关机 halt,shutdown -h now
1:单用户模式,s,S,single同样表示1级别。 单用户模式下不提供网络功能,此级别作用是当你忘记了root的密码时,你可以进入此级别,重新设置密码。当你开机启动进入菜单选项后,按字母e键之后,你会看到类似grub的配置文件的界面,然后选择kernel,再按字母e键,进入到grub的编辑模式,此时你在kernel这一行的后面输入1或s或S或single,都可以进入到1模式下,让后你就可以直接更改root的密码了。
2:多用户模式 ,不提供NFS服务
3:完全多用户模式,文本模式
4:系统预留
5:完全多用户模式,图形模式
6:重启 reboot,shutdown -r now
第二段:运行初始化脚本/etc/rc.d/rc.sysinit
/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文件
你可以看到此阶段才能使用RAID和LVM设备,并以读写方式挂载根文件系统。现在你明白我们为什么要用initrd了吧,也明白了initrd的作用了吧。
第三段:运行指定级别下的脚本/etc/rc.d/rcn.d/--> /etc/rc.d/init.d/
在/etc/rc.d/rcn.d中,n表示0-6,分别表示0-6这七个级别下的各种服务。其实他们都是链接文件,原文件在/etc/rc.d/init.d/。你进入/etc/rc.d/rc3.d,查看里面的文件。你会发现他们都是以K和S开头的,这又代表什么呢?其实以K开头的文件就表示此服务是关闭的,那S就表示此服务是开启的。当你设定好级别之后,系统就会执行对应级别下的脚本了。
第四段:shift+ctrl+del,按这三个键就会重新启动
第五段:powerfail,当掉电时所采取的行动
第六段:powerokwait,当掉电之后,又立刻来电了,所采取的措施,取消关机
第七段:虚拟终端,6个虚拟终端,若你只想使用一个,那你就可以把其它的都注释掉。
第八段:图形终端,图形界面,当你设定为3级别后,就不会执行这一段了。
阅读(1531) | 评论(0) | 转发(0) |