CentOS6详细启动流程

一、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个等级。

级别说明
0halt(系统直接关机)
1single user mode(单用户维护模式,用在系统出问题时的维护)
2Multi-user,without NFS(类似runlevel3,启动网络功能,但无NFS服务)
3Full multi-user mode(完整拥有网络功能的纯文本模式)
4unused(系统保留功能)
5多用户模式,图形界面
6reboot(重启)

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主要来设置系统环境,主要工作大抵有几项:

  1. 取得网络环境与主机类型:
    读取网络配置文件/etc/sysconfig/network,取得主机名与默认网关(gateway)等网络环境。
  2. 测试与挂载内存设备/proc及USB设备/sys。
  3. 决定是否启动SELinux:
    SELinux会在这个时候进行检测,检测是否需要帮所有的文件重新编写标准的SELinux类型。
  4. 启动系统的随机数生成器、
  5. 设置终端(console)字体。
  6. 设置显示于启动过程中的欢迎界面(textbanner)。
  7. 设置系统时间(colok)与时区设置:需读入/etc/sysconfig/clock设置值。
  8. 用户自定义模块的加载:
    用户可以在/etc/sysconfig/modules/*.modules中加入自定义的模块,此时会被加载到系统当中。
  9. 加载内核相关设置:
    系统会主动读取/etc/sysctl.conf这个文件的设置值。
  10. 设置主机名和初始化电源管理模块(ACPI)。
  11. 初始化软件磁盘阵列:主要通过/etc/mdadm.conf来设置。
  12. 初始化LVM的文件系统功能。
  13. 以fsck检测磁盘文件系统。
  14. 进行磁盘配额quota的转换(非必要)。
  15. 重新以可读写模式挂载系统磁盘。
  16. 启动quota功能。
  17. 启动系统伪随机数生成器。
  18. 清除启动过程中生成 临时文件。
  19. 将启动的相关信息加载到/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
    RAM Disk文件名

参考文献:
《鸟哥的Linux私房菜 基础学习篇》 第三版

以上内容,如有错误,欢迎评论指正错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值