Linux系统启动引导流程

这张是Linux公社上的流程图,介绍的很详细了

启动第一步--加载BIOS
当你打开计算机电源,计算机会首先加载BIOS信息,这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了,而这一切都与操作系统无关。

启动第二步--读取MBR
众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

启动第三步--Boot Loader
Boot Loader自举程序就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。
我们以Grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。
系统读取内存中的grub配置信息(一般为menu.lst或grub.conf),并依照此配置信息来启动不同的操作系统。

这里我们打开了grub.conf 这个文件,实际上是它是 /boot/grub/grub.conf 的 软链 , 有郊的内容如下,实际上我改动过了,如下图:

**centos7的grub升级到了grub2 **

主要配置文件是 /boot/grub2/grub.cfg
通常修改的配置文件主要是 /etc/default/grub/etc/grub.d/ 目录

修改完配置后,都需要通过grub2-mkconfig命令下发。
grub2-mkconfig -o /boot/grub2/grub.cfg

GRUB2取代了grub逐渐成为主流,引导菜单启动从/boot自动生成,不是menu.lst手工配置。

Grub2修改内核启动顺序

在CentOS7中,提供了一个软件grubby,可以用来查看grub策略,如下:

grubby --info=ALL 列出所有内核
grubby --default-kernel 列出默认内核
grubby --default-index 列出默认索引
grub2-set-default 1 设置默认启动索引
grub2-mkconfig -o /boot/grub2/grub.cfg 重新下发

给grub2设定密码

grub2-setpassword 设定密码
cat /boot/grub2/user.cfg 查看密码

Grub2磁盘编号的变更

旧版的 grub 不论磁盘还是分区的起始号码都是 0 号,而 grub2 在分区的部分是以 1 开始编号

(hd0,msdos1)第一块磁盘,第一个分区
(hd1,gpt2) 第二块磁盘,第二个分区(GPT格式)


启动第四步--加载内核
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。

启动第五步--用户层init依据inittab文件来设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取他的配置信息/etc/inittab文件,并依据此文件来进行初始化工作。

CentOS 7 已经不支持 /etc/inittab 方式了
新版本的运行级别都定义在 /lib/systemd/system下:
ls -ltr /lib/systemd/system/runlevel*.target
可以针对不同需要设置不同的运行级别:

设置命令行级别(init 3)方法:

ln -svf /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target
ln -svf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
systemctl set-default multi-user.target

设置窗口级别(init 5)方法:

ln -svf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
ln -svf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
systemctl set-default graphical.target

以上每一行都可以设置,CentOS 7 中 systemd 使用链接来指向默认的运行级别
设置前最好删除 rm /etc/systemd/system/default.target

/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式(既图形化界面)
6:重新引导系统,即重启
我们可以在命令行输入  runlevel  的命令可以看到当前的运行等级 格式如下:N   3 ,左边是上次运行等级,右边是现在的运行等级,init命令加上等级,可以直接切换当前运行等级,如init  5 切换至图形界面

在/etc/inittab中,文件格式如下

id:run-levels:action:process

  • id     标识符,一般为2个数字或2个英文
  • run-levels      指定运行等级,可以指定多个,或者不写,代表全部
  • action           指定运行状态
  • process        指定运行的脚本或命令

action常用取值

  • initdefault     :指定系统缺省启动的运行级别
  • sysinit            : 系统启动执行process中指定的指令
  • wait                :执行process中的指令,并等待结束再运行其他命令
  • once               :执行process中的指令,不等待其结束,很少用到
  • crtlaltdel       :按下Crlt + Alt + Del 的process指令
  • powerfail      :当电源出现错误时指定的process指令,不等待其结束
  • powerokwait :当电源恢复时执行的process指令
  • respawn        :一旦process出现中止,请重新运行该指令
[cwj@iZ25bul9p1iZ rc.d]# ls /etc/rc.d/
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit

在我们的这个目录里有这样几个文件,而我们的7个运行等级就是对应的这0-6这6个文件夹,有对应需要动的服务

而这7个文件夹里有我们需要的默认启动需要加载的服务。我们来看看这个文件夹

也很简单,他们全部是软链接文件,对应着/etc/init.d下面的脚本启动方式

其中S开头的代表是需要启动的服务(start的意思) ,K代表需要停止的服务。数字越小越优先启动,系统会分别启动他们。其实想要让系统在启动时不加载他们,只需要更改他们的名字,不让他们按照这样的规范就不会启动了

其实我们可以利用这里的文件达到自启动的目地

ln -s 加入软链接文件      chkconfig  查看和设定启动    ntsysv 可视化设定

启动第六步--init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的脚本够你看几天的

启动第七步--启动内核模块
具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

启动第八步--执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

启动第九步--执行/etc/rc.d/rc.local
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

This script will be executed after all the other init scripts.

You can put your own initialization stuff in here if you don’t

want to do the full Sys V style init stuff.

rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

启动第十步--执行/bin/login程序,进入登录状态

此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。:)

漫长的启动过程结束了,一切都清静了…终于可以使用了

 

2 条评论

发表评论

*