一 、背景
- 在Ubuntu手动源码安装glibc,直接手动将libc-2.34.so替换原libc-2.31.so,导致系统崩溃,基本指令无法使用
// 正常指向
op@ubuntu ~ 15:49 $ ls /lib/x86_64-linux-gnu/libc.so.6 -alh
lrwxrwxrwx 1 root root 12 May 1 02:20 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.31.so
op@ubuntu ~ 15:49 $
//准备手动更改libc.so.6的链接文件,备注:libc-2.34.so是源码生成的动态库
op@ubuntu /lib/x86_64-linux-gnu 15:50 $ sudo ln -s libc-2.34.so libc.so.6
ln: failed to create symbolic link 'libc.so.6': File exists
op@ubuntu /lib/x86_64-linux-gnu 15:50 $
//手动删除了libc.so.6,直接导致终端指令基本全部无法使用了
op@ubuntu /lib/x86_64-linux-gnu 15:50 $ sudo rm libc.so.6
sed: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
grep: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
op@ubuntu /lib/x86_64-linux-gnu 15:51 $
- 悲剧的开始, 在非root用户手动删除了
libc.so.6
文件,导致无法使用sudo
指令去重新建立软链接
二、通过LD_PRELOAD参数临时执行基本命令
op@ubuntu /sbin 16:15 $ LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.31.so ls
aa-remove-unknown cracklib-unpacker fdisk installkernel ldconfig.real ntfs
aa-status crda filefrag install-sgmlcatalog locale-gen ntfs
aa-teardown create-cracklib-dict findfs invoke-rc.d logrotate ntfs
accessdb cron fixparts ip logsave on_a
acpid ctrlaltdel fsck ip6tables losetup open
addgnupghome cupsaccept fsck.cramfs ip6tables-apply lpadmin owne
addgroup cups-browsed fsck.ext2 ip6tables-legacy lpc pam-
add-shell cupsctl fsck.ext3
-
误删除libc.so.6 恢复
(1)" LD_PRELOAD的解决原理是,linux调用so库文件时,先搜索当前路径,然后是系统库目录,提供LD_PRELOAD系统变量可以改变这个顺序,改变后的搜索顺序为 LD_PRELOAD, 当前路径, 系统库目录
" -
修改libc.so.6导致系统命令都不能用? 博客所述:
(1)“在每条命令前加上 LD_PRELOAD=/lib64/libc-2.12.so 前缀,不能使用的命令可以重新使用。例如 LD_PRELOAD=/lib64/libc-2.12.so ls,ls命令可以重新使用”
(2)" LD_PRELOAD可以影响程序的运行时的链接(Runtime linker), 它允许你定义在程序运行前优先加载的动态链接库,之前把libc.so.6这个软连接给干掉了,所以系统找不到这个库了,但是通过LD_PRELOAD设置一下glibc这个库的真实地址就可以解决这个问题了
LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6
"备注
:但是上述指令需要使用sudo
执行才有效,但是LD_PRELOAD=/lib64/libc-2.12.so sudo
依旧无法进入root模式,因为LD_PRELOAD仅在当前op用户下才生效 -
记glibc升级失败后的恢复
(1)“export命令,用于指定临时使用的环境变量。使用export LD_PRELOAD=”/opt/glibc-2.14/lib/libc-2.14.so" 只要指定了正确的so文件(这里需要指向你编译的或者是备份的so文件),所有的命令就可以使用了。"
sln命令
-
rm或者mv误删或改动过libc.so.6后,此时 ln -s 已经不能使用了,可以使用sln命令恢复软链接。
-
sln 命令是一个专门用于创建静态链接(static link)的工具,通常用于系统引导过程中。它的主要目的是在系统的早期引导阶段创建符号链接,而不依赖于动态链接库(shared libraries)。sln 通常在 /sbin 目录下,只有在系统管理员需要在单用户模式或系统恢复模式下工作时才会使用。
-
功能区别:
(1)功能:
ln:用于创建硬链接和符号链接,适用于一般用途。
sln:专门用于创建符号链接,主要用于系统引导和恢复过程中,不依赖于动态链接库。
(2)使用场景:
ln:日常文件管理和链接创建。
sln:系统管理员在单用户模式或系统恢复模式下使用,特别是在系统引导过程中。
(3)依赖性:
ln:可能依赖于动态链接库。
sln:不依赖于动态链接库,适用于系统的早期引导阶段。
三、 新建虚拟机
- 可以新建一个虚拟机,在新虚拟机设置中,将旧虚拟机虚拟磁盘添加到“硬盘”中,再挂载新硬盘,重新建立软链接即可,建立完成后,可以通过chroot测试效果。
四、通过CD/DVD(SATA)加载ISO映像修复
- 如果不想新建虚机机,可以在原虚拟机中,通过CD/DVD(SATA)加载ISO映像修复
- 修改系统启动项顺序,CD-ROM Drive前移
- 系统启动后,选择“try ubuntu”修复
五、正确升级glibc
-
aptitude
是一个高级的包管理工具,主要用于基于 Debian 的 Linux 发行版(如 Debian 和 Ubuntu)。它提供了一个命令行界面和一个基于文本的用户界面,用于安装、更新和删除软件包。aptitude 是 apt-get 和 apt 的高级替代品,提供了更多的功能和更好的依赖关系处理。 -
首先,更新源,在/etc/apt/sources.list文件末尾增加,参考博文Ubuntu20.04更新GLIBC到2.35版本
deb http://mirrors.aliyun.com/ubuntu/ jammy main
- 新增源后,执行
sudo apt update
,再通过sudo apt-cache policy libc6
查看可用版本,可看到Candidate: 2.35-0ubuntu3
,参考博文ubuntu20.04 GLIBC从2.35降级到2.31
op@ubuntu ~ 19:05 $ sudo apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
Get:2 http://mirrors.aliyun.com/ubuntu jammy InRelease [270 kB]
Ign:3 http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal InRelease
Err:4 http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal Release
404 Not Found [IP: 185.125.190.80 80]
Get:5 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages [1,395 kB]
Hit:6 http://us.archive.ubuntu.com/ubuntu focal InRelease
Get:7 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [65.3 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 DEP-11 Metadata [212 B]
Get:9 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [160 kB]
Get:10 http://mirrors.aliyun.com/ubuntu jammy/main i386 Packages [1,040 kB]
Get:11 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 DEP-11 Metadata [940 B]
Get:12 http://mirrors.aliyun.com/ubuntu jammy/main Translation-en [510 kB]
Get:13 http://mirrors.aliyun.com/ubuntu jammy/main amd64 DEP-11 Metadata [423 kB]
Get:14 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 48x48 Icons [100.0 kB]
Get:15 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 64x64 Icons [148 kB]
Get:16 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 64x64@2 Icons [15.8 kB]
Get:17 http://mirrors.aliyun.com/ubuntu jammy/main amd64 c-n-f Metadata [30.3 kB]
Reading package lists... Done
E: The repository 'http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $ sudo apt-cache policy libc6
libc6:
Installed: 2.31-0ubuntu9.16
Candidate: 2.35-0ubuntu3
Version table:
2.35-0ubuntu3 500
500 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages
*** 2.31-0ubuntu9.16 500
500 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages
100 /var/lib/dpkg/status
2.31-0ubuntu9 500
500 http://us.archive.ubuntu.com/ubuntu focal/main amd64 Packages
op@ubuntu ~ 19:06 $
- 开始升级
aptitude install libc6=2.35-0ubuntu3
op@ubuntu ~ 19:06 $ sudo aptitude install libc6=2.35-0ubuntu3
The following NEW packages will be installed:
libcom-err2:i386{
a} libgssapi-krb5-2:i386{
a} libk5crypto3:i386{
a} libkeyutils1:i386{
a} libkrb5-3:i386{
a} libkrb5support0:i38
libnss-nisplus:i386{
a} libssl3{
a} libssl3:i386{
a} libtirpc-common{
a} libtirpc3{
a} libtirpc3:i386{
a}
The following packages will be REMOVED:
libxcb-xv0{
u} xserver-xephyr{
u}
The following packages will be upgraded:
fakeroot libc-bin libc6 libc6:i386 libcom-err2 libfakeroot libgssapi-krb5-2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5suppo
12 packages upgraded, 17 newly installed, 2 to remove and 1398 not upgraded.
Need to get 16.9 MB of archives. After unpacking 11.7 MB will be used.
The following packages have unmet dependencies:
libc6-dbg : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
libc6-dev : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
libc6-x32 : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
libc6-i386 : Depends: libc6 (= 2.31-0ubuntu9.16