浅谈linux的启动流程


核心流程如下图
在这里插入图片描述
此图基本是centos6以前的流程,centos7以后int变为systemd了


Centos6启动流程

1.加载BIOS的硬件信息,获取第一个启动设备

POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对
CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要
的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备

2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息

bootloader:引导程序
位于MBR的前446字节,允许用户选择启动的系统或内核版本,装载、运行内核并把管理权限移交给内核程序。目前linux使用的主流bootloader为GRUB(CentOS 6使用GRUB 0.9, CentOS 7使用GRUB 2)

bootloader:       引导加载器,引导程序
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用
户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:            LInux LOader
GRUB:             GRand Unified Bootloader
GRUB 0.X:         GRUB Legacy, GRUB2
MBR:             第一个扇区
前446字节         bootloader
中间64字节        分区表
最后2字节         55AA

GRUB的分阶段引导
由于MBR给bootloader预留的空间太狭小,GRUB程序分布在硬盘的多个位置

  • primary bootloader:1st stage(位于MBR的前446字节), 1.5 stage(识别/boot分区类型并加载相应的驱动)
  • secondary bootloader:2nd stage(位于/boot/grub,显示启动菜单和用户交互程序,负责内核加载,并将管理权移交给内核)
grub启动过程详解

grub简介

  • 版本:
grub 0.97: CentOS 6使用,grub经典版,以下介绍的都是此版本的操作
grub 2:CentOS 7开始使用
  • grub的阶段:grub程序分布在硬盘的不同位置,被分为多个阶段
一、stage 1:bootloader,位于MBR,446字节
二、stage 1_5:位于MBR之后的扇区,确保stage1的bootloader能够识别stage2所在分区的文件系统
三、stage 2:
         1)显示启动菜单,实现与用户的交互
         2)加载用户选择的内核或操作系统
         3)为菜单提供了保护机制
  • stage 2 和内核文件一般安装至一个基本的磁盘分区(/boot/grub一般是独立分区)

grub安装:

  • grub-install命令
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件
到 DIR/boot目录下
grub-install --root-directory=DIR /dev/DISK
  • 交互式安装
