嘿,朋友。先深呼吸一下。
我知道你现在的感觉——盯着黑屏或者红色的报错界面,心里像揣了只兔子一样扑通扑通跳。特别是当你刚执行完 dnf upgrade 或者尝试从 AlmaLinux 8 升级到 9,结果重启后系统直接“罢工”,连 SSH 都连不上时,那种焦虑感真的能把人逼疯。尤其是如果你的服务器上还跑着重要的业务,或者里面有还没备份的敏感数据,这种恐惧感会呈指数级放大。
但请相信我,90% 的情况下,你的数据是安全的。Linux 的文件系统在遇到非正常关机或内核崩溃时,通常不会直接抹除你的 /home 或 /var/lib 下的数据。现在的困境只是引导加载程序(Bootloader)、内核镜像或者关键系统库出了点岔子,导致系统无法完成初始化过程。
作为一个在 Linux 底层摸爬滚打多年的“老手”,我见过太多人因为恐慌而盲目格式化重装,结果丢了几个月的配置心血。今天,我不跟你讲那些晦涩难懂的理论,我们直接上手。我会带你一步步通过救援模式(Rescue Mode)找回控制权,评估数据风险,并尝试修复或优雅回滚。
第一阶段:冷静观察,判断“病情”
在动手之前,我们需要先搞清楚到底哪里坏了。AlmaLinux 基于 RHEL,使用的是 GRUB2 作为引导加载器,systemd 作为初始化系统。升级失败通常有几种典型表现,每种对应的修复思路截然不同。
1. 卡在 GRUB 界面,进不去选择菜单
如果你看到黑屏,或者只有 grub> 提示符,说明引导配置文件 grub.cfg 损坏,或者内核文件缺失。
2. 能进入 GRUB 菜单,但选择最新内核后卡住
这是最常见的情况。屏幕滚动一堆日志,然后停在:
[FAILED] Failed to start Systemd Boot Manager.
or
Kernel panic - not syncing: Attempted to kill init! exit code 0x00000007
这通常意味着新内核与现有的硬件驱动不兼容,或者升级过程中断导致 /boot 分区下的内核镜像不完整。
3. 进入单用户模式或紧急模式(Emergency Mode)
你能看到命令行提示符,但提示 Give root password for maintenance。这说明内核加载成功了,但挂载根文件系统或启动关键服务时失败了。
4. 完全黑屏,无响应
这种情况最糟,可能是显卡驱动冲突或内核严重崩溃。
行动指南: 首先,尝试在 GRUB 菜单中,使用上下键选择旧版本的内核(如果有多个选项)。比如你正在升级到 5.14,试试能不能选 5.14 之前的那个版本。如果旧内核能正常启动,恭喜你,问题很简单:新内核有问题,我们只需要删除或禁用它即可。
如果旧内核也进不去,或者根本没有旧内核选项,那就需要我们深入“手术室”了。
第二阶段:进入救援模式(Rescue Mode)——你的救命稻草
当系统无法正常启动时,你需要借助外部介质来访问你的硬盘数据。对于 AlmaLinux,你有两个主要途径:
方法 A:使用安装 ISO 镜像启动(推荐)
- 挂载 ISO:在你的虚拟机管理控制台(如 VMware, VirtualBox, Proxmox, AWS EC2 等)中,将 AlmaLinux 的安装 ISO 镜像挂载到虚拟光驱。如果是物理机,则插入安装 U 盘。
- 修改 BIOS/UEFI 启动顺序:确保系统优先从光驱/U 盘启动。
- 进入安装界面:看到 AlmaLinux 的安装欢迎界面时,不要点击 “Install AlmaLinux”。
- 选择 Troubleshooting:
- 在菜单中选择 “Troubleshooting”。
- 接着选择 “Rescue a AlmaLinux system”。
- 挂载原系统:
- 系统会询问你是否要将根文件系统挂载到
/mnt/sysimage。 - 选择 “Continue”。
- 系统会尝试找到你的原有分区并挂载。如果成功,你会看到提示:
Shutting down temporary services...然后进入 shell 提示符。 - 此时,你的原系统根目录被挂载在了
/mnt/sysimage。
- 系统会询问你是否要将根文件系统挂载到
方法 B:通过 GRUB 编辑启动参数(高级用户)
如果你还能看到 GRUB 菜单,可以尝试手动进入单用户模式:
- 在 GRUB 菜单高亮选中你要启动的内核(通常是第一个)。
- 按
e键进入编辑模式。 - 找到以
linux16或linux开头的那一行。 - 在行尾添加
rd.break(针对 systemd 启动问题)或single/init=/bin/bash。 - 按
Ctrl + x或F10启动。
注意:rd.break 是最常用的调试手段,它能让你在内核加载后、initramfs 执行前中断,从而获得 root 权限。
第三阶段:数据安全性评估与备份
在进入修复环节前,必须先备份数据。这是铁律。哪怕你觉得只是个小问题,也不要赌。
在救援模式的 Shell 中(假设原系统已挂载在 /mnt/sysimage):
# 1. 确认挂载状态
lsblk
df -h
# 2. 创建一个临时的备份目录
mkdir -p /mnt/backup
# 3. 将关键数据拷贝到安全位置
# 假设你的数据在 /home 和 /var/lib
cp -a /mnt/sysimage/home /mnt/backup/home_backup
cp -a /mnt/sysimage/var/lib /mnt/backup/var_lib_backup
cp -a /mnt/sysimage/etc /mnt/backup/etc_backup
# 4. 如果有外置存储或网络存储,最好通过 scp 或 rsync 传出去
# 例如:rsync -avz /mnt/backup/ user@remote-server:/path/to/backup/
为什么这么做?
如果在后续修复过程中,你不小心误删了 /boot 或 /etc 下的关键文件,这些备份能让你在不重装系统的情况下恢复配置。虽然重新生成配置比恢复数据容易,但有备无患总是好的。
第四阶段:专家级修复方案
根据之前观察到的不同症状,我们采取不同的修复策略。
场景一:新内核导致启动失败(最常见)
如果你能通过 GRUB 选择旧内核启动,或者进入救援模式后发现 /boot 目录下有新旧两个内核文件夹,但新内核启动报错。
原因分析:
升级过程中,kernel-core 包可能下载不完整,或者新内核编译的模块(kmod)与现有硬件驱动不匹配。
修复步骤:
进入救援 Shell(如前所述)。
检查
/boot目录:
你应该能看到类似ls /mnt/sysimage/boot/vmlinuz-5.14.0-xxx.el9_2.x86_64和initramfs-5.14.0-xxx.el9_2.x86_64.img。验证内核完整性: 如果文件存在但大小异常小,说明下载中断。
移除故障内核: 最简单的方法是直接删除新内核相关的文件,让系统回退到旧内核。
# 假设故障内核版本为 5.14.0-284.el9_2 rm -rf /mnt/sysimage/boot/vmlinuz-5.14.0-284.el9_2.x86_64 rm -rf /mnt/sysimage/boot/initramfs-5.14.0-284.el9_2.x86_64.img rm -rf /mnt/sysimage/usr/lib/modules/5.14.0-284.el9_2.x86_64更新 GRUB:
chroot /mnt/sysimage grub2-mkconfig -o /boot/grub2/grub.cfg # 如果是 UEFI 系统,路径可能是 /boot/efi/EFI/alma/grub.cfg exit重启:拔掉 ISO,重启系统。
场景二:系统进入 Emergency Mode,提示文件系统错误
原因分析:
/etc/fstab 中的挂载项有误,或者磁盘文件系统本身损坏(Inode 错误)。
修复步骤:
检查
/etc/fstab:
看看是否有新增的挂载项(比如升级脚本自动添加的 LVM 卷或网络挂载),这些可能是罪魁祸首。如果有,注释掉它们。cat /mnt/sysimage/etc/fstab运行文件系统检查:
# 假设根分区是 /dev/mapper/alma-root fsck -y /dev/mapper/alma-root注意:在生产环境慎用
fsck -y,它会强制修复所有错误。建议先不带-y运行,查看错误报告,手动确认后再修复。重新挂载根分区为读写: 在 Emergency Mode 下,根文件系统通常是只读的。
mount -o remount,rw /检查 systemd 服务状态: 查看哪些服务失败了。
journalctl -xb | grep failed如果是某个特定服务(如
networking或lvm2)失败,尝试禁用它或重新安装相关包。
场景三:升级中断,RPM 数据库损坏
原因分析:
如果在 dnf update 过程中断电或强制杀进程,RPM 数据库可能会处于不一致状态。
修复步骤:
- 重建 RPM 数据库:
chroot /mnt/sysimage rpm --rebuilddb dnf clean all dnf install --refresh rpm - 重新安装关键系统包:
dnf reinstall kernel kernel-core dracut grub2-common - 重新生成 initramfs:
dracut -f - 更新 GRUB:
grub2-mkconfig -o /boot/grub2/grub.cfg
场景四:从 AlmaLinux 8 升级到 9 失败
这是一个大版本跨越,风险极高。如果 leapp 工具失败,系统可能处于半升级状态。
专家建议: 在这种情况下,不要尝试原地修复。原地修复大版本升级失败就像是在高速行驶的汽车上换轮胎,极其危险且复杂。
- 数据备份:严格按照第二阶段进行完整备份。
- 全新安装:
- 格式化原有分区。
- 安装纯净的 AlmaLinux 9。
- 从备份中恢复数据和配置文件。
- 迁移配置:
- 使用
diff比较新旧系统的配置文件差异。 - 手动调整服务配置(如 Nginx, MySQL, Docker 等),因为大版本升级往往伴随软件版本的重大变更。
- 使用
第五部分:预防胜于治疗——如何避免下次踩坑
既然已经修好了,或者至少保住了数据,我们就得想想怎么防止悲剧重演。
1. 升级前的标准检查清单
在执行任何大规模升级前,务必执行以下命令:
# 1. 检查依赖关系
dnf check
# 2. 模拟升级(不实际执行,只查看会发生什么)
dnf upgrade --downloadonly --best --allowerasing
# 3. 检查磁盘空间
df -h /boot
df -h /
# 确保 /boot 至少有 500MB 空闲,根分区至少有 10GB 空闲
# 4. 备份 RPM 数据库
cp -a /var/lib/rpm /var/lib/rpm.bak.$(date +%F)
# 5. 创建快照(如果是 LVM 或虚拟机)
lvcreate -s -n backup_before_upgrade -L 10G /dev/mapper/alma-root
2. 使用 Leapp 进行大版本升级的最佳实践
对于 EL8 到 EL9 的升级:
# 1. 安装 leapp
dnf install leapp-upgrade leapp-data-el9
# 2. 预检
leapp preupgrade
# 3. 查看报告
leapp report --tags preupgrading
# 仔细查看红色警告!如果有未解决的依赖冲突,必须手动解决。
# 4. 执行升级
leapp upgrade
# 5. 重启
reboot
3. 自动化备份策略
不要依赖“我觉得没问题”。编写一个简单的脚本,每天凌晨自动备份关键数据:
#!/bin/bash
# backup.sh
BACKUP_DIR="/mnt/external_disk/backup"
DATE=$(date +%Y%m%d_%H%M%S)
SOURCE_DIRS="/etc /home /var/www"
echo "Starting backup..."
rsync -avz --delete $SOURCE_DIRS $BACKUP_DIR/system_backup_$DATE/
# 保留最近 7 天的备份
find $BACKUP_DIR -maxdepth 1 -name "system_backup_*" -mtime +7 -exec rm -rf {} \;
echo "Backup completed."
结语:技术背后的从容
我知道,面对黑屏和报错,人的本能反应是恐慌。但请记住,Linux 的设计哲学之一就是“一切皆文件”和“模块化”。即使系统崩了,只要硬盘没坏,你的数据就在那里静静地躺着,等着你去唤醒。
这次经历虽然惊险,但它也是你技术成长的一块磨刀石。通过这次修复,你不仅学会了如何使用救援模式,还深入理解了内核、引导加载程序和文件系统之间的关系。下次再遇到类似问题,你不会再手足无措,而是会冷静地打开终端,输入那行熟悉的命令。
最后再次强调:
- 数据第一:操作前必备份。
- 逐步验证:每一步成功后再下一步。
- 寻求社区帮助:如果上述步骤都无法解决,请携带
journalctl -b -1 > error.log的输出日志,去 AlmaLinux 官方论坛或 StackOverflow 提问。带上日志,专家才能帮你精准定位。
祝你的系统早日恢复健康,运行如飞。如果有具体的报错信息,欢迎随时回来追问,我会继续为你提供支持。
