Linux的启动流程

一、centos6的启动流程

 

第一步:开启开机按钮,计算机加载BIOS自检。

打开计算机电源,计算机首先会加载BIOS信息,进而对CPU信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等进行自检。当正确检查完所有硬件信息后,计算机就会根据BIOS里的设置去读取相应的启动系统里的硬件设备,如果预先设定了从硬盘启动加载系统,那么BIOS就会读取硬盘的MBR(即0磁道0柱面1扇区的前446字节),接下来才开始加载内核文件,然后交由Linux来控制系统运行。

第二步:读取MBR信息。

MBR全称为Master Boot Record,中文的意思是主引导记录,它位于磁盘上的0柱面0磁道1扇区,整个大小是512字节,MBR里面存放了系统预启动信息、分区表信息及分区标志等。
在MBR的512字节中,第一部分为引导记录区,占有前446字节大小,其作用是找到标记为活动的分区,并将活动分区的引导记录读入内存。
第二部分为分区表,占有后面剩下全部的66字节大小,用于记录磁盘的分区信息,这其中,前64字节是磁盘分区表信息,后2字节是分区的结束标志"AA"。
计算机读取BIOS所指定的磁盘MBR信息之后,就会将其读入到内存中。被读入到内存中执行的其实就是Boot Loader(引导加载程序),对应于Linux系统,就是加载Grub信息。

第三步:加载Grub菜单(Boot Loader,引导加载程序)。

