引导过程与服务控制
·
一、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
更多推荐



所有评论(0)