Linux-启动过程

Linux启动过程

一. 开机流程

1.开机
2.读取Bios或UEFI Bios来载入硬件信息和硬件自检
3. 从第一个可以开机的设备的MBR中读取开机管理程序boot loader
4. 由boot loader指定载入哪个核心,并把核心解压到内存执行
5. 核心检测硬件信息并载入硬件的驱动程序
6. 内核调用systemd程序,并以default.target流程开机
7. systemd执行sysinit.target 初始化系统
8. systemd执行basic.target 准备操作系统
9. systemd 启动 multi-user.target 下的本机与服务器服务
10. systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件
11. systemd 执行 multi-user.target 下的 getty.target 及登陆服务
12. systemd 执行 graphical 需要的服务

二. boot loader的三个功能

在这里插入图片描述linux系统会在自己的分区的boot sector安装一份boot loader;同时可选是否再安装一份到磁盘第一扇区的MBR区;
windows系统会在自己的分区的boot sector安装一份boot loader;同时必选的再安装一份到磁盘第一扇区的MBR区;

在这里插入图片描述
boot loader的三个功能:

  1. 提供一个菜单让用户选择启动哪个内核
  2. 载入内核
  3. 将管理器交给其他boot loader

在这里插入图片描述

三. boot loader将kernel在内核解压运行、将虚拟文件系统在内核解压挂载成跟目录供内核去加载各种硬件设备驱动所需的模块到内核中,然后卸载虚拟文件系统重新挂载真正的根目录

在这里插入图片描述

四. 第一支程序systemd运行

4.1 去/etc/systemd/system/default.target找默认操作环境

4.2 默认操作环境可能链接到/usr/lib/systemd/system/ 这个目录下的multi-user.target 或 graphical.target这两个其中的一个,以graphical.target为例

4.3 systemd会去找两个地方的设置, 就是如下的目录:

  1. /etc/systemd/system/graphical.target.wants/:使用者设置载入的 unit
  2. /usr/lib/systemd/system/graphical.target.wants/:系统默认载入的 unit

注释:xxx.wants目录中的文件都是符合链接文件,会链接到/etc/systemd/system/或/usr/lib/systemd/system/目录中的真实脚本

4.4 systemd会由 /usr/lib/systemd/system/graphical.target 这个配置文件内发现如下的数据,说明这表示 graphical.target 必须要完成 multi-user.target 之后才能够进行,而进行完 graphical.target 之后,还得要启动 display-manager.service 才行的意思

在这里插入图片描述

4.5 可以把要开机启动的脚本或命令放置到/etc/rc.d/rc.local中,然后如果这个rc.local有x可执行属性的话,系统的rc-local.service服务会自动启动,这个服务启动就会开机自动执行rc.local中命令。

五. 开机过程会用到的主要配置文件