引导加载程序(Boot Loader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境加载到一个适合的状态,以便为最终调用操作系统内核做好准备。通常,引导加载的程序依赖于硬件实现,早期的Linux系统常见的引导加载程序包含2种,即Grub和Lilo,现如今Grub已经成为了主流(类似于Windows下的boot.ini引导文件)。

引导加载程序读取grub.conf文件的配置信息,然后根据对应的配置信息来启动不同的操作系统,grub.conf的配置信息及详解如下所示:

[root@node1 boot]# cat /etc/grub.conf #<==也可读取/boot/grub/menu.lst或/boot/grub/grub.conf。
                         
...此处省略多行注释信息,其实这里的注释已经解释得很清楚了,只是90%的初学者不会看这里...
default=0 #<==默认情况下如何加载系统,0表示加载菜单中对应的第一个名字,多系统时可以调节默认加载项。
         
timeout=5 #<==表示多少秒之后开始加载默认的系统,为管理员提前选择留出时间。
splashimage=(hd0,0)/grub/splash.xpm.gz  #<==启动时显示的背景图标,(hd0,0)代表/boot分区。
                                             
hiddenmenu  #<==系统启动时,会隐藏启动菜单信息,按默认设置即可启动系统,除非用户按键干预。
password [–md5|–encrypted ] STRING      #<==编辑Grub菜单时需要认证,Linux优化之一,默认为没有。
                                            
title CentOS 6 (2.6.32-696.el6.x86_64)  #<==要启动的系统对应的项目名称,可按需修改。
root (hd0,0)  #<==引导内核文件和内核所需驱动文件所在的分区,(hd0,0)代表/boot分区。
              #<==其中hd0表示计算机的第一块磁盘,(hd0,0)中逗号后面的0表示第一个分区,即(hd0,0)表示第一块磁盘的第一个分区,即/dev/sda1(分区通常是最先独立分出的/boot分区,对应的设备名就是sda1)。
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 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  #<==位于boot分区上的内核文件,及一堆可选内核参数。
            #<==/vmlinuz-2.6.32-696.el6.x86_64为内核文件。root=UUID=后面一串数字表示根对应的设备信息(/dev/sda3),其他介绍的作用不大,忽略即可。
initrd /initramfs-2.6.32-696.el6.x86_64.img  #<==内核启动所需的驱动文件的所在地,存在于boot区。

第四步:加载kernel内核以及驱动程序。

根据Grub设定的内核映像所在的路径,系统会读取内存映像,并进行解压缩操作。完成解压缩内核之后,屏幕会输出“OK,booting the kernel”的信息。其实就是根据grub.conf中的如下设置加载内核及相关参数:

kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 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

第五步:启动init进程,读取inittab文件。

加载完内核的相关文件以后,系统第一个运行的程序为/sbin/init,因此,init进程对应的进程号永远为1,相当于是所有Linux进程的祖先。
此时init程序会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实CentOS6以来的/etc/inittab文件最主要的作用就是设定了Linux以什么样的运行等级启动,其设定配置是“id3:initdefault:”,其中的3就是表明Linux需要运行在3级别上。

第六步:init进程执行rc.sysinit初始化系统。

init进程会根据inittab的设置加载/etc/rc.d/rc.sysinit,并进行初始化,系统设置包括但不限于如下内容。
设置主机名、设置欢迎信息、激活udev和selinux、加载/etc/fstab(挂载磁盘设备等)、设置系统时钟、读取/etc/sysctl.conf设置内核参数、激活lvm及software raid设备、加载额外设备的驱动程序、各种清理操作(如清理日志)等。

#注意:CentOS6以后,init进程不再读取inittab加载/etc/rc.d/rc.sysinit了,而是读取/etc/init/rcS.conf文件加载/etc/rc.d/rc.sysinit,并对系统进行初始化系统设置

第七步:init进程加载内核相关模块。

CentOS5下是读取/etc/modules.conf文件或/etc/modules.d目录下的文件来加载内核模块,而在CentOS6下则是加载/etc/sysconfig/modules/下的内核模块。

第八步:init进程执行对应运行级别下的脚本。

根据系统设定运行级别的不同,系统会运行rc0.d到rc6.d中的相应脚本程序,从而完成相应的初始化工作,以及启动相应的服务。
#注意:需要特别说明的是,在CentOS6以后的版本中,init进程不再读取inittab加载运行级别对应的脚本了,而是读取/etc/init/rc.conf加载指定运行级别下的脚本

第九步:加载/etc/rc.local。

rc.local就是在系统做好一切初始化工作之后,留给管理员自主设置的一个文件。可以将需要跟随计算机启动的程序启动命令放置到这里。

第十步:启动mingetty,进入登录前的状态。

系统读取/etc/init/tty.conf(早期也是读取inittab进行设置的),设置对应运行级别的终端,启动mingetty,进入登录前的状态

二、centos7的启动流程

 

CentOS7和CentOS6的启动流程绝大部分还是相同的,但也有一些小区别,例如,CentOS6下第一个启动的init进程被改为systemd(并行启动模式),前四步与CentOS6启动流程的描述一致。

第一步:开启开机按钮,计算机加载BIOS自检。

第二步:读取MBR信息。

第三步:加载Grub菜单(Boot Loader,引导加载程序)。

第四步:加载kernel内核以及驱动程序。

第五步:启动systemd进程,加载如下文件。

1)执行initrd.target(/usr/lib/systemd/system/initrd.target)包含挂载/etc/fstab文件中的文件系统。
2)systemd执行默认的target配置。
CentOS7已经淡化了CentOS6的运行级别概念,但是为了兼容6以前的用户习惯,仍然以运行级别文件来进行标记,并且每个运行级别文件都有相应的软连接指向,默认的启动文件是/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。
早期的7种运行级别对应于5个启动模式:
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target

3)systemd执行sysinit.target,初始化系统及加载basic.target准备启动系统。
4)systemd启动multi-user.target(生产工作模式)下的服务程序,即开机自启动的程序,程序目录为/etc/systemd/system和/usr/lib/systemd/system。
5)systemd执行multi-user.target下的/etc/rc.d/rc.local内容。
6)systemd执行multi-user.target下的getty.target及登录服务。
7)systemd执行graphical所需要的服务(如果安装了图形桌面功能)。

 

posted @ 2020-09-23 19:50  yaowx  阅读(384)  评论(0编辑  收藏  举报