Linux 引导过程与服务控制
一,引导过程
正常开启Linux的流程
电源启动 → POST → BIOS/UEFI → 引导加载程序 → 内核加载 → initramfs → 根文件系统挂载 → systemd → 启动服务 → 用户登录
1. 电源启动与固件
1.1 POST(加电自检)
-
作用:硬件自检(CPU、内存、外设等)。
-
异常处理:蜂鸣声/错误码提示硬件故障。
1.2 BIOS vs UEFI
特性 | BIOS | UEFI |
---|---|---|
分区表 | MBR(最大2TB) | GPT(支持大容量磁盘) |
引导文件位置 | MBR引导扇区(512字节) | ESP分区(/boot/efi)中的.efi文件 |
启动速度 | 较慢 | 更快(支持Secure Boot) |
配置文件 | 无直接配置 | 使用/boot/efi/EFI/[distro]/ 中的配置文件 |
2. 引导加载程序(Bootloader)
2.1 GRUB(传统BIOS流程)
-
:存储在MBR,定位Stage 1.5或Stage 2。
-
:读取
/boot/grub/grub.cfg
,显示启动菜单。[root@localhost ~]# cd /boot/grub2/ [root@localhost grub2]# ls device.map fonts grub.cfg grubenv i386-pc locale themes
grub.cfg 里面是引导程序的配置文件,主要用于定义操作系统的启动选项和引导参数。
-
关键参数:
root=UUID=...
(根分区)、initrd=/initramfs-xxx.img
。
2.2 UEFI启动
-
直接加载:从ESP分区运行
.efi
文件(如grubx64.efi
)。 -
配置文件:
/boot/efi/EFI/ubuntu/grub.cfg
(以Ubuntu为例)。
3. 内核初始化
3.1 内核加载
-
内核文件:
vmlinuz-<版本>
(压缩内核镜像)。 -
initramfs作用:
-
提供临时根文件系统。
-
加载关键驱动(如LVM、加密模块)。
# 重建initramfs(Debian/Ubuntu) update-initramfs -u -k all # Arch Linux mkinitcpio -P
-
3.2 根文件系统挂载
-
内核参数:
root=
指定根分区(UUID或设备路径)。 -
切换根目录:
pivot_root
或switch_root
。
4. 用户空间初始化(systemd)
4.1 systemd核心流程
-
PID 1进程:首个用户态进程,替代传统
init
。 -
启动目标(Target):
-
default.target
:符号链接指向默认目标(如graphical.target
)。 -
查看当前目标:
systemctl get-default
。 -
修改目标:
sudo systemctl set-default multi-user.target
。
-
4.2 并行启动服务
-
服务单元:
.service
文件定义依赖关系。 -
分析启动耗时:
systemd-analyze blame # 各服务启动时间 systemd-analyze critical-chain # 关键路径
5. 用户登录
5.1 显示管理器
-
图形登录:GDM(GNOME)、LightDM、SDDM。
-
控制台登录:直接启动
getty
服务(如tty1
)。
5.2 用户环境初始化
-
Shell配置:
/etc/profile
→~/.bashrc
(Bash)。 -
显示欢迎信息:
/etc/motd
(Message of the Day)。
6.故障处理
6.1 MBR扇区故障 (MBR主引导记录)
mbr
mbr作用
-
引导操作系统
-
BIOS在POST完成后读取MBR的引导代码,执行引导程序(如GRUB)。
-
引导代码将控制权交给操作系统的内核(如Linux的
vmlinuz
)。
-
-
管理磁盘分区
-
分区表定义每个分区的起始/结束位置、类型(如Linux的
83
、交换分区的82
)。 -
扩展分区通过链式结构支持更多逻辑分区(突破4个主分区的限制)。
-
MBR修复过程
下面将通过示例模拟MBR扇区进行备份,模拟破坏,修复过程
备份
mbr扇区引导记录不能备份到用一个磁盘内这样等于没有进行备份
[root@localhost /]# mount /dev/sda sda sda1 [root@localhost /]# mount /dev/sda1 /backup/ mount: (hint) your fstab has been modified, but systemd still uses the old version; use 'systemctl daemon-reload' to reload. [root@localhost /]# dd if=/dev/nvme0n1 of=/backup/nvme0n1.mbr.bak bs=512 count=1 输入了 1+0 块记录 输出了 1+0 块记录 512 字节已复制,4.232e-05 s,12.1 MB/s
模拟MBR扇区故障
使用dd命令将MBR扇区记录覆盖这样在重启电脑找不到mbr信息会会造成无法正常开机
[root@localhost /]# dd if=dev/zero of=/dev/nvme0n1 bs=512 count=1 ###从/dev/zero取出512个字节输入/devnvme0n1中覆盖mbr第一个扇区的512字节记录mbr分区信息从而照成无法正常开机
模拟MBR扇区修复
重新启动F2进入bios界面上下左右键控制在boot选项下找到+Hard Drive点击回车按键 并把第一个nvme设备选在第一个(看个人硬盘在那个就那个启动我的是nvme选着nvme)这里的选项都是让你选着以那个设备进行开机如果找不到会重新装一个新的系统我们都会找不到因为我们刚刚把第一个mbr分区信息给覆盖掉了
这里选着exit 下的第一个保存并退出
选择第三个进入 Troubelshooting (解决麻烦)
选着模式菜单
第三个是Troubleshooting
选着第二个进入救援模式
救援模式
-
Continue:继续正常启动,或者挂载文件系统为读写模式。
-
Read-only:以只读方式挂载文件系统,防止数据被修改,适合检查问题。
-
Skip:跳过自动挂载,进入命令行,由用户手动操作。
-
Quit (Reboot) 重新启动
这里我们选着第一个继续并且再次按下enter
这里我们无法正常访问文件因为我们的mbr分区信息被错误信息覆盖导致系统找不到
创建一个目录bak 并且把我们的文件挂在下该目录 (我们mbr文件备份在/dev/sda1)
通过 dd if=/bak/mbr.bak of=/dev/nvme0n1 bs=512 count=1
if=输入 of=输出 bs=大小 count=次数
再次重新启动就可以正常登录系统了成功修复MBR扇区故障
GRUB
- 算机通电后,BIOS/UEFI 首先运行,随后将控制权交给 GRUB。
- GRUB 从硬盘的 引导分区(如
/boot
)读取配置文件(grub.cfg
),加载 Linux 内核(vmlinuz
)和初始化内存盘(initramfs
)。 - 最终将控制权交给内核,启动完整的操作系统。
GRUB模拟故障修复过程
模拟故障
将grub文件改名以完成到grub菜单系统找不到模拟故障
解决方法一
手动指定加载内核和初始化镜像
insmod xfs ###进入文件系统
linux16 /vmlinuxz-6.6.0-72.oe2403sp1.x86_64 root=/dev/mapper/openeuler-root ###手动指定加载内核
initrd16 /initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64.img ###手动指定加载初始化镜像
在boot重新启动就文成grub故障修复
解决方法二
再有备份的情况下
[root@localhost ~]# cd /boot/grub2/
[root@localhost grub2]# ls
device.map fonts grub.cfg grubenv i386-pc locale themes
[root@localhost grub2]# mv grub.cfg grub.cfg.bak
我们在/boot/grub2/grub.cf
更改名字模拟grub故障
重启
会进入到grub界面
再次重启进入grub模式
重启的时候快速点按esc (一定要快 有多快就多快)
选着第三个cd—ROM Drive 以光盘开启
跟修复mbr扇区一样选着第三个Troubleshooting 在选择第二个进入救援模式
chroot更改根目录不该根目录会到光盘的根目录
然后恢复grub文件重启完成grub故障修复
GRUB 是 Linux 系统的“启动导航员”,负责:
-
加载内核和初始化系统。
-
管理多操作系统引导。
-
提供修复和调试接口(如单用户模式)。
-
支持加密和 Secure Boot 等安全功能。
二,服务控制
1.1 systemd 核心概念
-
服务单元文件:
服务配置文件位于/usr/lib/systemd/system/
(系统级)和/etc/systemd/system/
(自定义或覆盖配置)。
示例:nginx.service
,sshd.service
。 -
服务生命周期管理:
systemd 负责服务的启动、依赖关系、日志和资源监控。
2. 常用命令速查表
2.1 基本服务操作
操作 | systemd 命令 | SysVinit 命令 |
---|---|---|
启动服务 | sudo systemctl start <服务名> | sudo service <服务名> start |
停止服务 | sudo systemctl stop <服务名> | sudo service <服务名> stop |
重启服务 | sudo systemctl restart <服务名> | sudo service <服务名> restart |
查看状态 | systemctl status <服务名> | service <服务名> status |
启用开机自启 | sudo systemctl enable <服务名> | sudo chkconfig <服务名> on |
禁用开机自启 | sudo systemctl disable <服务名> | sudo chkconfig <服务名> off |
查看是否开机自启 | systemctl is-enabled <服务名> | chkconfig <服务名> |
2.2 查看服务信息
操作 | 命令 | 说明 |
---|---|---|
列出所有已启动的服务 | systemctl list-units --type=service | 显示正在运行的服务 |
列出所有服务(含状态) | systemctl list-unit-files --type=service | 包括未运行的服务 |
查看服务依赖关系 | systemctl list-dependencies <服务名> | 显示服务依赖的其他单元 |
启动服务:start
停止服务:stop
重启服务:restart
查看状态:status
开机自启:enable
关闭服务:disable
日志跟踪:journalctl -u <服务名> -f