文章目录
- 前言
- 经典启动流程
- 1 按下电源
- 2 开机自检(BIOS)
- 3 MBR引导
- 4 GRUB菜单
- 5 加载内核
- 6 运行init进程
- 7 读取/etc/inittab
- 8 读取/etc/rc.sysinit初始化系统
- 9 运行/etc/rc.d/rcN.d/脚本
- 10 /etc/rc.local
- 11 登录页面login
- centos7与centos6
前言
Linux系统的启动过程并不是大家想象中的那么简单,其过程可以分为多个阶段:
通电 –> BIOS –> 主引导记录(MBR)–> grub引导 –> 加载内核 –> init进程 –> 读取/etc/inittab(运行级别)–> /etc/init.d –> 用户登录 –> Login shell
经典启动流程
以centos6为例,具体启动过程如下图所示:
1 按下电源
这是第一步。默认情况下,也只需这一步,服务器会按照预定程序完成后续开机工作。
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
2 开机自检(BIOS)
通电后,服务器开机自检,包括硬盘内存等硬件设备。最后按照BIOS中设置的启动设备(通常是硬盘)来启动。
UEFI是新的主板引导模式,被看做是BIOS的继任者。
3 MBR引导
众所周知,硬盘上第 0 磁道第一个扇区被称为 MBR,也就是 Master Boot Record,即主引导记录,它的大小是 512 字节,存放了预启动信息、分区表信息。
系统找到 BIOS 所指定的硬盘的 MBR 后,就会将其复制到 0x7c00 地址所在的物理内存中。其实被复制到物理内存的内容就是 “引导加载器(Boot Loader)”,而具体到服务器,那就是下一步的grub了。
GPT是另一种分区表(数据存储结构),比MBR能保存更多分区等。注意,主板引导与磁盘分区表必须一致:
BIOS -> MBR
UEFI -> GPT
4 GRUB菜单
grub是一个小程序,负责引导加载系统。开机时会显示普通模式(默认)和rescue救援模式。通俗讲,有双系统时选择进入windows还是linux。
grub2配置文件位于/boot/grub2/grub.cfg中,由grub2 mkconfig使用/etc/grub.d中的模板和/etc/default/grub中的设置自动生成。
5 加载内核
grub选择操作系统后,os接管硬件,便加载 /boot 目录下的内核文件到内存里。boot目录内核文件包括:
$ ls /boot
config-3.2.0-3-amd64
config-3.2.0-4-amd64
grub
initrd.img-3.2.0-3-amd64
initrd.img-3.2.0-4-amd64
System.map-3.2.0-3-amd64
System.map-3.2.0-4-amd64
vmlinuz-3.2.0-3-amd64
vmlinuz-3.2.0-4-amd64
6 运行init进程
init进程是系统所有进程的起点,它的进程号是1。init进程是所有进程的发起者和控制者,即所有其它进程的父进程,所以永远不会被终止。
如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。
7 读取/etc/inittab
init的第二大作用,就是读取/etc/inittab,使得在进入某个特定的运行级别(Runlevel)时启动相应的程序。
Linux系统有7个运行级别(runlevel):
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
- 运行级别2:多用户状态(没有NFS)
- 运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登录后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
8 读取/etc/rc.sysinit初始化系统
rc.sysinit是每一个运行级别都要首先运行的重要脚本,根据该脚本文件执行相应的系统初始化。
它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块,设置键盘、字体, 装载模块,设置网络等等以及其它一些需要优先执行任务。
9 运行/etc/rc.d/rcN.d/脚本
当运行级别为5,则系统会加载位置/etc/rc.d/rc5.d目录里的所有开机脚本。以此类推,不同运行级别运行不同目录的脚本。
/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
10 /etc/rc.local
执行用户自定义的开机启动程序,/etc/rc.local是一个shell脚本文件,将其赋予可执行文件,才能发挥作用。
zookeeper注册中心服务器开机自启动:
echo '/apps/zookeeper/bin/zkServer.sh start' >> /etc/rc.local
chmod +x /etc/rc.d/rc.local
11 登录页面login
系统运行mingetty程序显示登录页面,再执行/bin/login程序,用户输入账号密码信息将作为参数传给login程序来验证身份。
对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。
对于运行级别为3的命令行方式用户来说,显示的是字符登录界面。当然,两种运行级别都可以通过ssh进行远程登录。
centos7与centos6
centos7与centos6启动略有不同,最大区别为centos7的系统第一个进程pid1为systemd程序,而centos6是init程序。
正如经典启动流程所示,从运行init进程往后红色部分为cento6特有。往前开机顺序是相似的。
两者开机启动流程的具体过程如下图: