CentOS6 启动流程

    xiaoxiao2023-10-27  173

    CentOS 6启动流程

    文章目录

    CentOS 6启动流程@[toc]启动流程简述启动相关的重要概念POST相关概念主引导记录MBRGRUB简介 启动相关的重要文件initramfs-\$(uname -r).img查看initramfs-\$(uname -r).img文件的内容:生成initramfs-\$(uname -r).img文件的方法 vmlinuz-\$(uname -r)/etc/inittab/etc/rc.d/rc.sysinit/etc/rc.d/目录/etc/rc.d/rc/etc/rc.d/rc#.d/ grub.conf配置文件中各项的含义: 相关文档连接

    启动流程简述

    POST加电自检,加载BIOS的硬件信息,检查各种硬件的情况,如CPU,内存和硬盘等硬件是否都插好,是否存在损坏等 。自检完成后会选择启动顺序,获取第一个启动设备。如:硬盘引导启动、网络引导启动、光盘引导启动等,一般选择使用硬盘引导启动,若硬盘无法引导启动则会自动选择后续的可用设备启动引导。启动引导设备也可以通过设置BISO程序的方式进行人为指定。MBR引导或GPT引导,具体使用哪种引导方式取决于硬盘使用的分区类型,但不管使用的是哪种引导方式原理都是相同的。这里以传统的MBR分区类型进行简单的举例说明,MBR引导主要依靠磁盘第一个扇区的前446个字节中的引导加载器boot loader来实现,通过boot loader查找并加载次引导加载程序。GRUB引导阶段, 此阶段通过GRUB 1.5 stage加载/boot所在分区的文件系统驱动,将/boot所在分区作为根分区来进行挂载。当GRUB 1.5 stage的引导加载程序被加载并运行时,GRUB 2 stage的引导加载程序就可以进行加载了,GRUB 2 stage会通过grub.conf文件将内核文件和initramfs文件加载至内存中,进行内核自身的解压和初始化。内核引导过程,内核会在这一过程中借助于ramdisk(initramfs)完成自身的初始化,initramfs是一个辅助的伪根系统,放置了和启动相关的一些核心文件和驱动,在内核引导过程中会将其模拟为一块磁盘进行临时挂载,获取其中的文件,将其当做一个临时的根文件系统使用,实现内核引导。此过程中内核会探测可识别到的所有硬件设备,并加载硬件驱动程序,如:挂载真正根分区需要的ext4文件系统的驱动,就是通过initramfs获得的。而后,内核通过chroot的方式以只读形式挂载真正的根文件系统,运行用户空间的第一个应用程序/sbin/init。Init初始化过程,启动init进程,读取/etc/inittab文件和/etc/init/目录下的文件,执行/etc/rc.d/目录下的脚本文件初始化系统环境,启动需要开机自启的服务,执行/bin/login程序,进入登录状态。

    Linux引导过程在20,000英尺处的视图:

    Init初始化过程:


    启动相关的重要概念

    POST相关概念

    POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。

    BIOS :Basic Input and Output System,基本输入输出系统,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。

    CMOS:Complementary Metal Oxide Semiconductor,互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备。

    BIOS与CMOS的关系 CMOS是计算机上另一个重要的存储器。之所以提到它,是因为BIOS程序的设置结果就保存在CMOS中。而且,在BIOS程序引导计算机启动后,计算机需要载入CMOS中的用户信息和常规设置后才能正常使用。UEFI系统则多用NVRAM存储设置。

    BIOS与CMOS的区别 二者的区别是,BIOS是存储在只读记忆体(EEPROM),而CMOS为随机存储器(RAM);BIOS中存储的是程序,而CMOS中存储的是普通信息。

    EEPROM即是我们常用的U盘和各类存储卡,因此我们可以更新BIOS,其内容亦能在断电后保存。

    CMOS RAM的内容在断电会消失。所以,把主板的电池拆出,便可重置其内容。另外,拆出电池也会重置时间。

    主引导记录MBR

    主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区。MBR总共有512个字节,其中前446个字节主要用来放置和启动相关的一段程序boot loader,是GRUB的1 stage。其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志位55aa。

    通过hexdump命令可以查看到MBR的内容:

    # hexdump -C -n 512 /dev/sda #通过十六进制+ASCII码的形式显示磁盘的前512字节

    MBR剖析图:

    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/目录中的文件,需要进入boot分区后才能进行读取,包含了挂载根分区的重要信息。

    使用rpm -qi grub命令可以查看到CentOS 6系统中安装的GRUB程序的软件信息,可以看到Version是0.97。


    启动相关的重要文件

    initramfs-$(uname -r).img

    ramdisk是一个伪根文件系统,主要用于帮助内核完成自身初始化、加载驱动程序挂载根分区,到此便可以被卸载掉了。而ramdisk便是boot目录中initramfs-$(uname -r).img文件,这是一个gzip的压缩文件,存放了一些和启动相关的文件和驱动,是系统启动过程中的核心文件之一。

    查看initramfs-$(uname -r).img文件的内容:
    //方法一 # lsinitrd /boot/initramfs-2.6.32-696.el6.x86_64.img //方法二 #cp /boot/initramfs-2.6.32-696.el6.x86_64.img /tmp/ #file /boot/initramfs-2.6.32-696.el6.x86_64.img #可以看下此文件的类型是GZIP的 #mv initramfs-2.6.32-696.el6.x86_64.img initramfs-2.6.32-696.el6.x86_64.img.gz #压缩工具一般都挑后缀,要改一下文件名 #gzip -d initramfs-2.6.32-696.el6.x86_64.img.gz #ll -h ./initramfs-2.6.32-696.el6.x86_64.img /boot/initramfs-2.6.32-696.el6.x86_64.img #解压之后文件是变大了的 #file ./initramfs-2.6.32-696.el6.x86_64.img #此时再来观察一下文件类型的变化,会发现文件类型变为了cpio; #cpio -id < initramfs-2.6.32-696.el6.x86_64.img #解压cpio文件的方法 #tree -L 1 #查看解压后生成的文件 . ├── bin ├── dev ├── etc ├── init ├── lib ...此处省略部分内容... ├── lib64 ├── sbin ├── sys ├── sysroot ├── tmp ├── usr └── var
    生成initramfs-$(uname -r).img文件的方法

    生成ramdisk文件的命令有两个可以选择,mkinitrd和dracut,mkinitrd命令是一个脚本,调用了dracut命令。

    #为当前正在使用的内核重新制作ramdisk文件 #mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 或 #dracut /boot/initramfs-$(uname-r).img $(uname-r)

    vmlinuz-$(uname -r)

    vmlinuz文件是一个可引导的,压缩的Linux内核,包含了Linux kernel的核心功能模块。内核在编译的时候为了实现精简,只将必要的功能模块打包到了内核文件之中,所以这个文件看起来并不是很大,一些非核心模块一般放置在/lib/modules/目录下。

    /etc/inittab

    此文件用于设置系统的运行级别,共0-6七个级别,默认级别一般设置为3或5,0或6不建议设置为默认运行级别,会循环重启或者关机。

    0:关机1:单用户模式(root自动登录),single,维护模式2:多用户模式,启动网络功能,但不会启动NFS,维护模式3:多用户模式,正常模式,字符界面4:预留级别,同3级别类似5:多用户模式,正常模式,图形界面6:重启 #cat /etc/inittab ...此处省去部分内容... id:3:initdefault:

    /etc/rc.d/rc.sysinit

    这是启动过程中一个初始化的脚本,主要作用如下:

    设置主机名

    设置欢迎信息

    激活udev和selinux

    挂载/etc/fstab文件中定义的文件系统

    检测根文件系统,并以读写方式重新挂载根文件系统

    设置系统时钟

    激活swap设备

    根据/etc/sysctl.conf文件设置内核参数

    激活lvm及software raid设备

    加载额外设备的驱动程序

    清理操作

    /etc/rc.d/目录

    /etc/rc.d/rc

    这是一个脚本文件,负责在运行级别发生更改时启动/停止服务。

    /etc/rc.d/rc#.d/

    /etc/rc.d/rc#.d/目录中包含了启动过程中需要启动的服务,#代表运行级别,以K开头的服务,数字越小,越先关闭;数字越小的服务,通常会依赖到别的服务;以S开头的服务,数字越小,越先运行;数字越小的服务,通常会被其它服务所依赖到;

    grub.conf

    配置文件中各项的含义:

    default=0

    如果安装了多个操作系统,这一项的值可以定义启动时默认引导的操作系统,0对应的是下文中的第一个title定义的启动项。

    timeout=5 启动等待时间。

    splashimage=(hd0,0)/grub/splash.xpm.gz 启动菜单背景图片的位置

    password

    在配置文件中没有明确写明,但可以通过在文件中两处不同位置添加password字段实现不同的加密效果。示例:password centos

    1.password字段添加在title字段之上,设置编辑grub启动菜单的口令,若想编辑启动菜单需要先输入p字母后,输入正确的口令才能进行编辑。

    2.password字段添加在配置文件尾部,设置启动操作系统的口令,只有输入正确的口令系统才会正常启动。

    补充:为启动菜单设置密码,明文密码并不安全,建议使用加密算法加密。

    示例:

    password --md5 1 1 1xxxxxxxxxxxxxx #MD5密文使用grub-md5-crypt生成 password --encrypted 6 6 6xxxxxxxxxxxxxx #sha512密文使用grub-crypt生成

    加密算法的设置方法: 打开vim编辑器的扩展命令模式,:后输入r!grub-md5-crypt,回车,输入口令,再回车,再次输入口令,回车后密码会自动写入到编辑器光标的所在位置。

    hiddenmenu 作用是隐藏启动选项菜单,默认是不显示启动选项菜单的,只有在开机时敲任意键才会显示。 title CentOS 6 (2.6.32-696.el6.x86_64) 定义启动菜单启动项的名称。

    root (hd0,0)

    定义启动时根分区所在硬盘和分区对应磁盘的位置,这里的根指的是/boot,是由grub的独特语法决定的。hd是hard disk的缩写,这段的含义是根分区在第一块硬盘的第一个分区。hd0,0的位置对应的是磁盘boot分区的位置,所以在启动的时候是先将boot分区来做为根分区进行挂载的。

    kernel /vmlinuz-2.6.32-696.el6.x86_64

    定义了内核文件相对于根分区的绝对路径,如果在安装操作系统时没有给/boot划分独立分区,则需写成/boot/vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2。

    ro root=UUID=58991581-5bce-43b0-8ffa-4cb3dd70574c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

    这一段内容定义的是内核的参数信息,可以使用cat /proc/cmdline命令查看。

    ro以只读方式进行挂载,但进入操作系统之后并不是只读的状态,所以后续还会重新挂载一次,选择以只读的方式进行挂载完全是出于安全的考虑。

    root=UUID=58991581-5bce-43b0-8ffa-4cb3dd70574c,真正根分区对应磁盘分区的UUID,通过这一行去找要挂载的根分区位置,也可以写成绝对路径/dev/sda2。

    rhgb这个字段的作用是启动时产生转圈圈的动画,虽然看着好看,但会隐藏服务的启动流程。建议删除掉,删除后可以看到服务的启动过程,系统出问题有助于排错。不删除的话,只有按Esc键,才会露出这个界面。 quiet这个字段的作用是默认隐藏内核的启动过程,删除此字符可以看到内核的加载过程信息。

    initrd /initramfs-2.6.32-696.el6.x86_64.img

    定义ramdisk文件相对于根分区的绝对路径,如果在安装操作系统时没有给/boot划分独立分区,则需写成/boot/initramfs-2.6.32-696.el6.x86_64.img

    Note:因为只有在加载内核后才能知道谁是操作系统的根,才能知道该加载那种文件系统,所以initrd /initramfs-2.6.32-696.el6.x86_64.img 和kernel /vmlinuz-2.6.32-696.el6.x86_64的顺序不能对调,对调会导致无法启动。


    相关文档连接

    # man 7 boot
    最新回复(0)