一、Linux操作系统开机到登录的完整旅程

1.1 引导过程总览六步完成启动

开机按钮 → BIOS/UEFI → MBR/GPT → GRUB2 → Linux内核 → Systemd → 登录界面
    ↓          ↓          ↓        ↓         ↓          ↓         ↓
   硬件通电     固件自检     引导程序   引导加载器   系统核心     初始化     用户登录

1.2 详细步骤分解

步骤1:开机自检
# 发生时机:按下电源按钮后
# 执行者:主板BIOS或UEFI固件
# 任务:
# 1. 检测CPU、内存、硬盘等硬件
# 2. 初始化硬件设备
# 3. 查找可启动设备

# 查看开机自检信息(重启后查看)
sudo dmesg | head -20          # 查看内核启动信息
cat /var/log/boot.log         # 查看启动日志
步骤2:MBR/GPT引导
# MBR(主引导记录)模式:
# - 硬盘第一个扇区(512字节)
# - 包含引导代码(446字节)+ 分区表(64字节)+ 魔数(2字节)

# GPT(GUID分区表)模式:
# - 支持UEFI启动
# - 包含保护性MBR + GPT头 + 分区表

# 查看引导方式
sudo fdisk -l | grep "Disklabel"  # 显示分区表类型
sudo [ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"  # 判断启动方式
步骤3:GRUB2引导菜单
# GRUB2(GRand Unified Bootloader 2)
# 位置:/boot/grub2/ 或 /boot/grub/
# 配置文件:grub.cfg(由grub2-mkconfig生成)

# 查看GRUB配置
cat /boot/grub2/grub.cfg | head -50
sudo grub2-editenv list        # 查看GRUB环境变量

# GRUB界面操作:
# e - 编辑当前启动项
# c - 进入命令行模式
# Esc - 返回上级菜单
步骤4:加载Linux内核
# 内核文件:/boot/vmlinuz-<版本>
# 初始RAM磁盘:/boot/initramfs-<版本>.img 或 initrd-<版本>.img

# 查看内核文件
ls -lh /boot/vmlinuz-*
ls -lh /boot/init*

# 内核启动参数(可在GRUB中编辑)
cat /proc/cmdline              # 查看当前内核命令行参数
# 常见参数:
# ro - 以只读方式挂载根文件系统
# root=UUID=... - 指定根分区
# rhgb - Red Hat图形引导
# quiet - 安静模式
步骤5:init进程初始化(现代使用systemd)
# 传统SysV init:PID=1的进程
# 现代systemd:系统和服务管理器

# 查看init进程
ps -p 1 -o comm=              # 显示PID=1的进程名
systemctl --version           # 查看systemd版本

二、系统初始化进程及文件

2.1 init进程的演进

# 历史演进:
# SysV init → Upstart → systemd

# 查看系统使用的初始化系统
ls -l /sbin/init              # 查看init程序链接
# 输出可能是:
# /sbin/init -> /lib/systemd/systemd  # systemd系统
# /sbin/init -> /sbin/upstart         # Upstart系统

2.2 Systemd全面解析

Systemd架构概述
systemd (PID=1)
├── systemd-journald (日志)
├── systemd-udevd (设备管理)
├── systemd-networkd (网络)
├── systemd-resolved (DNS解析)
├── systemd-logind (登录管理)
└── 各种.service单元(服务)
Systemd核心概念
# 单元(Unit)类型:
# .service - 服务单元
# .socket - 套接字单元
# .target - 目标单元(运行级别)
# .mount - 挂载点单元
# .timer - 定时器单元

# 查看所有单元
systemctl list-units --all
systemctl list-unit-files    # 查看所有单元文件
Systemd目标(Target)对应传统运行级别
# 运行级别与target的对应关系:
# 0: poweroff.target     # 关机
# 1: rescue.target       # 单用户模式(救援模式)
# 2: multi-user.target   # 多用户,无网络(无NFS)
# 3: multi-user.target   # 完整的多用户模式(文本界面)
# 4: multi-user.target   # 未使用(用户自定义)
# 5: graphical.target    # 图形界面
# 6: reboot.target       # 重启

# 查看当前target
systemctl get-default        # 查看默认target
systemctl list-units --type=target  # 查看所有target
Systemd关键目录
# 单元文件位置
/etc/systemd/system/          # 系统管理员配置(优先级高)
/usr/lib/systemd/system/      # 软件包安装的单元
/run/systemd/system/          # 运行时配置

# 查看单元文件
ls -l /usr/lib/systemd/system/*.service | head -10
systemctl cat sshd.service    # 查看服务单元文件内容

三、排除系统启动类故障

3.1 MBR扇区故障修复

备份MBR扇区数据
# MBR结构(512字节):
# 0-445: 引导代码
# 446-509: 分区表(64字节)
# 510-511: 魔数(0x55AA)

# 1. 备份整个MBR
sudo dd if=/dev/sda of=/boot/mbr.backup bs=512 count=1
# 或备份到远程服务器
sudo dd if=/dev/sda bs=512 count=1 | ssh user@backup-server "cat > /backup/mbr.backup"

# 2. 只备份分区表
sudo dd if=/dev/sda of=/boot/partition_table.backup bs=1 skip=446 count=64

# 3. 创建恢复脚本
cat > /boot/mbr_restore.sh << 'EOF'
#!/bin/bash
echo "正在恢复MBR..."
dd if=/boot/mbr.backup of=/dev/sda bs=512 count=1
echo "恢复完成,请重启系统"
EOF
chmod +x /boot/mbr_restore.sh
模拟MBR扇区故障
# 警告:以下操作会破坏系统,请在虚拟机中测试!

# 1. 破坏MBR引导代码(保留分区表)
sudo dd if=/dev/zero of=/dev/sda bs=446 count=1
# 或使用随机数据
sudo dd if=/dev/urandom of=/dev/sda bs=446 count=1

# 2. 重启系统验证故障
# 系统将显示:No bootable device 或 Operating system not found
从备份文件中恢复MBR扇区
# 方法1:使用Live CD/USB启动系统
# 步骤:
# 1. 使用安装介质启动,选择"Rescue a system"
# 2. 挂载原系统根分区
mkdir /mnt/sysroot
mount /dev/sda2 /mnt/sysroot  # 假设根分区为sda2

# 3. 恢复MBR备份
dd if=/mnt/sysroot/boot/mbr.backup of=/dev/sda bs=512 count=1

# 4. 重启系统
reboot

# 方法2:使用GRUB救援模式
# 如果GRUB部分损坏但能进入命令行:
grub> ls                     # 查看可用磁盘和分区
grub> set root=(hd0,msdos1)  # 设置根分区
grub> chainloader +1         # 加载MBR
grub> boot                   # 启动
无备份时的MBR恢复
# 方法1:使用fdisk重写MBR
sudo fdisk /dev/sda
# 在fdisk中:w(写入分区表但不修改分区)

# 方法2:使用安装盘修复
# 使用安装介质启动,进入救援模式
chroot /mnt/sysroot          # 切换到原系统
grub2-install /dev/sda       # 重新安装GRUB
grub2-mkconfig -o /boot/grub2/grub.cfg  # 重新生成配置

3.2 GRUB引导故障修复

常见GRUB故障现象
# 故障1:直接进入GRUB救援模式
# 显示:grub rescue> 

# 故障2:黑屏显示"Minimal BASH-like line editing is supported"
# 显示:grub> 

# 故障3:错误信息
# "error: no such partition"
# "error: file '/boot/grub2/i386-pc/normal.mod' not found"
GRUB救援模式修复
# 情况1:GRUB救援模式(grub rescue>)
grub rescue> ls              # 列出所有磁盘分区
# 输出:(hd0) (hd0,msdos1) (hd0,msdos2) ...

grub rescue> set prefix=(hd0,msdos1)/boot/grub2
grub rescue> set root=(hd0,msdos1)
grub rescue> insmod normal   # 加载normal模块
grub rescue> normal          # 进入正常GRUB模式

# 情况2:GRUB命令行(grub>)
grub> ls                     # 查看分区
grub> set root=(hd0,msdos1)
grub> linux /boot/vmlinuz-$(uname -r) root=/dev/sda1
grub> initrd /boot/initramfs-$(uname -r).img
grub> boot
从系统内修复GRUB
# 方法1:使用grub2-install
sudo grub2-install /dev/sda          # 安装到磁盘
sudo grub2-install --target=i386-pc /dev/sda  # 指定架构

# 方法2:重新生成GRUB配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 方法3:修复UEFI系统的GRUB
sudo mount /dev/sda1 /mnt/boot/efi   # 挂载EFI分区
sudo grub2-install --efi-directory=/mnt/boot/efi --bootloader-id=GRUB

# 完整修复流程
sudo grub2-install /dev/sda
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo mkinitrd                     # 重建initramfs(如果需要)
GRUB高级修复技巧
# 恢复被删除的/boot分区
# 1. 重新创建/boot分区
# 2. 重新安装内核
sudo yum reinstall kernel        # RHEL/CentOS
sudo apt-get install --reinstall linux-image-generic  # Ubuntu

# 3. 重新安装GRUB
sudo grub2-install /dev/sda
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 修复GRUB配置文件
sudo cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.backup
sudo vim /boot/grub2/grub.cfg    # 手动编辑(不推荐)
# 或重新生成
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

3.3 遗忘root用户密码的解决方法

方法1:单用户模式重置(GRUB2)
# 步骤:
# 1. 重启系统,在GRUB菜单按'e'编辑
# 2. 找到以"linux"或"linux16"开头的行
# 3. 在行末添加(在quiet参数后):
rw init=/sysroot/bin/sh        # 或 rd.break
# 或
rw single                      # 单用户模式

# 4. 按Ctrl+X启动
# 5. 重新挂载根文件系统为读写
chroot /sysroot
mount -o remount,rw /

# 6. 重置密码
passwd root
# 或直接修改shadow文件
sed -i 's/^root:[^:]*:/root:$6$salt$hashed_password:/' /etc/shadow

# 7. 更新SELinux标签
touch /.autorelabel

# 8. 退出并重启
exit
reboot
方法2:使用rd.break参数
# 步骤:
# 1. GRUB中编辑启动项,添加:rd.break
# 2. 启动后进入紧急模式
mount -o remount,rw /sysroot   # 重新挂载
chroot /sysroot                # 切换根
passwd root                    # 修改密码
touch /.autorelabel            # SELinux重新标记
exit                           # 退出chroot
reboot                         # 重启
方法3:使用init=/bin/bash
# 步骤:
# 1. GRUB中编辑启动项,将ro改为rw,并添加:
init=/bin/bash

# 2. 启动后直接进入bash
passwd root                    # 修改密码
# 如果提示Authentication token manipulation error
mount -o remount,rw /          # 重新挂载根分区
passwd root                    # 再次尝试

# 3. 重启系统
exec /sbin/init                # 或直接 reboot
方法4:使用Live CD/USB重置
# 步骤:
# 1. 使用Live系统启动
# 2. 挂载原系统根分区
mkdir /mnt/root
mount /dev/sda2 /mnt/root      # 假设根分区为sda2

# 3. 切换根环境
chroot /mnt/root

# 4. 重置密码
passwd root

# 5. 退出并重启
exit
umount /mnt/root
reboot
密码重置后的安全检查
# 1. 检查最近登录
last                           # 查看登录记录
lastlog                       # 显示最近登录的所有用户

# 2. 检查sudo使用
sudo cat /var/log/secure | grep sudo  # 查看sudo使用记录

# 3. 检查SSH登录
sudo cat /var/log/auth.log | grep sshd  # Ubuntu/Debian
sudo cat /var/log/secure | grep sshd    # RHEL/CentOS

# 4. 更新所有用户密码策略
sudo chage -l root             # 查看root密码策略
sudo passwd -e root            # 强制root下次登录修改密码

四、服务控制及优化启动过程

4.1 系统服务控制

Systemd服务管理基础
# 查看服务状态
systemctl status sshd          # 查看服务详细状态
systemctl is-active sshd       # 检查是否运行(active/inactive)
systemctl is-enabled sshd      # 检查是否开机启动(enabled/disabled)

# 启动/停止/重启服务
systemctl start sshd           # 启动服务
systemctl stop sshd            # 停止服务
systemctl restart sshd         # 重启服务
systemctl reload sshd          # 重载配置(不重启)
服务自启动管理
# 启用/禁用开机启动
systemctl enable sshd          # 启用开机启动
systemctl disable sshd         # 禁用开机启动
systemctl reenable sshd        # 重新启用

# 查看服务依赖关系
systemctl list-dependencies sshd         # 查看依赖
systemctl list-dependencies --reverse sshd  # 查看谁依赖它

# 屏蔽服务(防止手动或间接启动)
systemctl mask sshd            # 屏蔽服务
systemctl unmask sshd          # 取消屏蔽
服务状态查看
# 查看所有服务状态
systemctl list-units --type=service  # 查看所有服务
systemctl list-units --type=service --state=running  # 只查看运行中的
systemctl list-units --type=service --state=failed   # 查看失败的服务

# 查看服务配置文件
systemctl cat sshd.service     # 显示服务文件内容
systemctl edit sshd.service    # 编辑服务(创建覆盖文件)

# 查看服务日志
sudo journalctl -u sshd        # 查看sshd服务日志
sudo journalctl -u sshd -f     # 实时查看日志
sudo journalctl -u sshd --since="2024-01-01" --until="2024-01-02"

4.2 优化启动过程

分析启动耗时
# 查看系统启动时间
systemd-analyze                 # 显示启动总时间
systemd-analyze blame           # 显示各服务启动耗时
systemd-analyze critical-chain  # 显示关键路径
systemd-analyze plot > boot.svg # 生成启动时间图表

# 查看详细时间线
systemd-analyze time
# 输出示例:
# Startup finished in 2.123s (kernel) + 15.456s (userspace) = 17.579s
优化启动速度
# 1. 禁用不必要的服务
# 查看所有启动服务
systemctl list-unit-files --type=service | grep enabled

# 常见可禁用服务(根据需求):
sudo systemctl disable bluetooth.service    # 蓝牙(无蓝牙设备时)
sudo systemctl disable cups.service         # 打印服务(无打印机时)
sudo systemctl disable postfix.service      # 邮件服务(不需要时)

# 2. 使用并行启动(默认已启用)
# 检查并行启动
cat /etc/systemd/system.conf | grep -i parallel
# 确保有:DefaultStartLimitIntervalSec=10s

# 3. 调整服务启动超时时间
sudo systemctl edit sshd.service
# 添加:
[Service]
TimeoutStartSec=30s            # 启动超时时间
延迟启动服务
# 创建服务延迟启动
# 编辑服务文件,添加:
[Unit]
After=network-online.target
Wants=network-online.target

[Service]
ExecStartPre=/bin/sleep 30     # 延迟30秒启动
使用systemd目标优化
# 设置默认目标
sudo systemctl set-default multi-user.target   # 文本模式
sudo systemctl set-default graphical.target    # 图形模式

# 创建自定义目标
sudo cp /usr/lib/systemd/system/multi-user.target /etc/systemd/system/my-custom.target
sudo systemctl enable my-custom.target

4.3 服务故障排除

常见服务问题及解决
# 问题1:服务启动失败
sudo systemctl status failed-service
sudo journalctl -u failed-service --no-pager | tail -50

# 问题2:服务依赖问题
systemctl list-dependencies failed-service
systemctl cat failed-service | grep -A5 -B5 "After="

# 问题3:端口冲突
sudo netstat -tlnp | grep :80   # 查看80端口占用
sudo ss -tlnp | grep :22        # 查看22端口占用
服务调试技巧
# 1. 以调试模式运行服务
sudo systemctl edit debug-service
# 添加:
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
ExecStart=
ExecStart=/usr/sbin/service-binary --debug

# 2. 查看服务环境变量
systemctl show sshd.service | grep Environment

# 3. 手动测试服务启动
sudo /usr/sbin/sshd -d -D       # sshd调试模式

4.4 启动过程故障排除工具箱

救援和紧急目标
# 进入救援模式(单用户模式)
sudo systemctl rescue           # 需要root密码
# 或从GRUB添加:systemd.unit=rescue.target

# 进入紧急模式(最小环境)
sudo systemctl emergency        # 需要root密码
# 或从GRUB添加:systemd.unit=emergency.target

# 查看当前模式
systemctl get-default
系统健康检查脚本
#!/bin/bash
# system_health_check.sh

echo "=== 系统健康检查报告 $(date) ==="
echo ""

echo "1. 启动时间分析:"
systemd-analyze

echo ""
echo "2. 失败的服务:"
systemctl --failed

echo ""
echo "3. 高内存使用服务:"
ps aux --sort=-%mem | head -10

echo ""
echo "4. 高CPU使用服务:"
ps aux --sort=-%cpu | head -10

echo ""
echo "5. 磁盘使用情况:"
df -h

echo ""
echo "6. 内存使用情况:"
free -h

echo ""
echo "检查完成!"

五、Systemd高级功能

5.1 管理用户服务

# 用户服务目录
~/.config/systemd/user/        # 用户配置
/usr/lib/systemd/user/         # 系统提供的用户服务

# 管理用户服务
systemctl --user start service-name    # 启动用户服务
systemctl --user enable service-name   # 启用用户自启动

# 启用用户linger(用户退出后服务继续运行)
sudo loginctl enable-linger $USER

5.2 定时任务(Systemd Timer)

# 查看所有timer
systemctl list-timers

# 创建timer示例
# mytask.timer
[Unit]
Description=Run my task daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

# mytask.service
[Unit]
Description=My custom task

[Service]
Type=oneshot
ExecStart=/path/to/script.sh

# 启用timer
systemctl enable mytask.timer
systemctl start mytask.timer

5.3 临时文件管理

# 查看临时文件配置
systemctl list-unit-files --type=tmpfile

# 创建临时文件配置
# /etc/tmpfiles.d/mytemp.conf
# 类型 路径 权限 所有者 组 参数
d /var/cache/myapp 0755 appuser appgroup
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