linux centos系统开机启动流程

时间:2022-07-22
本文章向大家介绍linux centos系统开机启动流程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 系统启动总体流程:

        任何系统启动的第一步都是加电,也就是按下电源,然后计算机硬件会主动读取BIOS来加载硬件设备信息以及硬件设备的自我检测,之后系统会主动地读取第一个有引导程序的设备,该引导程序可以指定使用哪个内核来启动,并将其加载至内存当中运行,同时内核还要加载其他硬件设备以及对应的驱动程序,来使主机各个组件开始运行,等所有硬件设备加载完成之后,系统就真正启动来了,然后系统会操作一些外部程序开始准备软件的运行环境。之后加载一些系统运行所需要的软件程序。最后一步就是等待用户的登陆。

启动第一步—加电自检

  当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。

启动第二步—选择启动顺序,加载MBR

        BIOS决定了第一启动项是哪个设备,(默认为硬盘)硬盘的MBR前446字节称为Boot Loader,Boot Loader的主要功能就是去识别加载操作系统中的核心文件,并提交到内存中运行进而启动操作系统。当我们安装操作系统的时候,它会将其Boot Loader安装在MBR的前446字节一份,同时也会安装在对应分区的启动扇区上都安装一份Boot Loader。Boot Loader 的另一个主要功能是提供菜单,并将其启动管理功能转交给其他的加载程序

        MBR是由硬盘启动时,BIOS通常是转向第一块硬盘的第一个扇区,即MBR。它所做的唯一的事情就是装载第二引导装载程序GRUB,而它的作用实际上是引出更高级的功能,以允许用户装载一个特定的操作系统。

       BIOS自检后,就会将MBR 加载进内存。也就意味着引导程序被激活,分区表信息已经加载到内存,同时也意味着对系统的控制权从BIOS过渡到GRUB.GRUB是GRand Unified Bootloader的缩写。它是一个多重操作系统启动管理器。用来引导不同系统。GRUB是一个系统引导程序,分为三个阶段:

   stage1阶段完成最基本的引导功能,同时判定你的分区是什么文件系统,

   stage1.5就是加载这个文件系统,stage根据文件系统的不同,分为很多个stage1.5,也就是说stage1.5阶段的目的是加载文件的驱动,

   stage2阶段,我们可以访问boot目录所对应的分区,从而可以访问boot下的文件叫grub.conf,

细说grub.conf文件

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=d98fccb0-b74e-4de3-9953-27b74542267a 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
        initrd /initramfs-2.6.32-696.el6.x86_64.img
~                                                    

我们是通过硬件中断来访问grub.conf文件,这个时候在grub.conf文件里面我们还没有任何的挂载行为,我们只能通过硬件中断,去访问到对应的文件,是通过上述的(hd0,0)来访问的,并不是通过文件的路径来访问的 .vim /boot/grub/grub.conf    root (hd0,0)在这一步我们指定了文件的根,这个跟并不是操作系统未来的根,(我们操作系统完整的根是sda2)是临时的根而是为下面,kernel以及initrd在这个根下被找到,因此这个(hd0,0)是为了存放内核以及映像文件了,因此下面我们就可以通过路径而不是硬件中断了。   kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=234f756b-b613-425b-af46-269c7cafd100 rhgb(图形化界面进度条,没有它是字符界面启动,) quiet(没有它会把内核加载的模块和信息一块加载出来,有它会屏蔽到这些) initrd /initramfs-2.6.32-696.el6.x86_64.img(虚拟磁盘映像文件,因为要有更多的驱动需要来加载,显卡,声卡等等)

启动内核

     当stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。

关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。

      Linux内核需要适应多种不同的硬件架构,但是将所有的硬件驱动编入内核又是不实际的,而且内核也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上Linux的内核镜像仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd 。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。这里有必要给大家再多介绍一下initrd这个东东:

       initrd 的英文含义是 bootloader initialized RAM disk,就是由 boot loader 初始化的内存盘。在内核启动前,Boot Loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的init,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。

      另外一个概念:initramfs

       initramfs 是在 kernel 2.5中引入的技术,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个 cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。

通过上的分析和我们的验证,我们确实得到了这样的结论:

         grub的stage2将initrd加载到内存里,让后将其中的内容释放到内容中,内核便去执行initrd中的init脚本,这时内核将控制权交给了init文件处理。我们简单浏览一下init脚本的内容,发现它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

启动第四步—启动用户空间第一个执行程序 /sbin/init

1)、执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动

当/etc/rc.d/rc.sysinit执行完后,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,因此便会执行下面的脚本。

2)、执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件。

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc*.d ->/etc/rc.d/rc*.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

也就是说,/etc目录下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目录下相应文件和文件夹的符号链接。我们以启动级别3为例来简要说明一下。

/etc/rc.d/rc3.d目录,该目录下的内容全部都是以 S 或 K 开头的链接文件,都链接到"/etc/rc.d/init.d"目录下的各种shell脚本。S表示的是启动时需要start的服务内容,K表示关机时需要关闭的服务内容。/etc/rc.d/rc*.d中的系统服务会在系统后台启动,如果要对某个运行级别中的服务进行更具体的定制,通过chkconfig命令来操作,或者通过setup、ntsys、system-config-services来进行定制。如果我们需要自己增加启动的内容,可以在init.d目录中增加相关的shell脚本,然后在rc*.d目录中建立链接文件指向该shell脚本。这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,数字越小的脚本越先执行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先执行。

3)、执行用户自定义引导程序/etc/rc.d/rc.local。其实当执行/etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.local。S99local是指向rc.local的符号链接。就是一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。

4)、完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。

到此,系统就启动完毕了!