grub> root (hd#,#)
grub> setup (hd#)

grub的详细配置

  • 配置文件:/boot/grub/grub.conf< – /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
功用:
(1) 提供启动菜单、并提供交互式接口
    a:内核参数
    e: 编辑模式,用于编辑菜单
    c: 命令模式,交互式接口
(2) 加载用户选择的内核或操作系统
    允许传递参数给内核
    可隐藏启动菜单
(3) 为菜单提供了保护机制
    为编辑启动菜单进行认证
    为启用内核或操作系统进行认证
  • grub命令行模式
1. help:                    获取帮助列表
2. help KEYWORD:            详细帮助信息
3. find (hd#,#)/PATH/TO/SOMEFILE:
4. root (hd#,#)             指定grub的根分区,即stage2文件和内核文件所在的分区
5. kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加
许多内核支持使用的cmdline参数,可通过 cat /proc/cmdline 查询内核参数
     例如:max_loop=100 selinux=0 init=/path/to/init
6. initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
7. boot:                   引导启动选定的内核

grub启动系统

  • 识别硬盘设备
(hd#,#)
       hd#: 磁盘编号,用数字表示;从0开始编号
         #: 分区编号,用数字表示; 从0开始编号
(hd0,0) 第一块硬盘,第一个分区
  • 手动在grub命令行接口启动系统
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

grub配置文件/boot/grub/grub.conf详解

  • 通用设置
deafult=#:         设定默认启动的菜单顺序;落单项(title)编号从0开始
timeout=#:          指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
password [--md5] STRING:  启动菜单编辑认证
hiddenmenu:               隐藏菜单
  • 以下是关于菜单项的设置,可以重复使用多次用于设置多个菜单项
title TITLE:                 定义菜单项“标题”, 可出现多次
root (hd#,#):                查找stage2及kernel文件所在设备分区;为grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
password [--md5|--encrypted ] STRING: 启动选定的内核或操作系统时进行认证

grub加密生成grub口令

grub-md5-crypt:    生成md5加密密码
grub-crypt:        生成sha512加密密码

破解root口令

启动系统时,设置其运行级别1
进入单用户模式:
            (1) 编辑grub菜单(选定要编辑的title,而后使用a 或 e 命令)
            (2) 在选定的kernel后附加1, s, S,single 都可以
            (3) 在kernel所在行,键入“b”命令
进入系统用passwd修改root口令

3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

内核自身初始化:

  • 探测可识别到的硬件设备
  • 在ramdisk提供基本驱动(只用于满足启动使用)的前提下,加载各硬件驱动
  • ramdisk管理工具:mkinitrd(CentOS 6), dracut(CentOS 7)
  • 以只读文件的方式挂载根文件系统
  • 运行用户空间第一个应用程序/sbin/init,启动相关服务

linux内核特点

  • 模块化设计:体现为众多的.ko文件(内核模块文件),实现文件系统、硬件驱动、网络协议等kernel功能
  • 可以动态装载、卸载内核模块

linux内核组成

  • 核心文件:/boot/vmlinuz-version-release
  • 辅助的伪根系统ramdisk(系统启动时非常重要):
    /boot/initrd-VERSION-release.img (CentOS 5)
    /boot/initramfs-VERSION-release.img (CentOS 6, 7)
  • 模块文件:
    /lib/modules/version-release目录下

Ramdisk

  • ramdisk内核中的特性之一: 使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应
    的硬件驱动
ramdisk --> ramfs 提高速度
CentOS 5  initrd.img
工具程序:mkinitrd
CentOS 6,7  initramfs.img
工具程序:mkinitrd, dracut
  • ramdisk文件的制作:
(1) mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)

4.核心执行init程序,并获取默认的运行信息

init程序类型

启动程序进程名称应用版本配置文件
SysVinitCentOS 5之前/etc/inittab
UpstartinitCentOS 6/etc/inittab, /etc/init/*.conf
SystemdsystemdCentOS 7/usr/lib/systemd/system, /etc/systemd/system

运行级别

  • 定义:为系统运行和维护目的而设定,共有0-6共7个级别
  0:关机
  1:单用户模式,root自动登录,可用于重置root密码
  2:不完全的多用户模式,启用网络功能,但不启用NFS
  3:完全的多用户模式
  4:预留
  5:图形界面模式
  6:重启
  • 默认的运行级别:/etc/inittab中设置,一般设为3或者5,不能设置为0或者6
  • 修改运行级别:init LEVEL,LEVEL取值为0-6
  • 查看运行级别:runlevel 或 who -r

init初始化

  • init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
  • 配置文件:/etc/inittab
    • 格式:id:runlevel:action:process
格式说明:
id:是惟一标识该项的字符序列
runlevels: 定义了操作所使用的运行级别
action: 指定了要执行的特定操作
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之,一般在mingetty时使用
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,一般process设为/etc/rc.d/rc.sysinit
process:定义了要执行的进程
  • CentOS 6的/etc/inittab文件只保留了设定默认运行级别的语句,其他内容被移动到/etc/init/*.conf各类设置文件中

5.init程序执行/etc/rc.d/rc.sysinit文件

/etc/rc.d/rc.sysinit: 系统初始化脚本

(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作

按照/etc/inittab文件规定的默认运行级别,运行相应级别的/etc/rc.d/rcN.d(N为运行级别)目录下的文件

/etc/rc.d/rcN.d文件格式:

1. rcN.d下的文件均为指向/etc/rc.d/init.d目录下服务的软链接文件
2. 软链接的命名格式:K##或者S##
3. S表示运行时开启服务,K表示运行时关闭服务
4. ##代表运行顺序,排序越靠前,越先运行。排序方式为依次对比相同位置的数字字母,数字小于字母
如:100比99靠前,因为从第1位比较1比9靠前
又如:99比9a靠前,因为第1位相同,比较第2位9比a靠前
5. 以K开头的服务越靠前,代表服务越依赖于其他服务,因为只有先停止本服务,被依赖的服务才能停止
6. 以S开头的服务越靠前,代表服务越被其他服务所依赖,因为只有先开启本服务,依赖其运行的服务才能开启
7 ./etc/rc.d/rc{2,3,4,5}.d目录下最后启动的服务均为S99local,此链接文件链指向
/etc/rc.d/rc.local脚本,rc.local脚本不是服务。当需要开机执行一些指令,又不想在
/etc/rc.d/init.d目录下专门写一个服务脚本时,可以在本脚本文件中定义修改。

chkconfig命令

  • 设置服务在所有运行级别的开启、关闭情况,语法设置如下:
chkconfig [--list] [service_name]     //查询服务
chkconfig --add service_name          //添加服务
chkconfig --del service_name          //删除服务
chkconfig --levle LLLL sevice_name <on|off|reset>
//修改服务,指定的运行级别--level LLLL省略时默认为2345
  • chkconfig实质是修改/etc/rc.d/rcN.d目录下文件前缀K或S,如下图所示,关闭atd在runlevel 5级别下启动后,在/etc/rc.d/rc5.d目录下以S开头的atd文件消失,而以K开头的atd文件出现,同时可以看到S靠后的服务往往K靠前,反之亦然,证明先启动的服务需要后退出,而后启动的服务需要先退出
    在这里插入图片描述
  • 删除/etc/rc.d/rc5.d下的K05atd软链接后,手动建立S95atd软链接,使用chkconfig查询发现已经变成了on,进一步印证chkconfig的工作原理
    在这里插入图片描述

xinetd管理的服务

1.xinetd管理非独立服务(又称瞬态服务),这些服务的使用率不高,为了节省资源占用
平时xinetd服务负责监听这些服务的端口,一旦xinetd服务发现其所管理服务的请求,
立即唤醒相应的服务,并将相应服务的端口移交给服务
2.xinetd管理很多服务,所以又称其为超级守护进程
3.非独立服务依赖于xinetd服务,若xinetd服务尚未安装,则安装非独立服务时xinetd作为
依赖服务将一并安装
4.配置文件:/etc/xinetd.conf, /etc/xinetd.d/<service>

6.启动核心的外挂模块

7.init执行运行的各个批处理文件(scripts)

8.init执行/etc/rc.d/rc.local

9.执行/bin/login程序,等待用户登录

10.登录之后开始以Shell控制主机


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值