Skip to content

Ubuntu 核心库损坏免重装救援(Live CD + Chroot)

适用场景与故障现象

因误操作(覆盖/删除 libc.solibcrypto.solibssl.solibpam.so 等核心动态链接库),导致服务器"假死":

  • 网络正常,但 SSH 拒绝连接(Connection refused)
  • 带外控制台(IPMI/BMC SOL)看不到正常 GRUB 菜单,只有 ^[e^[e 等乱码
  • 内核未死:启动日志显示 LVM/XFS 等根卷挂载成功,但卡死在 init-bottom,无法拉起 login 提示符

核心结论:系统和数据没坏,只是用户态服务(SSH/PAM/systemd)因依赖库缺失而全盘崩溃。可免重装、无损救回。

抢救前置准备

放弃 SOL,改用 IPMI 图形 KVM:SOL(串口控制台)无法解析图形化 GRUB,看到的必是乱码。请务必使用 IPMI 的 Java 或 HTML5 图形化 Remote Console。

处理 Virtual CDROM 超时:如果开机日志卡在 sr0... DID_TIME_OUT,这是因为挂载了 IPMI 虚拟光驱但内核读取超时。建议在 KVM 中操作,且修复完成后及时断开虚拟光驱。

引导 Live 系统:通过 Ventoy 物理 U 盘,或 IPMI 挂载 Ubuntu Server 24.04(与原系统同版本)的 ISO 镜像,引导进入 Try or Install Ubuntu Server 临时环境。按 Ctrl + Alt + F2 切出 root 命令行终端。

KVM 操作 GRUB 拦截

进入 KVM 后操作 GRUB:

  1. 在 KVM 窗口里点一下鼠标(确保键盘焦点在 KVM 里,否则按键不会传进去)
  2. 重启机器:
bash
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis power reset
  1. 开机看到 GRUB 菜单时,立刻按住 ShiftESC(防止自动倒计时跳过)
  2. 用上下键选择 Advanced options for Ubuntu → 选带 (recovery mode) 的条目 → 回车

⚠️ 操作节奏:ipmitool chassis power reset 发起重启后,眼睛盯着 KVM 屏幕,BIOS 自检画面一出现就立刻按住对应键,不要松手,一直按到 GRUB 菜单出现。

GRUB_TIMEOUT=0 的启动干预方案

GRUB_TIMEOUT 被设置为 0,直接跳过菜单启动,根本没有等待窗口。以下三种方法按推荐优先级排列:

方法一:挂载 Live ISO 从 CDROM 启动(最推荐,不依赖时机)

不依赖卡时机,最稳的路径。

bash
# 1. IPMI Web 界面挂载 Ubuntu Live ISO(Virtual Media)

# 2. 设置下次从 CDROM 启动
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis bootdev cdrom

# 3. 重启
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis power reset

进入 Live 系统后按后续章节的 chroot 修复流程操作。

方法二:从 BIOS 层面介入

bash
# 让下次启动进 BIOS Setup(不经过 GRUB)
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis bootdev bios

# 然后重启
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis power reset

进 BIOS 后:找到 Boot 菜单 → 调整启动顺序,把 USB/CDROM 排第一(用于后续 Live USB 救援),或者直接 Save & Exit,下次启动时趁机按 Shift/ESC。

方法三:开机时强制拦截 GRUB(需卡时机)

时机要卡在 BIOS POST 结束、GRUB 加载瞬间:

  • BIOS 系统(MBR 引导)→ 一直按住 Shift
  • UEFI 系统 → 一直按住 ESC

推荐优先级:方法一(Live ISO)→ 方法二(bootdev bios)→ 方法三(卡时机按键)

Recovery Mode 卡死的诊断

如果选了 Recovery Mode 也卡住,先观察日志:

XFS (dm-0): Starting recovery (logdev: internal)
XFS (dm-0): Ending recovery (logdev: internal)   ← XFS 日志回放完成
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.     ← initramfs 最后阶段

系统还在走!XFS 日志回放完成、initramfs 最后阶段已到,系统正在从 initramfs 切换到真实根目录,之后会进入 systemd recovery 模式。

先等 60~120 秒:Recovery mode 下 systemd 会逐个检查 unit,损坏的库会让某些 unit 卡 90s 超时,不要以为死了就强制重启。

如果出现以下画面说明成功:

Give root password for maintenance
(or press Control-D to continue):

或者:

Welcome to recovery mode!
...
root@hostname:~#

如果 2 分钟后真的没反应,说明 libpam 损坏导致连 recovery shell 都拉不起来,必须走 Live ISO 路径:

bash
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis bootdev cdrom
ipmitool -I lanplus -H <IPMI_IP> -U admin -P <PASS> chassis power reset

挂载原系统磁盘

在临时系统的 root 终端中,严谨地挂载所有必须的原系统分区。

激活并挂载根分区(LVM 为例)

bash
# 激活所有 LVM 逻辑卷,并查看挂载结构
vgchange -ay
lsblk -f

# 挂载根目录到 /mnt
mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt

挂载引导分区与其他独立分区

必须挂载引导分区,以备后续重建内核与 GRUB。

bash
mkdir -p /mnt/boot /mnt/boot/efi
# 假设 nvme7n1p2 是 /boot,nvme7n1p1 是 efi
mount /dev/nvme7n1p2 /mnt/boot
mount /dev/nvme7n1p1 /mnt/boot/efi

# 若 /opt, /var/log 是独立 LV,也需挂载
mkdir -p /mnt/opt /mnt/var/log
mount /dev/mapper/ubuntu--vg-lv--opt /mnt/opt
mount /dev/mapper/ubuntu--vg-lv--var--log /mnt/var/log

绑定系统伪文件系统并进入 Chroot

bash
mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run

# 进入原系统
chroot /mnt /bin/bash

核心修复方案

进入 chroot 后,先定位哪些库被覆盖或删除:

bash
# 查看最近被改动的文件(时间戳暴露问题文件)
ls -lt /lib/x86_64-linux-gnu/ | head -20
ls -lt /usr/lib/x86_64-linux-gnu/ | head -20

⚠️ 运维红线:切勿直接从别处手工复制 .so 文件覆盖!这会导致包管理器状态不一致,埋下严重隐患。务必使用 dpkg/apt 重装!

根据服务器网络情况选择对应方案:

方案 A:网络正常(首选)

如果 chroot 环境中能解析外网或内网源:

bash
# 确保 DNS 可用(如果 apt 报网络不通,先执行这行)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
apt-get update

# 强制重装受损的核心组件包(以 OpenSSL/SSH/PAM 为例)
# Ubuntu 24.04 中 openssl 核心包为 libssl3t64
apt-get install --reinstall -y \
  openssl libssl3t64 libssl-dev \
  openssh-client openssh-server \
  libpam0g libpam-modules libpam-modules-bin libpam-runtime \
  libc6 systemd systemd-sysv libsystemd0 login passwd

⚠️ 重装 openssh-server 时若弹窗询问 sshd_config 配置,务必选择 "keep the local version currently installed",否则会导致业务自定义的 SSH 端口、密钥设置丢失!

方案 B:纯断网环境(同版本机器预下载 .deb)

在健康同版本主机上预下载依赖包:

bash
mkdir -p /root/repair && cd /root/repair
apt download openssl libssl3t64 libssl-dev openssh-client \
  openssh-server libpam0g libpam-modules libpam-modules-bin \
  libpam-runtime libc6 systemd systemd-sysv libsystemd0 login passwd

通过 U 盘传到故障机 /root/repair 目录下,在 chroot 环境中安装:

bash
cd /root/repair
dpkg -i ./*.deb || apt-get -f install

方案 C:绝境方案(无网且无 .deb 包)

⚠️ 仅当手头没有任何安装包,又必须在 5 分钟内拉起业务时使用。事后必须用方案 A/B 洗白包状态!

bash
# 退出 chroot
exit
# 强行覆盖底层库(从外层 Live 系统拷贝)
cp -af /usr/lib/x86_64-linux-gnu/libcrypto.so* \
  /mnt/usr/lib/x86_64-linux-gnu/
cp -af /usr/lib/x86_64-linux-gnu/libssl.so* \
  /mnt/usr/lib/x86_64-linux-gnu/
cp -af /usr/lib/x86_64-linux-gnu/libpam.so* \
  /mnt/usr/lib/x86_64-linux-gnu/

重建引导与系统验证

重新安装核心库后,必须重建系统缓存并验证:

bash
# 在 chroot 环境下执行
ldconfig
update-initramfs -u -k all
update-grub

# 验证库是否正常
openssl version -a
/usr/sbin/sshd -t  # 报 Missing privilege separation directory /run/sshd 可忽略

安全退出与重启

⚠️ 务必按顺序卸载所有挂载点,防止文件系统损坏!

bash
exit

umount /mnt/run
umount /mnt/sys
umount /mnt/proc
umount /mnt/dev/pts 2>/dev/null || true
umount /mnt/dev
umount /mnt/boot/efi
umount /mnt/boot
umount /mnt/var/log 2>/dev/null || true
umount /mnt/opt 2>/dev/null || true
umount /mnt

reboot

重启前记得断开 Virtual Media 挂载。

善后:修复 SOL 控制台乱码

为防止未来用 IPMI SOL(串口)排错时再次看到 ^[e^[e 乱码,系统恢复后修改 GRUB 禁用图形终端:

bash
sudo vim /etc/default/grub

增加或修改为纯文本/串口兼容模式:

bash
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"

# 务必注释掉强制图形模式:
# GRUB_GFXMODE=...

应用生效:

bash
sudo update-grub

用心记录,持续学习 | CNB