简介:面向系统管理员与运维学习者,这份文档系统梳理操作系统启动全流程,从基本输入输出系统自检、主引导记录加载、统一引导程序配置,到内核装载与服务初始化,并重点讲解单用户、紧急模式以及故障排查模式等典型恢复手段。针对忘记管理员密码、启动目录损坏、引导程序加密、文件系统表标识符错误等常见情况,给出可直接执行的修复思路,适合日常运维参考与考试复习速查。
包内仅有一个便携式文档格式文件,压缩后约二百二十五千字节,体积小、便于离线保存与快速查阅。目前已有一百一十五人学习下载,内容来自早期技术社区整理的实践笔记,涵盖引导配置生成、根目录切换救援、临时指定初始化进程等重置密码细节,不仅解释启动原理,更注重排查流程。阅读后可建立完整的启动链路认知,遇到系统无法正常引导时能按步骤定位问题,避免盲目重装系统,提升应急处理能力。
1. Linux 系统启动过程与故障排除:从 grub 引导到三种救援模式
系统起不来的凌晨最考验人。这份《Linux 系统启动过程与故障排除》不是那种从内核源码讲起的理论文档,它就是一本修机器的手册:MBR 里的 grub 引导、/boot/grub2/grub.cfg 配置文件、single 和 emergency 模式怎么进、root 密码忘了怎么重置、grub2-install 怎么重装引导,全是用得上的命令和改法。适合刚接手服务器的人,也适合遇到过「内核更新后 grub.cfg 被覆盖」这类翻车的老手。本文按启动链路把配置和修复串一遍,再落到每种故障的完整操作,最后把最容易踩的坑单独拎出来说。
2. 启动链路拆解:BIOS 到内核加载,配置到底改哪里
2.1 MBR、grub 与内核:启动链条上谁负责什么
Linux 系统启动过程第一步是 BIOS 自检硬件并寻找启动设备,接着 BIOS 激活 MBR。MBR 一共 512 字节,前 446 字节是主引导程序(grub),后面 64 字节是分区表,最后 2 字节是签名。grub 被加载到内存后会生成一个微系统,这个微系统有能力读取文件系统、解析分区表,然后通过分区表找到引导分区,再去读自己的配置文件/boot/grub2/grub.cfg,从中找到内核文件路径,最后把内核加载进内存。
理解这段链路对排障很重要:如果 BIOS 阶段就失败,屏幕通常没有任何输出或直接黑屏;如果 MBR 损坏,会提示grub rescue或Missing operating system;如果 grub.cfg 丢失或配置错误,会停在 grub 命令行界面。故障出现在哪一环,就用哪一环的手段去修。常见做法是先用启动光盘或 U 盘进救援环境,再逐层排查,而不是一上来就重装系统。
启动流程各环节的产物和常见故障可以这样对应:
| 环节 | 关键产物 | 故障表现 |
|---|---|---|
| BIOS | 自检、选择启动设备 | 黑屏无输出、找不到启动设备 |
| MBR | 主引导程序 grub(446 字节) | grub rescue、missing operating system |
| grub 引导 | grub.cfg、内核文件 | 停在 grub 命令行、kernel panic |
| 内核加载 | 内核、initramfs | 卡在加载进度、无法挂载根分区 |
| 系统初始化 | systemd、服务 | 服务启动失败、进入紧急模式 |
2.2 正确的改参姿势:/etc/default/grub与grub2-mkconfig
很多人第一次改 grub 配置时,习惯直接编辑/boot/grub2/grub.cfg,这在新手阶段几乎必翻车。grub.cfg是由/etc/default/grub和/etc/grub.d/目录下的脚本自动生成的,内核一旦更新,系统会自动调用grub2-mkconfig重新生成grub.cfg,之前手工做的修改会全部失效,相当于白改。
正确做法是修改/etc/default/grub这个配置文件,然后执行grub2-mkconfig让改动生效。这个文件里最常用的是GRUB_TIMEOUT(菜单等待时间)和GRUB_CMDLINE_LINUX(内核启动参数)。
# 修改 /etc/default/grub,常见内容如下 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet" GRUB_DISABLE_RECOVERY="true"GRUB_CMDLINE_LINUX这一行就是内核启动参数,rhgb表示显示图形化启动进度条,quiet表示安静模式,减少启动时的信息输出。需要调整参数时,直接在这一行追加即可。改完以后执行grub2-mkconfig -o /boot/grub2/grub.cfg重新生成配置文件,重启后才会生效。
2.3 grub2-set-default:默认启动项与内核参数管理
如果机器上装了多个内核版本或多个系统,grub2-set-default可以设置默认启动哪个菜单项。先执行awk -F\' '/menuentry / {print $1}' /boot/grub2/grub.cfg查看所有 menuentry 的序号,再用grub2-set-default指定序号或名称。
# 查看 grub 菜单项 grep "^menuentry" /boot/grub2/grub.cfg # 设置默认启动第 0 项 grub2-set-default 0 # 确认当前默认项 grub2-editenv list这里注意grub2-set-default设置的是「下次启动」的默认项,而/etc/default/grub里的GRUB_DEFAULT=saved表示沿用上一次启动的选择。这两者的配合逻辑是:GRUB_DEFAULT=saved时,grub 会读取saved_entry变量来决定启动哪个菜单项,grub2-set-default实际就是在写这个变量。
3. 三种救援模式实操作业:single、emergency 与重置 root 密码
3.1 救援模式(single):敲一个参数进最小系统
救援模式对应 systemd 的rescue.target,系统只启动必需的服务,文档里的说法是「只需 8 个服务」。进入方式:开机在 grub 菜单界面按e键进入编辑模式,找到以linux16或linux开头的那一行(内核启动命令行),在行尾追加single或s,然后按Ctrl+X启动。
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rhgb quiet single追加single后,系统会跳过大部分服务,直接进入单用户 shell,适合做修复操作:改密码、修复 fstab、禁用出问题的服务。注意进入该模式需要 root 密码,如果密码忘了,就不能走这条路,要用 3.3 的init=/bin/sh方案。
3.2 emergency 模式:比救援模式更精简的服务集合
emergency 模式对应emergency.target,启动的服务比 single 更少,连网络和服务依赖都不拉起来,基本只挂载根分区。进入方式和 single 一样,在内核命令行行尾追加emergency:
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rhgb quiet emergency同样需要 root 密码。emergency 适合的场景是 single 模式也起不来的情况——比如某个服务在 rescue.target 依赖链里仍然触发崩溃,或者根分区挂载本身有问题。在 emergency 模式下,根分区默认是只读挂载,执行修复命令前需要先执行mount -o remount,rw /。
3.3 忘记 root 密码:init=/bin/sh 绕过与重置
这是最经典的故障场景。root 密码忘了,single 和 emergency 都进不去(都需要密码),这时候用的方案是:在 grub 编辑界面,找到内核命令行,在行尾追加init=/bin/sh,同时把rhgb和quiet删掉。
为什么必须删掉这两个参数?因为rhgb会显示图形进度条,quiet会隐藏内核输出,两者叠加的效果是启动过程看不到任何命令行交互界面,你以为系统卡死了,其实/bin/sh已经在等输入。删掉之后,启动到 shell 提示符后,按顺序执行以下操作:
# 重新挂载根分区为读写 mount -o remount,rw / # 修改 root 密码 passwd root # 创建 SELinux 重标记标记文件 touch /.autorelabel # 继续执行系统初始化 exec /sbin/inittouch /.autorelabel这一步很容易被忽略。系统启用 SELinux 时,直接改密码会导致登录相关文件的 SELinux 上下文不正确,表现为能输入密码但登录不进去。创建.autorelabel后,系统重启会自动重新标记所有文件的 SELinux 属性,代价是首次重启会慢一些。exec /sbin/init的作用是把当前 shell 替换成 init 进程,让系统按正常流程继续启动。
4. troubleshooting 模式:grub、内核、fstab 与关键文件恢复
4.1 chroot 到 /mnt/sysimage:把损坏系统变成可操作目录
troubleshooting 模式其实是安装在系统上的「救援模式」入口,在 grub 菜单里通常叫 Troubleshooting,进去之后有几个子选项,核心是进入 shell 后用chroot /mnt/sysimage把原系统的根分区切换到当前环境,这样你能直接操作原系统里的文件、命令和配置。
# 进入 troubleshooting 的 shell 后 chroot /mnt/sysimage执行 chroot 之后,当前环境的/变成了原系统的根目录,你可以直接运行grub2-install、vim /etc/fstab、rpm这些原系统里的工具。这是重装 grub、修复 boot 目录、改 fstab 的前提。chroot 之前系统会把原根分区挂载到/mnt/sysimage,这个挂载动作通常是自动完成的,如果没挂上,手动执行mount /dev/sda2 /mnt/sysimage即可。
4.2 重装 grub 与内核:grub2-install 与 rpm -ivh
grub2-install 是把 grub 引导程序重新写入磁盘 MBR 的命令,一般配合 chroot 使用。写入目标是整块磁盘,而不是某个分区,这是新手常搞混的地方。
# 在 chroot 环境中执行 grub2-install /dev/sda执行后 grub 的主引导程序会被写到/dev/sda的 MBR 区域。如果/boot下的文件被删除或者内核损坏,还需要重新安装内核 rpm 包。此时需要用到安装光盘,把光盘挂载后从 Packages 目录里找到对应的内核包:
# 挂载安装光盘 mount /dev/cdrom /mnt # 安装内核包,包名用 tab 补全 rpm -ivh /mnt/Packages/kernel-3.10.0-957.el7.x86_64.rpmrpm -ivh的-i是安装,-v显示详细信息,-h显示进度条。系统里原来的内核如果还在,这只是多装一个内核,不会覆盖旧内核,grub 菜单里以后会多一个选项。装完内核后,/boot目录下会生成对应的 vmlinuz 和 initramfs 文件。
4.3 boot 目录重建:grub2-mkconfig -o grub.cfg 的完整流程
如果/boot目录整个乱了,比如误删了 grub2 目录或者 grub.cfg 丢失,需要手动重建配置。常见做法是:先确认/boot下有没有 vmlinuz 和 initramfs 内核文件,没有就先按 4.2 安装内核包,然后在/boot下创建 grub2 目录并重新生成 grub.cfg。
# 创建 grub2 目录 mkdir -p /boot/grub2 # 进入 grub2 目录 cd /boot/grub2 # 重新生成 grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfggrub2-mkconfig -o的-o指定输出文件路径,它会扫描/etc/default/grub、/etc/grub.d/脚本以及磁盘上的内核文件,生成完整的引导菜单。生成完 grub.cfg 之后,还要执行grub2-install /dev/sda把引导程序装回 MBR。这两步缺一不可:只有 grub.cfg 没有引导程序,MBR 还是空的;只有引导程序没有 grub.cfg,grub 不知道从哪里加载内核。
4.4 fstab 的 UUID 对不上与 passwd/shadow 丢失
fstab 问题很典型:如果挂载分区时用的是 UUID,并且写进了/etc/fstab,后面做分区操作或重新格式化导致 UUID 变了,启动时系统按旧 UUID 去找分区会失败,直接进入 emergency 模式。处理方法是先用blkid查出当前各分区的真实 UUID,再修改 fstab。
# 查看分区实际 UUID blkid /dev/sda1 /dev/sda2 # 修改 fstab 中对应的 UUID vim /etc/fstab修改 fstab 时建议把新 UUID 和原内容逐行核对,避免手误多敲或少敲字符,fstab 写错会导致无法挂载根分区。另一个极端场景是/etc/passwd和/etc/shadow文件丢失,症状是开机后屏幕黑屏、没有任何登录界面。原因是这两个文件是用户账户和密码认证的核心,缺失时系统的登录流程直接无法初始化。
# 用系统备份文件恢复 passwd 和 shadow cp -a /etc/passwd- /etc/passwd cp -a /etc/shadow- /etc/shadow用cp -a而不是cp是关键:-a保留文件权限、属主和 SELinux 上下文。/etc/shadow的权限必须是----------或-rw-------,如果恢复了之后权限不对,登录时 passwd 命令会报错或者直接拒绝认证。恢复完成后检查一下权限位:ls -l /etc/passwd /etc/shadow,passwd 是-rw-r--r--,shadow 是----------或-rw-------。
5. grub 加密与启动参数:防篡改调参的五个常见问题排查
5.1 grub 加密:grub2-mkpasswd 与 00_header 改动
给 grub 加密的目的是防止物理接触到机器的人按e进入编辑模式篡改启动参数。没有加密的情况下,任何人都能通过 grub 编辑界面加init=/bin/sh重置 root 密码,这是所有 Linux 系统都绕不开的物理安全缺口。加密步骤分两步:先用grub2-mkpasswd-pbkdf2生成加密密码,再把结果写进/etc/grub.d/00_header。
# 生成 PBKDF2 加密密码,回车后输入两遍密码 grub2-mkpasswd-pbkdf2命令输出长这样:
Your PBKDF2 password is grub.pbkdf2.sha512.10000.xxxx...把这一整串复制下来,追加到/etc/grub.d/00_header文件末尾。注意是追加到 00_header,不是追加到 grub.cfg,因为 00_header 是生成 grub.cfg 的源文件之一。改完之后必须重新生成 grub.cfg:
# 在 00_header 末尾追加以下内容 cat >> /etc/grub.d/00_header <<EOF cat <<EOF set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.xxxx... EOF EOF # 重新生成 grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfgset superusers="root"定义有权限编辑 grub 的用户名,password_pbkdf2那一行把用户名和加密密码绑定。这样配置以后,在 grub 界面按e编辑前会先要求输入用户名和密码,没有密码的人进不了编辑模式。
5.2 内核 cmdline 参数与默认启动项管理
内核启动参数不只是故障排查时在 grub 界面临时追加,也可以写进/etc/default/grub的GRUB_CMDLINE_LINUX行永久生效。常见的实用参数有:net.ifnames=0关闭网卡随机命名,让网卡显示为 eth0;console=ttyS0,115200开启串口控制台输出,方便无显卡的服务器远程排障;panic=5设置内核 panic 后 5 秒自动重启。
# 修改 /etc/default/grub 的内核参数 GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0 console=ttyS0,115200" # 重新生成配置 grub2-mkconfig -o /boot/grub2/grub.cfg加参数时注意不要随意删掉原有的rhgb quiet,除非你明确知道不需要图形化启动界面。另外,调内核参数前最好先查一下参数含义,有些参数(比如init=/bin/sh)只适合临时在 grub 编辑界面用,写进默认配置会导致系统每次开机都进单用户 shell。
5.3 常见问题排查:五条踩坑记录
坑 1:直接改 grub.cfg,内核更新后配置全失效
现象:手动改了/boot/grub2/grub.cfg里的超时时间和菜单项,重启后生效,但某次yum update kernel之后改动全部没了。原因:内核更新包会触发grub2-mkconfig重新生成 grub.cfg,覆盖所有手工修改。解决:改/etc/default/grub和/etc/grub.d/下的文件,然后手动执行grub2-mkconfig -o /boot/grub2/grub.cfg,这才是官方支持的持久化方式。
坑 2:加 single 进不去,屏幕一片黑
现象:按e在行尾追加single,Ctrl+X启动后黑屏,看起来像卡死。原因:内核命令行里还留着rhgb quiet,图形进度条掩盖了 shell 提示符,shell 其实已经在后台等着输入。解决:追加single的同时删掉rhgb和quiet,启动后就能看到命令行界面。
坑 3:grub 加密设置后,开机仍然能直接按 e 编辑
现象:按 5.1 改了 00_header,重启后 grub 菜单按e直接进入编辑,没有要求输入密码。原因:改了 00_header 但没有执行grub2-mkconfig,grub.cfg 里根本没有密码相关的指令。解决:每次改完/etc/grub.d/下的文件后,强制走一遍grub2-mkconfig -o /boot/grub2/grub.cfg,然后用grep password /boot/grub2/grub.cfg验证。
坑 4:fstab 里 UUID 对不上,启动进 emergency
现象:系统启动后提示Give root password for maintenance或直接进入 emergency 模式,journalctl里报UUID=xxx does not exist。原因:分区重新格式化或者用mkfs重建文件系统后 UUID 变了,fstab 里的还是旧值。解决:在 emergency 模式执行blkid查出当前 UUID,修改/etc/fstab里的对应行,或者临时先把那行注释掉让系统能起来,再重新建挂载项。
坑 5:passwd/shadow 恢复后密码无法验证
现象:用普通cp /etc/passwd- /etc/passwd恢复文件后,登录时提示密码错误,但实际上密码是对的。原因:普通 cp 不保留文件权限,/etc/shadow的权限变成了 644,任何用户都能读,同时 passwd 命令检测到权限异常会拒绝认证。解决:改用cp -a恢复,恢复完检查权限,shadow 必须是 000 或 600,passwd 是 644。
6. 修复后的验证与收尾:grub.cfg 备份和启动项确认
6.1 验证 grub.cfg 生成结果与默认启动项
修复完 grub 配置后,不建议直接重启赌运气。重启前用命令确认生成结果:grub2-mkconfig -o /boot/grub2/grub.cfg执行完,grep "^menuentry" /boot/grub2/grub.cfg能列出所有启动菜单项,确认要启动的内核在列表里;grub2-editenv list查看saved_entry指向哪个菜单项,如果指向不对,用grub2-set-default纠正。
6.2 修复前的备份习惯与内核参数核对
现在我的习惯是:动 grub 相关配置之前,强制先备份/boot/grub2/grub.cfg和/etc/default/grub,备份文件带日期后缀。如果修复涉及 fstab,也顺手cp /etc/fstab /etc/fstab.bak。做完这些再执行grub2-mkconfig,一旦新配置起不来,grub 菜单里选旧内核或者直接改回备份文件,至少有一条后悔药。希望帮到你。
本文还有配套的精品资源,点击获取