【linux】循序渐进学运维-基础篇-Linux系统启动原理

大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-基础篇的第59篇文章

文章目录


前言

七月新秋风露早,今天我们一起聊聊Linux启动过程及相关的配置文件。 我们以centos6为例,一起来研究一下它的启动过程

centos 6的启动过程

centos6的启动过程,包含以下几个部分

  1. 加载BIOS硬件信息
  2. grub引导
  3. 加载kernel
  4. 加载init进程
  5. 读取/etc/inittab配置文件
  6. 执行 /etc/rc.d/rc.sysinit脚本
  7. 执行/etc/rc.d/rc脚本
  8. 启动mingetty进程,等待用户登录系统
1. 加载BIOS硬件信息
a) 通电自检

系统通电之后,主板的BOIS 运行POST(Power on self test)代码,检测系统外围的一些设备,比如: cpu,内存,显卡,IO,键盘鼠标等。

b) MBR引导

检测通过后,根据BIOS里boot设置的(光驱,硬盘,网盘)启动顺序,搜索相应的启动驱动器,并获取第一个启动设备的代号。读取第一个启动设备的MBR的引导加载程序(lilo,grub,spfdisk)启动信息,从MBR中加载启动引导管理器(grub),并运行该启动引导管理,进入grub启动引导阶段。

注意: MBR引导记录: 用于引导磁盘空间小于2T的空间
GPT引导记录: 用于引导磁盘空间大于2T的空间

2. grub引导

所谓的grub引导,就是读取MBR的boot Loader

MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)

备注: 为什么MBR分区表,只能分四个主分区?

注:磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成:

第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。

第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,164=64字节。为分区项1、分区项2、分区项3、分区项4。64字节只存4个分区表。
第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
所以:16
4+446+2=512

3. 加载(内核)kernel

依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;

4. 加载init进程

在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息;
init是执行的第一个程序,所以他的进程编号pid =1 ,其他的进程都是从它衍生出来的,都是它的子进程。
前面我们有提到过,对于孤儿进程,一般是送到init进程来处理。

5. 读取/etc/inittab配置文件

init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区主机名,selinux等);

6. 执行 /etc/rc.d/rc.sysinit脚本

init 执行 run-level 下各个服务并启动 (script 方式);

脚本的内容是:

  • 获取网络环境和主机类型
  • 测试挂载/proc /sys /usb 等装置
  • 决定是否启动selinux
  • 周边设备的侦测
  • 读取.etc.sysctl.conf 档案中的设定值
  • 设定系统时间
  • 设定终端字形
  • 设定RAID,LVM功能
  • 使用fsck检测文件系统
  • 清除开机中的暂存档案 将开机相关信息载入/var/log/dmesg档案中
7. 执行/etc/rc.d/rc脚本

init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
这个脚本主要是一些自动以的开机启动程序,如果你想开启时启动什么内容,可以在里面写
【linux】循序渐进学运维-基础篇-Linux系统启动原理

可以看到这里创建了一个 /var/lock/subsys/local 这个文件的创建只是为了证明rc.local 这个脚本已经执行过了,目的在于避免这个脚本重复执行。

在系统里会有一个star()的函数来判断文件是否已经创建,如果已经创建,后面读取的时候就不会在去重建,避免系统重复启动。

8. 启动mingetty进程,等待用户登录系统

所有的服务都运行成功后,接下来进入登录用户系统的操作, 返回init , 这时候初始环境都已经配好了, init 打开虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入

虚拟终端由 mingetty程序产生的:
语法:
mingetty [–long-hostname][–noclear][tty]

【linux】循序渐进学运维-基础篇-Linux系统启动原理

9. 登录系统,启动完成

当我们看到mingetty的登录界面的时候,就可以输入用户名和密码了。
login会接收mingetty传来的用户名作为用户名的参数,先判断用户名不是root,且存在/etc/nologin文件,然后输出nologin的文件内容并退出,这样做一般是为了防止非root用户登录。
之后就可以根据passwd ,和shadow来验证账号的信息。

启动相关的配置文件

1. boot目录
[root@ecs-c13b ~]# ls /bootconfig-2.6.32-696.el6.x86_64
config-2.6.32-754.27.1.el6.x86_64
efi
grub
initramfs-2.6.32-696.el6.x86_64.img
initramfs-2.6.32-754.27.1.el6.x86_64.img
initrd-2.6.32-754.27.1.el6.x86_64kdump.img
symvers-2.6.32-696.el6.x86_64.gz
symvers-2.6.32-754.27.1.el6.x86_64.gz
System.map-2.6.32-696.el6.x86_64
System.map-2.6.32-754.27.1.el6.x86_64
vmlinuz-2.6.32-696.el6.x86_64
vmlinuz-2.6.32-754.27.1.el6.x86_64

【linux】循序渐进学运维-基础篇-Linux系统启动原理

查看grub的配置文件

(图片有注释)

【linux】循序渐进学运维-基础篇-Linux系统启动原理

2. 运行级别

运行级别一共有6个:
 # 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
  # 1 - 单用户模式
  # 2 - 多用户,没有 NFS
  # 3 - 完全多用户模式(标准的运行级)
  # 4 – 系统保留的
  # 5 - X11 (x window)
  # 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

总结

centos6的启动和centos7有点区别,但大同小异,下一篇文章我们来讨论centos7的启动过程。

如果是面试问到启动过程:

加点自检-内核引导-运行init-系统初始化-建立终端-用户登录系统

我是高胜寒,一个在教培行业,不忘初心的人,欢迎点赞收藏,我们下篇文章再见!

上一篇:JavaScript 原生对象、内置对象、宿主对象的区别


下一篇:Ubuntu设置开机启动指定脚本