5.1 开机时用到的设置要载入的模块的配置文件/etc/modules-load.d/*.conf和修改模块参数的配置文件/etc/modprobe.d/*.conf

有两个地方可以处理模块载入的问题:

/etc/modules-load.d/*.conf:单纯要核心载入模块的位置; 
/etc/modprobe.d/*.conf:可以加上模块参数的位置

基本上 systemd 已经帮我们将开机会用到的驱动程序全部载入了,因此这个部份你应该无须 更动才对!不过, 如果你有某些特定的参数要处理时,应该就得要在这里进行了

在这里插入图片描述
在这里插入图片描述

添加完这两处的配置后需要重启系统生效或systemctl restart systemd-modules-load.service

六. 核心与核心模块

核心: /boot/vmlinuz 或 /boot/vmlinuz-version; 
核心解压缩所需 RAM Disk: /boot/initramfs (/boot/initramfs-version); 
核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel; 
核心源代码: /usr/src/linux 或 /usr/src/kernels/ (要安装才会有,默认不安装)

6.1 核心模块放置位置

/lib/modules/$(uname -r)/kernel 当中:
注释:不是所有kernel文件夹中的模块都被默认加载

arch :与硬件平台有关的项目,例如 CPU 的等级等等;
crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等; 
drivers :一些硬件的驱动程序,例如显卡、网卡、PCI 相关硬件等等; 
fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等; 
lib :一些函数库; net :与网络有关的各项协定数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等; 
sound :与音效有关的各项模块;

6.2 记录了核心各个模块的相依性的文件/lib/modules/$(uname -r)/modules.dep

注释:modules.dep这个文件记录着的是/lib/modules/$(uname -r)/kernel 目录下的所有模块的相应性,而不管是否真正加载进内核了

  1. /lib/modules/$(uname -r)/modules.dep这个文件记录着现有kernel模块的相应性
  2. /lib/modules/$(uname -r)/modules.dep这个文件需要用命令depmod来创建
    在这里插入图片描述

6.3 用命令lsmod列出目前核心载入的所有模块

6.4 用命令modinfo查看模块的详细信息

modinfo [-adln] 模块名 或 模块完整路径名
在这里插入图片描述

6.5 核心模块的载入与移除

6.5.1 核心模块载入

6.5.1.1 用命令modprobe载入

modprobe 会主动的去搜寻 modules.dep 的内容,先克服了模块的相依性后, 才决定需要载入的模块有哪些

1. modprobe命令格式:modprobe [-cfr] 模块名
										选项与参数:
										 -c :列出目前系统所有的模块!(更详细的代号对应表) 
										 -f :强制载入该模块; 
										 -r :类似 rmmod ,就是移除某个模块
2. 由于modprobe会去查看 modules.dep,所以只需接模块名
3. 由于modprobe会去查看 modules.dep来查看模块相依性,所以如果加载的模块有相应模块没有加载,会自动先加载相依模块再加载该模块
6.5.1.2 用命令insmod载入

insmod 则完全由使用者自行载入一个完整文件名的模块, 并不会主动的分析模块相依性

1. insmod后面要接完整的模块路径;
2. 如果用insmod加载的模块有相应模块没有加载,加载失败

6.5.2 核心模块移除

6.5.2.1 用命令modprobe移除模块
modprobe -r 模块名
6.5.2.2 用命令rmmod移除模块
命令格式:rmmod [-fw] module_name 
				选项与参数:
				 -f :强制将该模块移除掉,不论是否正被使用;

6.2 核心模块的额外参数设置:/etc/modprobe.d/*conf

如果有某些特殊的需求导致你必须要让核心模块加上某些参数时,要自己创建扩展名为 .conf 的文件,通过 options 来带入核心模块参数

七. Boot Loader: Grub2

7.1 boot loader分为两个阶段

Linux 将 boot loader 的代码执行与配置值载入分成两个阶段 (stage)来执行:

  1. 第一阶段为执行 boot loader 的主程序,这个主程序 必须要被安装在开机区,亦即是 MBR 或者是 boot sector 。但如前所述,因为 MBR 实 在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安 装 loader 的相关配置文件;
  2. 第二阶段为通过 boot loader 载入所有配置文件与相关 的环境参数文件 (包括文件系统定义与主要配置文件 grub.cfg), 一般来说,配置文件 都在 /boot 下面。

7.2 与grub2有关的配置文件

与 grub2 有关的文件都放置到 /boot/grub2中:
在这里插入图片描述

7.3 grub.cfg配置文件

7.3.1 磁盘与分区在 grub2 中的代号

grub2 对硬盘的识别使用的是如下的代号: 
(hd0,1) # 一般的默认语法,由 grub2 自动判断分区格式 
(hd0,msdos1) # 此磁盘的分区为传统的 MBR 模式 
(hd0,gpt1) # 此磁盘的分区为 GPT 模式

在这里插入图片描述

7.3.2 grub2.cfg 的大致内容

  1. 默认由 哪个选项开机 (set default)
  2. set timeout=5:默认的秒数
  3. menuentry开机项设置
    在这里插入图片描述

每一个菜单的设置,就是在“ menuentry ”这个设置值之后的项目,在 menuentry 之后会有几个项目的规范,包括“ --class, --unrestricted --id ”等等的指定项目, 之后通过“ { } ”将这个菜单会用到的数据框起来, 在选择这个菜单之后就会进行括号内的动作 的意思。如果真的点选了这个菜单,那 grub2 首先会载入模块,例如上表中的“ load_video, insmod gzio, insmod part_gpt, insmod xfs ”等等的项目, 都是在载入要读取核心文件所需要 的磁盘、分区、文件系统、解压缩等等的驱动程序。之后就是三个比较重要的项目: set root=‘hd0,msdos1’ 这 root 是指定 grub2 配置文件所在的那个设备。以我们的测试机来 说,当初安装的时候分区出 / 与 /boot 两个设备唷,而 grub2 是在 /boot/grub2 这个位置 上, 而这个位置的磁盘文件名为 /dev/sda1 ,因此完整的 grub2 磁盘名称就是 (hd0,msdos1) 啰!因为我们的系统用的是 MBR 的磁盘分区格式, 因此全名就是“ hd0,msdos1 ”。linux16 /vmlinuz-… root=/dev/mapper/centos-root … 这个就是 Linux 核心文件以及核心 执行时所下达的参数。你应该会觉得比较怪的是,我们的核心文件不是 /boot/vmlinuz- xxx 吗? 怎么这里的设置会是在根目录呢?这个跟上面的 root 有关啦!大部分的系统大 多有 /boot 这个分区,如果 /boot 没有分区, 那会是怎么回事呢?我们用下面的叠代来说 明一下:如果没有 /boot 分区,仅有 / 分区:所以文件名会这样变化喔: /boot/vmlinuz-xxx – > (/)/boot/vmlinuz-xxx --> (hd0,msdos1)/boot/vmlinuz-xxx 如果 /boot 是独立分区,则文件名的变化会是这样: /boot/vmlinuz-xxx --> (/boot)/vmlinuz-xxx --> (hd0,msdos1)/vmlinuz-xxx因此,这个 linux16 后面接 的文件名得要跟上面的 root 搭配在一起,才是完整的绝对路径文件名喔!看懂了 吗?至于 linux16 /vmlinuz-xxx root=/file/name 那个 root 指的是“ linux 文件系统中, 根目录是在哪个设备上”的意思!从本章一开始的开机流程中,我们就知道核心会主 动去挂载根目录,并且从根目录中读取配置文件, 再进一步开始开机流程。所以, 核心文件后面一定要接根目录的设备啊!这样理解吧?我们从 /etc/fstab 里面也知道 根目录的挂载可以是设备文件名、 UUID 与 LABEL 名称,因此这个 root 后面也是可 以带入类似 root=UUID=1111.2222.33… 之类的模式喔! initrd16 /initramfs-3.10… 这个就是 initramfs 所在的文件名,跟 linux16 那个 vmlinuz-xxx 相同,这个文件名也是需要搭配“ set root=xxx ”那个项目的设备, 才会得到正确的位置 喔!注意注意

7.3.3 配置文件grub.cfg的生成

  1. 由/etc/grub.d 和 /etc/default/grub 文件生成
  2. 通过命令grub2-mkconfig生成

7.3.4 grub2 配置文件维护 /etc/default/grub 与 /etc/grub.d

7.3.4.1 /etc/default/grub 主要环境配置文件
7.3.4.2 菜单创建的脚本 /etc/grub.d/*
  1. 00_header
    主要在创建初始的显示项目,包括需要载入的模块分析、屏幕终端机的格 式、倒数秒数、菜单是否需要隐藏等等,大部分在 /etc/default/grub 里面所设置的变量, 大概都会在这个脚本当中被利用来重建 grub.cfg 。
  2. 10_linux
    根据分析 /boot 下面的文件,尝试找到正确的 linux 核心与读取这个核心需要 的文件系统模块与参数等,都在这个脚本运行后找到并设置到 grub.cfg 当中。 因为这个 脚本会将所有在 /boot 下面的每一个核心文件都对应到一个菜单,因此核心文件数量越 多,你的开机菜单项目就越多了。 如果未来你不想要旧的核心出现在菜单上,那可以通 过移除旧核心来处理即可。
  3. 30_os-prober
    这个脚本默认会到系统上找其他的 partition 里面可能含有的操作系统, 然后将该操作系统做成菜单来处理就是了。 如果你不想要让其他的操作系统被侦测到并 拿来开机,那可以在 /etc/default/grub 里面加上“ GRUB_DISABLE_OS_PROBER=true ”取消这个文件的运行。 鸟哥的 Linux 私房菜:基础学习篇 第四版 948 19.3 Boot Loader: Grub2
  4. 40_custom
    如果你还有其他想要自己手动加上去的菜单项目,或者是其他的需求,那么 建议在这里补充即可! 所以,一般来说,我们会更动到的就是仅有 40_custom 这个文件即可。那这个文件内容也大 多在放置管理员自己想要加进来的菜单项目就是了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值