浅谈linux的启动流程

mac2024-03-29  35

浅谈linux的启动流程

Centos6启动流程1.加载BIOS的硬件信息,获取第一个启动设备2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息grub启动过程详解 3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备4.核心执行init程序,并获取默认的运行信息5.init程序执行/etc/rc.d/rc.sysinit文件6.启动核心的外挂模块7.init执行运行的各个批处理文件(scripts)8.init执行/etc/rc.d/rc.local9.执行/bin/login程序,等待用户登录10.登录之后开始以Shell控制主机


核心流程如下图 此图基本是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/inittabUpstartinitCentOS 6/etc/inittab, /etc/init/*.confSystemdsystemdCentOS 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)