Linux 系统的 lib
目录下的库对系统的正常运行起着非常关键的作用,一旦误操作将导致系统瘫痪。
问题表现
由于操作失误,把 /usr/lib64
重命名成了 /usr/lib64.bak
,结果发现执行命令的时候报错了。
1 | # mv命令无法使用 |
想使用 mv
把文件重命名回来已经不行了,就连重新 ssh 远程都远程不了。
修复方法
1、如果机器允许重启,最直接的办法就是挂载光盘进入修复模式将名字改回来,或者是安装 glibc
2、系统一般情况下会设置 LD_LIBRARY_PATH
, LD_PRELOAD
这两个环境变量,来改变应用程序所调用库文件的路径。这两个环境变量只对应用程序有效,可能会对 shell 命令不起作用。
1 | export LD_LIBRARY_PATH=/usr/lib64.bak |
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
的方式把重要的配置文件输出到屏幕,然后复制粘贴出来,算是做一个备份。至于机器,只能重启挂载光盘进修复模式恢复了。如果是云主机则尝试恢复快照,没快照就认栽吧。