CentOS6详细启动流程
- 一、CentOS6 内核组成
- 1.Linux: kernel+rootfs
- 2.Linux内核特点:
- 3.组成部分:
- 二、CentOS6 启动流程
- 1.POST 加电自检
- 2.MBR引导
- 3.Grub启动
- 4.依据BootLoader的设置,加载Kernel
- 5.Kernel调用init进程,取得run-level的信息
- 6.init处理系统初始化流程(/etc/rc.d/rc.sysinit)
- 7.启动系统服务与相关配置文件(/etc/rc.d/rc N & /etc/sysconfig)
- 8.init执行/etc/rc.d/rc.local文件
- 9.init执行程序mingetty启动login进程
- 三.BootLoader:Grub
- 1.硬件与分区在grub中的代号
- 2./boot/grub/grub.conf配置文件
一、CentOS6 内核组成
1.Linux: kernel+rootfs
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
2.Linux内核特点:
支持模块化:.ko(内核对象)
如:文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载
3.组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
二、CentOS6 启动流程
启动流程图大致如下:
1.POST 加电自检
POST:Power-On-Self-Test,加电自检,是BIOS功能的一部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测。
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
2.MBR引导
由于不同的操作系统文件系统各不相同,因此需要一个引导装载程序来处理内核文件加载的问题。这个引导程序称之为BootLoader,这个引导程序安装在设备启动的第一个扇区(sector)内,意即MBR(MasterBoot Record,主引导分区)。
BootLoader的主要功能如下:
- 提供菜单:用户可以选择不同的启动选项,实现多重引导。
- 加载内核文件:直接指向可启动的程序区段来开始操作系统。
- 转交其他loader:如果是多操作系统,则将引导程序转交其他loader负责。
MBR由三个部分组成,主引导记录BootLoader、硬盘分区表DPT和硬盘有效标志。
在总共512字节的主引导扇区里
第一部分是BootLoader,占446个字节,它负责从活动分区中装载并运行系统引导程序;
第二部分是Partition table区(DPT分区表),占64个字节;
第三部分是Magic number,占2个字节。
windows使用的bootloader程序是ntloader,只能对windows进行引导不能对其他系统进行引导,而Linux的bootloader叫GRUB,可以对其他操作系统进行引导(包括windows),而MBR前446就属于grub一部分。
3.Grub启动
前面说到,MBR的446字节的东西就是grub的一部分忙也就是说,我们的计算机启动磁盘后会找到grub,我们看看grub文件夹中的内容。
GRUB (GRand Unified Bootloader 简称GRUB)是一个来自GUN项目的多操作系统启动程序,能够启动大多数免费操作系统 Linux、FreeBSD、NetBSD、GNU Mach和其它大多数的商业操作系统。在Linux系统的启动过程中GRUB程序是分为三个阶段在发挥它的作用,分别是1 stage、1.5 stage和2 stage。
- 1 stage:MBR前446字节中的boot loader,主要用于初始化硬件。
- 1.5 stage:存放于MBR 512字节后续的空间之中,这段空间不属于任何分区,可以直接读取,主要用来加载进入boot分区所需的文件系统驱动,默认是ext4文件系统的驱动。
- 2 stage:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlinuz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。
4.依据BootLoader的设置,加载Kernel
- 通过boot loader读取内核文件后,Linux就会将内核解压缩到内存中。
- 系统引导器程序会从本地硬盘中加载内核以及内存文件系统(CentOS 6 中使用initrd)。
- Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。
- 内存文件系统initramfs 是经过gzip 的cpio归档,其中包含启动时所有必要的硬件内核模块,初始化脚本等。
- 内核文件一般放置在/boot下,并且取名/boot/vmlinuz。
具体文件\文件夹对应释义:
名称 | 功能 |
config-2.6.32-696.el6.x86_64 | 此版本内核被编译时选择的功能与模块配置文件 |
grub | 引导程序grub相关数据目录 |
initrd-2.6.32-696.el6.x86_64kdump.img | 虚拟文件系统 |
System.map-2.6.32-696.el6.x86_64 | 内核功能放置到内存地址的对应表 |
vmlinuz-2.6.32-696.el6.x86_64 | 内核文件 |
为了硬件开发商与其他内核功能开发者的便利,因此Linux内核是可以通过动态加载内核模块的,内核模块一般放置在/lin/modules目录内。由于模块位置放置到磁盘根目录内,因此在启动过程中内核必须要挂载根目录。考虑到担心影响到磁盘内的文件系统,因此启动过程中根目录是以只读方式挂载的。
5.Kernel调用init进程,取得run-level的信息
内核加载完毕后,主机的硬件、驱动已经准备就绪,内核就会主动调用第一个进程,就是/sbin/init。该程序最主要的功能就是准备软件的执行环境,包括系统的主机名、网络设置、语系处理、文件系统格式及其他服务的启动等。而所有的操作都会通过init的配置文件,即/etc/inittab来规划。
run level:执行等级,通过设置run level来规定系统使用不同的服务来启动,让Linux的使用环境不同,一般在centos6中,将run level分为7个等级。
级别 | 说明 |
0 | halt(系统直接关机) |
1 | single user mode(单用户维护模式,用在系统出问题时的维护) |
2 | Multi-user,without NFS(类似runlevel3,启动网络功能,但无NFS服务) |
3 | Full multi-user mode(完整拥有网络功能的纯文本模式) |
4 | unused(系统保留功能) |
5 | 多用户模式,图形界面 |
6 | reboot(重启) |
CentOS6/etc/iunittab配置文件如下图所示:
这个文件的语法是用冒号(:)将设置分隔成为四个字段,每个字段的意义与说明如下:
[id]:[run level]:[action]:[process]
- 1.设置选项:是惟一标识该项的字符序列。
- run level:定义了操作所使用的运行级别
- action: 指定了要执行的特定操作
- process:定义了要执行的进程
其中action还有以下设置值:
init 设置值 | 说明 |
wait | 切换至此级别运行一次 |
respawn | 此process终止,就重新启动之 |
initdefault | 设定默认运行级别;process省略 |
sysinit | 设定系统初始化方式 |
6.init处理系统初始化流程(/etc/rc.d/rc.sysinit)
该shell script主要来设置系统环境,主要工作大抵有几项:
- 取得网络环境与主机类型:
读取网络配置文件/etc/sysconfig/network,取得主机名与默认网关(gateway)等网络环境。 - 测试与挂载内存设备/proc及USB设备/sys。
- 决定是否启动SELinux:
SELinux会在这个时候进行检测,检测是否需要帮所有的文件重新编写标准的SELinux类型。 - 启动系统的随机数生成器、
- 设置终端(console)字体。
- 设置显示于启动过程中的欢迎界面(textbanner)。
- 设置系统时间(colok)与时区设置:需读入/etc/sysconfig/clock设置值。
- 用户自定义模块的加载:
用户可以在/etc/sysconfig/modules/*.modules中加入自定义的模块,此时会被加载到系统当中。 - 加载内核相关设置:
系统会主动读取/etc/sysctl.conf这个文件的设置值。 - 设置主机名和初始化电源管理模块(ACPI)。
- 初始化软件磁盘阵列:主要通过/etc/mdadm.conf来设置。
- 初始化LVM的文件系统功能。
- 以fsck检测磁盘文件系统。
- 进行磁盘配额quota的转换(非必要)。
- 重新以可读写模式挂载系统磁盘。
- 启动quota功能。
- 启动系统伪随机数生成器。
- 清除启动过程中生成 临时文件。
- 将启动的相关信息加载到/var/log/dmesg文件中。
7.启动系统服务与相关配置文件(/etc/rc.d/rc N & /etc/sysconfig)
加载内核让整个系统准备接受命令来工作,再经过/etc/rc.d/rc.sysinit的系统图模块与相关硬件信息的初始化后,我们还需要启动系统所需要的各项服务,这样才能提供相关的网络或者是主机相关功能。依据在/etc/inittab里面设置的run level值,决定启动哪些服务选项了。
以我的系统举例。我的run level设置是5,因此找到/etc/rc5.d/,进入该目录下:
文件名全部以Sxx或Kxx开头,其中xx为数字:
- K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
- S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
- 全部都是链接文件,链接到stand alone服务启动的目录/etc/init.d/去。
8.init执行/etc/rc.d/rc.local文件
在完成默认run level指定的各项服务的启动后,如果我们还有其他的操作时,我们可以在/etc/rc.d/rc/local中定义要执行的系统命令。
9.init执行程序mingetty启动login进程
在完成所有的服务的启动后,之后Linux就会启动终端机或者是X Window来等待用户登录,根据run level中设置的级别,会执行/sbin/mingetty来启动终端机的命令。
三.BootLoader:Grub
上文提及,BootLoader加载Grub程序来引导系统的启动,分为了stage1,stage1.5和stage2三个阶段。
grub的程序主要放置在/boot/grub目录下。
目录中最重要的就是/boot/grub/grub.conf这个配置文件以及各个文件系统的定义。loader读取文件西永的定义数据后,然后就能够认识文件系统并读取文件系统内的内核文件,grub的优点如下:
- 认识与支持较多的文件系统,并且可以使用grub的主程序直接在文件系统中查找内核文件名;
- 启动的时候,可以自行编辑与修改启动设置选项;
- 动态查找配置文件,而不需要修改配置文件后重新安装grub,只需要修改/boot/grub/grub.conf里面的设置就行。
1.硬件与分区在grub中的代号
grub对硬盘的识别使用的是这个代号:(hd0,0),硬盘以hd表示,后面接一组数字,第一个查找到的硬盘为0号,第二个为1号,每块硬盘的第一个分区代号为0,依次类推。
2./boot/grub/grub.conf配置文件
先查看我的系统下,该配置文件是什么样子的:
字段释义:
字段 | 说明 |
default=# | 默认启动选项。使用第一个启动菜单(title) |
timeout=# | 指定菜单项等待选项选择的时长 |
splashimage=(hd#,#)/PATH/XPM_FILE | 菜单背景图片文件路径 |
hiddenmenu | 隐藏菜单 |
title TITLE | 定义菜单项“标题”, 可出现多次 |
root (hd#,#) | 查找stage2及kernel文件所在设备分区;为grub的根 |
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] | 启动的内核 |
initrd /PATH/TO/INITRAMFS_FILE | 内核匹配的ramfs文件 |
password [–md5] STRING | 启动菜单编辑认证 |
password [–md5|–encrypted ] STRING | 启动选定的内核或操作系统时进行认证 |
title的前四行是grub的整体设置,主要选项有:
- default=0
这个与title做对照,在配置文件中如有多个title启动的时候就会有几个菜单可以选择,由于grub起始号码为0,因此default=0代表第一个title选项来启动额意思。如果在读秒结束前,没有按键,则系统默认将按照默认0 号title来启动。 - timeout=5
启动进行读秒,如果在5秒内未按任何键,就会使用前面提到的default后面的那个对应的title来启动。这个数值是可以调大,亦可调小。当timeout=0时,代表直接使用default值进行启动而 不读秒,timeout=-1时,代表直接进入菜单不读秒。 - splashimage=(hd0,0)/grub/splash.xpm.gz
提供启动界面,菜单界面的背景图 - hiddenmenu
这个选项是设置启动时是否启动菜单,目前,默认是不启动菜单的,如果想要启动,则把该行用(#)号注释掉即可。 - root
代表内核文件放置在哪个分区,而不是根目录。 - kernel
kernel后面接的是内核文件名,文件名后则接的是内核参数。由于启动过程中需要挂载根目录,因此kernel后面接的是root=LABEL=/1指的是Linux的根目录在哪个分区的意思。 - initrd