RHEL6启动流程
1.post 加电自检
这个过程是开机后,BIOS 或 UEFI 进行硬件检查的阶段
2.MBR 引导
自检硬件没有问题时候,这里以 BIOS 为例,BIOS 将会直接去找硬盘的第一个扇区,找到前 446 字节,将 MBR 加
载到内存中,MBR 将告诉程序下一阶段去哪里找系统 grub 引导。此阶段属于 grub 的第一阶段。grub 还有 1.5 阶
段和 2 阶段。
3.GRUB 引导
grub 第 1.5 和 2 阶段,信息默认存放在扇区中,如果使用 grub-install 生成的 2 阶段的文件是存放在/boot 分区中的。
为了加载内核系统,不得不加载/boot 分区,而加载/boot 分区,需要有/boot 分区的驱动,/boot 分区驱动是放在
/boot 分区中的,啊,我们好像进入了死循环了,Linux 是怎么解决的呢?就是靠放在 1.5 阶段中的数据,是放在第一
个扇区后的后续扇区中,具体占用多少字节,不太清楚,只知道 1.5 阶段和 2 阶段总共 27 个扇区。
stage1.5:
mbr 之后的扇区,识别 stage2 所在的分区上的文件系统
stage2:
开机启动的时候看到的 Grub 选项、信息,还有修改 GRUB 背景等功能都是 stage2 提供的,stage2 会去读入
/boot/grub/grub.conf 或者 menu.lst 等配置文件
4.读取 grub.conf 文件
读取 grub.conf 文件以确定内核启动的参数,准备启动内核
5.启动内核
加载内核,核心开始解压缩,启动一些最核心的程序。
因为为了让内核足够轻小,硬件驱动并没有放在内核文件里面,我们可以看到内核很小,才 4M 左右,我们可以想象
Windows 中的驱动,安装系统时候还需要使用驱动软件下载好长时间呢
因此需要使用/initramfs-2.6.32-696.el6.x86_64.img 来驱动硬件
6.加载伪文件系统(ramdisk)
内核已将启动起来了,再调用 ramdisk 文件,尝试驱动所有的硬件设备,到这一步,内核起来了,所有驱动也装上
了,因此后面的启动就可以交给程序了
7.启动 init 进程
grub 中默认指定 init=/sbin/init 程序,可以在 grub.conf 中 kernel 行自定义执行程序 init=/bin/bash,此时可以绕过下
面步骤直接进入 bash 界面。
内核源代码文件中显示 996 行左右,规定了 init 启动的顺序,/sbin/init->/etc/init->/bin/init->/bin/sh,/bin/bash 没
有写,应该是和/bin/sh 一样吧
(1)读取/etc/inittab 文件
inittab 文件里面定义了系统默认运行级别,这一步做了一些工作如下:
a)初始运行级别(RUN LEVEL)
b)系统初始化脚本
c)对应运行级别的脚本目录
d)定义 UPS 电源终端/恢复脚本
e)在虚拟控制台生成 getty,以生成终端
f)在运行级别 5 初始化 X
(2)执行/etc/rc.d/rc.sysinit 程序
系统初始化一些脚本,主要完成以下工作
a)设置主机名
b)设置欢迎信息
c)激活 udev 和 selinux 可以在 grub.conf 中,kernel 行添加 selinux=0 以关闭 selinux
d)挂载/etc/fstab 文件中定义的文件系统
e)检测根文件系统,并以读写方式重新挂载根文件系统
f)设置系统时钟
g)激活 swap 设备
h)根据/etc/sysctl.conf 文件设置内核参数
i)激活 lvm 及 software raid 设备
j)加载额外设备的驱动程序
k)清理操作
(3)/etc/rc#.d/文件(各种服务)
里面定义的是各种服务的启动脚本,可以 ls 查看,S 开头代表开机启动的服务,K 开头的是关机要执行的任务。#代
表数字,一个数字代表一个运行级别,共 7 个运行级别,这里就不多说了
(4)/etc/rc.d/rc.local 文件
这里面可以自定义开机启动的命令。
8.执行/bin/login
执行/bin/login 程序,等待用户登录
**重要:面试回答
(1).开机 BIOS 自检,加载硬盘
(2).读取 MBR,MBR 引导
(3).grub 引导菜单(boot loader)
(4).加载内核 kernel
(5).启动 init 进程,依据 inittab 文件设定运行级别
(6).init 进程,执行 rc.sysinit 文件
(7).启动内核模块。执行不同级别的脚本程序
(8).执行/etc/rc.d/rc.local
(9).启动 mingetty,进入系统登录界面