CentOS的lib库误操作和修复

Linux 系统的 lib目录下的库对系统的正常运行起着非常关键的作用,一旦误操作将导致系统瘫痪。

问题表现

由于操作失误,把 /usr/lib64 重命名成了 /usr/lib64.bak,结果发现执行命令的时候报错了。

1
2
3
4
5
6
7
8
9
10
11
# mv命令无法使用
-bash: /bin/mv: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

# cp命令无法使用
-bash: /bin/cp: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

# ls命令无法使用
-bash: /bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

# ssh命令无法使用
-bash: /usr/bin/ssh: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

想使用 mv 把文件重命名回来已经不行了,就连重新 ssh 远程都远程不了。

修复方法

1、如果机器允许重启,最直接的办法就是挂载光盘进入修复模式将名字改回来,或者是安装 glibc

2、系统一般情况下会设置 LD_LIBRARY_PATHLD_PRELOAD 这两个环境变量,来改变应用程序所调用库文件的路径。这两个环境变量只对应用程序有效,可能会对 shell 命令不起作用。

1
2
3
export LD_LIBRARY_PATH=/usr/lib64.bak
export LD_PRELOAD=/usr/lib64.bak
cp /usr/lib64.bak /usr/lib64

3、使用 ld-linux-x86-64.so.2 修复。在一个正常的操作系统上 /lib64/ld-linux-x86-64.so.2 其实只是个软链,真实文件是 /usr/lib64/ld-2.17.so,这个文件本身并不是库文件,可以简单的认为他是库文件的管理程序。ld-linux-x86-64.so.2 是操作系统的核心,并不受 LD_LIBRARY_PATH 环境变量的影响。如果想改变其调用方式,可以查看 man文档

1
/lib64/ld-linux-x86-64.so.2 --library-path /lib64.bak /bin/cp /lib64.bak /lib64 -afr

其他问题

如果是误删除 /lib64/ld-linux-x86-64.so.2 了怎么办呢?还是和上面第三种方法相同,删除的只是软连接文件,使用原始文件将其链接回来即可。

1
/lib64/ld-2.17.so  --library-path /lib64/ld-2.17.so /bin/ln -sv /lib64/ld-2.17.so /lib64/ld-linux-x86-64.so.2

误删除了 /lib64,这个是致命的故障。如果你现在还没有关闭 SSH 连接,请使用内置命令 while read 的方式把重要的配置文件输出到屏幕,然后复制粘贴出来,算是做一个备份。至于机器,只能重启挂载光盘进修复模式恢复了。如果是云主机则尝试恢复快照,没快照就认栽吧。

有钱任性,请我吃包辣条
0%