误删除libc.so.6 恢复

一、我是怎样一步一步毁掉系统的

    最近在centos 7上进行开发。由于需要使用高版本linux内核的特性,需要将linux内核升级。按照教程:centos 7升级内核 进行升级的时候发现在安装elrepo的yum源时遇到问题说elrepo-release-7.0-2.el7.elrepo.noarch.rpm 需要glibc-2.17。 
    使用ldd --version 发现系统的glibc版本为 glibc-2.22,当时没有想到更好的方法,就尝试将系统的glibc版本修改为glibc-2.17. 
    于是按照stackoverflow上的教程

1
2
3
4
5
6
7
8
9
10
11
You cannot update glibc on Centos 6 safely. However you can install 2.14 alongside 2.12 easily, then use it to compile projects etc. Here is how:
mkdir ~/glibc_install; cd ~/glibc_install
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
tar zxvf glibc-2.14.tar.gz
cd glibc-2.14
mkdir build
cd build
../configure --prefix=/opt/glibc-2.14
make -j4
sudo make install
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib

 

进行编译安装 glibc-2.17. 
    当make install 完成之后,看教程上说需要将 /lib64/libc.so.6 软链接更新为 /usr/local/glibc-1.7/lib/libc-2.17.so,于是我准备删除 /lib64/libc.so.6,然后新建一个指向/usr/local/glibc-1.7/lib/libc-2.17.so.然后我就删除了 /lib64/libc.so.6,然后,就没有然后了。。。

  1. libc.so.6 c运行时库 glibc的软链接,而系统几乎所有程序都依赖c运行时库。程序启动和运行时,是根据libc.so.6 软链接找到glibc库。删除libc.so.6将导致系统的几乎所有程序不能工作。
  2. 每个glibc.so文件有它支持的libc版本,可以通过# strings /lib64/libc.so.6 |grep GLIBC_ 查看。如果程序编译的时候链接的libc库版本不在程序运行环境下的glibc库支持的libc版本之内,也会报错.

    于是,系统的所有命令 ls,cp,cd 等等都无法使用了。

二、修复系统

    赶紧百度了下该怎么处理,发现说使用系统光盘或者U盘进入修复模式,在修复模式下新建 libc.so.6 软链接。于是我就按照教程centos7 营救模式 和 lic.so.6 缺失问题的做法修复。大体步骤是:

1
2
3
4
5
1.搞到系统光盘或者U盘
2.开机设置bios由光盘或U盘启动
3.选择 troubleshooting,rescue a centos system
4.进入终端,系统提示说 原系统的目录被mount到/mnt/sysimage下,于是进入/mnt/sysimage,此时就可以使用ln -s命令创建软链接了。
5.重启,搞定

 

更简单的做法 
    这种做法要求在删除libc.so.6之后没有关闭shell或者ssh连接的情况下紧急处理。按照教程libc.so.6: cannot open shared object file报错处理所说,执行

1
2
3
4
5
先删除连接 :
# cd /lib64
建立新连接 :
# LD_PRELOAD=/usr/local/glibc-2.17/libc-2.17.so ln -s /usr/local/glibc-2.17/libc-2.17.so /lib64/libc.so.6
#注意 LD_PRELOAD和后面的ln -s在同一行

 

    LD_PRELOAD的解决原理是,linux调用so库文件时,先搜索当前路径,然后是系统库目录,提供LD_PRELOAD系统变量可以改变这个顺序,改变后的搜索顺序为 LD_PRELOAD, 当前路径, 系统库目录 
    于是,使用LD_PRELOAD指向正常的glibc库文件,然后执行ln等命令,就可以正常执行,执行成功之后, libc.so.6 就又存在了。

posted @   农民伯伯-Coding  阅读(11101)  评论(0编辑  收藏  举报
编辑推荐:
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
历史上的今天:
2015-10-31 c++11 其他特性(一)
2015-10-31 c++11 数值类型和字符串的相互转换
2015-10-31 c++11 处理时间和日期
点击右上角即可分享
微信分享提示