目录
一、Linux引导过程
1、引导过程概述
1.1、BIOS开机自检
- 按下开机键后,BIOS进行硬件自检,检查硬件是否正常。
- 加载硬盘的MBR(主引导记录)。
1.2、MBR读取
- MBR存储在硬盘的第一个扇区(0扇区),包含引导程序(GRUB)和分区表。BIOS将控制权交给MBR中的引导程序(GRUB)。
1.3、加载引导加载程序(GRUB)
- GRUB通过读取配置文件/boot/grub2/grub.cfg,获取内核和镜像文件系统的设置与路径位置。
1.4、内核加载
- GRUB加载并启动操作系统的内核(Linux kernel)。内核是操作系统的核心,负责硬件管理、进程调度、文件系统管理等。
- 内核被加载到内存中并开始初始化系统。
1.5、初始化进程(init)
- 加载硬件驱动程序,内核将init进程加载到内存中运行
- 内核启动第一个用户空间进程init(PID=1),它负责启动和管理所有的系统服务和守护进程。
二、服务
服务(Service)是指后台运行的程序或进程,服务通常在系统启动时自动启动并运行,负责提供特定的功能或服务。
2.1、服务类型
- 系统服务:系统启动时启动,负责提供基础的系统功能,如网络、日志记录、硬件管理等。
- 应用服务:提供特定的应用功能,通常由应用程序启动和停止。如nginx、mysql等。
- 守护进程:后台运行的服务,不需要用户干预。通常在系统启动时启动,并持续运行直到系统关闭。如httpd、ntpd等。
- 网络服务:提供网络相关的功能。如dnsmasq、apache等。
2.2、服务管理工具
- init:Unix与Linux系统中传统的服务管理器,依赖于串行执行脚本来管理服务,导致效率低下,系统启动速度较慢。
- systemd:现代Linux系统中最常用的服务管理工具,它负责启动、停止和管理服务,并通过systemctl命令于服务进行交互。它能够将更多的服务进程并行启动,可按需启动服务,使得启动更少进程,从而提高系统启动速度。
三、运行级别
Linux系统中,运行级别(Runlevel)是指在系统启动过程中进入的不同状态。每个运行级别代表系统的不同工作状态,决定了哪些服务和进程会被启动。
init 0 (关机) | 关闭所有服务并关机 |
init 1 (单用户模式) | 用于修复文件系统、恢复丢失的密码或修复系统问题,仅限root用户登录,不启动网络服务 |
init 3 (多用户模式) | 多用户模式,命令行界面的服务器,支持网络服务 |
init 5 (多用户模式) | 支持图形界面的多用户模式 |
init 6 (重启) | 执行完整的关机过程,然后重新启动 |
四、systemd
systemd是现代Linux系统中的初始化系统和系统管理守护进程,取代了传统的SysVinit和Upstart系统。它负责启动系统服务的同时,还管理系统的启动过程、进度调度、日志记录、设备管理等任务。
4.1、systemd主要功能
- 并行启动::并行启动系统服务,大幅提高系统启动速度。
- 服务管理:通过单独的服务单位(unit)管理服务和进程,可以启动、停止、重启、查询服务状态。
- 日志管理:包含journald日志系统,集成日志收集、查看和分析,简化了日志管理。所有系统日志、服务日志可通过journalctl工具查看。
- 目标(Target):通过目标代替传统的运行级别。
- 依赖关系管理:支持服务之间的依赖关系,确保服务按正确的顺序启动和关闭。
- 并发和资源控制:通过资源控制和调度器,优化系统资源的使用,提供更高效的服务管理。
4.2、systemd单元类型
systemd使用单元(unit)来表示管理的不同资源。每个单元都有一个配置文件,定义了该单元的属性和行为,常见的单元类型包括
- service:管理服务进程,例如 Web 服务器、数据库等。
- target:表示运行级别或目标状态。例如multi-user.target表示多用户模式,graphical.target表示图形界面模式。
- socket:管理套接字(Socket)服务,通常用于延迟启动服务。
- mount:管理挂载点,定义系统如何挂载文件系统。
- timer:用于管理定时任务,类似于cron。
- device:管理设备,表示系统中可用的设备。
4.3、systemctl命令
system control的缩写,功能是管理系统服务。
语法格式:systemctl 参数 动作 服务名
start | 启动服务 | disable | 取消服务开机自启 |
stop | 停止服务 |
status | 查看服务状态 |
restart | 重启服务 | list | 显示所有已启动服务 |
enable | 设置服务开机自启 |
参考示例:
[root@localhost ~]# systemctl start sshd
[root@localhost ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2025-02-10 22:34:33 CST; 49min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1167 (sshd)
Tasks: 1
CGroup: /system.slice/sshd.service
└─1167 /usr/sbin/sshd -D
2月 10 22:34:32 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
2月 10 22:34:33 localhost.localdomain sshd[1167]: Server listening on 0.0.0.0 port 22.
2月 10 22:34:33 localhost.localdomain sshd[1167]: Server listening on :: port 22.
2月 10 22:34:33 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# systemctl stop sshd
[root@localhost ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: inactive (dead) since 一 2025-02-10 23:24:54 CST; 3s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 3335 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 3335 (code=exited, status=0/SUCCESS)
2月 10 23:24:43 localhost.localdomain systemd[1]: Stopped OpenSSH server daemon.
2月 10 23:24:43 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
2月 10 23:24:43 localhost.localdomain sshd[3335]: Server listening on 0.0.0.0 port 22.
2月 10 23:24:43 localhost.localdomain sshd[3335]: Server listening on :: port 22.
2月 10 23:24:43 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
2月 10 23:24:54 localhost.localdomain systemd[1]: Stopping OpenSSH server daemon...
2月 10 23:24:54 localhost.localdomain systemd[1]: Stopped OpenSSH server daemon.
Hint: Some lines were ellipsized, use -l to show in full.
五、系统引导故障排除
5.1、修复MBR分区
5.1.1、备份MBR引导扇区到其他磁盘
[root@localhost ~]# mount /dev/sdb1 /mnt //挂载备份用硬盘
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 14G 0 part
├─centos-root 253:0 0 10G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part /mnt //挂载成功
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost ~]# dd if=/dev/sda of=/mnt/mbr.bak count=1 bs=512 //备份mbr
记录了1+0 的读入 // 输入 输出 块个数 块大小
记录了1+0 的写出
512字节(512 B)已复制,0.000218308 秒,2.3 MB/秒
[root@localhost ~]# ls /mnt
mbr.bak
5.1.2、模拟mbr故障
[root@localhost ~]# dd if=/dev/zero of=/dev/sda count=1 bs=512 //用0覆盖mbr扇区数据
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000164001 秒,3.1 MB/秒
[root@localhost ~]# hexdump -C -n512 /dev/sda //破坏mbr扇区完成
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200
[root@localhost ~]#reboot //重启
5.1.3、重启进入急救模式,进行备份恢复操作
5.2、修复GRUB分区
5.2.1、模拟GRUB故障
[root@localhost ~]# ls /boot/grub2/
device.map fonts grub.cfg grubenv i386-pc locale
[root@localhost ~]# rm -rf /boot/grub2/grub.cfg //删除grub配置文件
[root@localhost ~]# ls /boot/grub2/
device.map fonts grubenv i386-pc locale
[root@localhost ~]# reboot //重启