在做实验的过程中,对于一些系统关键的库,要小心使用,稍不留神就会造成系统的瘫痪,比如小编在做实验的时候不小心将/lib64/libc.so.6这个系统共享库给不小心删除了,可能刚开始不知道这个库的重要性,结果下一秒就后悔了,因为系统大部分的命令都不能正常使用了,会显示一个:error while loading shared libraries: libc.so.6:cannot open shared object file: No such file or directory。 提示当加载共享库libc.so.6的时候找不到该文件,后来经过查找资料才得以解决,下面小编将我的方法分享给大家:
在开始解决问题之前我们首先的搞清几个概念:
*Libc.so.6共享库是干什么的?
*Selinux是什么鬼?
*LD_ORELOAD是什么东东?
经过小编在因特网上翻江倒海之后,终于弄清除了这些东西都是什么鬼:
Libc.so.6共享库是Linux平台提供的C的标准库,提供了函数的实现,大多数库函数在libc中 ,这就解释了为什么缺少了这个库那么多的命令都运行不了了。
Selinux:以下解释来自于百度文库,SeLinux(Security-EnhancedLinux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件SeLinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SeLinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。
SELINUX有「disabled」「permissive」,「enforcing」3种选择。
*Disabled就不用说了,
*permissive就是Selinux有效,
*Enforcing就是你违反了策略,你就无法继续操作下去。
LD_PRELOAD简介:在UNIX的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtimelinker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。
以上都是概念的补充,接下来我们会用到。
造成系统找不到libc.so.6库的原因有三种:
*)文件被移动到别的目录了。
针对以上三种情况,前两种情况可以看作一种情况处理,文件还在,就是路径系统找不到了,这种情况相对来说要好办一点,对于第三种情况,文件整个都不存在了,这个时候我们就得借助外部的文件进行解决。
在系统中,libc.so.6的路径明确指明是/lib64/libc.so.6如果此路径发生变化或者文件名对不上号了,都会导致系统找不到该共享文件。
第一种:文件存在,系统找不到
对于这种情况,我们不能再将文件重新复制到或移动到原目录中,因为mv和cp等大多数命令都不能执行了,所以我们看着就是挺着急没办法,首先我们来看一下这种情况:
移动了libc.so.6文件
ls命令和id命令都不能使用了,这个时候我们就用到LD_PRELOAD这个环境变量了,经过上面的知识补充,我们知道,通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。现在我们可以使用这个环境变量来临时加载还存在但是不在原目录或是名字被篡改了的库文件,在临时添加环境变量的后面接上我们要执行的命令就可以将libc.so.6库恢复到原来的样子,让小编带你进行实验验证: 将移动的文件恢复 将重命名的文件恢复
对于这种情况比较复杂,我们不能通过本地直接进行恢复,我们必须借助外面的文件进行恢复,具体的思路就是通过加载光盘系统文件,将该函数库重新拷贝到本地系统中来,达到恢复的目的,让小编画图来说明:
我们要借助光盘系统将光盘系统中的/lib64/libc.so.6拷贝到本地系统的/lib64/中,达到恢复的目的。
光盘系统和本地系统都是Linux系统,所以有着相似的根目录,需要把本地系统的根挂载到光盘系统根下的一个子目录中,系统默认挂载到/mnt/sysimage/下,这里的/mnt/sysimage/就是我们本地系统的根,接下来跟随小编来看一看具体的步骤吧。
首先小编先将我本地的libc.so.6文件删除,为接下来的实验做准备。
在没有这个库文件的情况下,我们是不能使用命令正常关机或重新启动的,我们是在虚拟机的情况下进行的实验所以此步骤仅供参考,不过原理都是一样的。
我们要在虚拟机上进行强制重新启动,如图所示:
在启动前我们需要把系统镜像挂载到CD/DVD(IDE)上,如下图所示:
当进入开机画面的时候要快速的按一下ESC键,进入如下所示的界面,(我们要把鼠标点进虚拟机中,这样执行的操作才是对虚拟机的指令,不要按的太快,别错过这个界面。)选择第三项:光盘驱动。
这个时候我们会进入装机引导界面,这几项分别是:安装或升级存在的系统、安装系统用基本视频驱动、恢复安装的系统、从当地驱动器启动、内存测试。我们要选择恢复安装的系统,如下图所示:
之后会进入选择语言的界面,请根据以下小编的步骤一步步进行:
这里显示,你的系统将会被挂载到/mnt/sysimage目录下,如果你想在本地硬盘root环境下操作,运行命令:chroot /mnt/sysimage
当你选择OK之后系统就会Start shell,如下所示的命令行,此时,我们进入的是光盘系统下的Linux,切记,不要弄混乱了。
这里有必要说明以下,目前进入的系统是光盘中引导的Linux系统,不是真实的本地系统,我们真正的系统刚才也提示过了,被挂载到了/mnt/sysimage中,所以除了/mnt/sysimage下的东西,别的都是光盘系统中国的文件。
我们的本地系统中没有了libc.so.6这个文件,所以我们需要将光盘系统中的这个文件进行Copy到本地系统中,并放到原来的目录下,这里一定要看清楚自己所在的目录,尽量使用相对路径来进行复制:如小编操作所示:
进行完文件的恢复之后,我们还要对本地系统下的selinux这个文件进行修改,根据我们前面的只是补充,我们知道selinux是一种强制访问安全控制系统,当我们对系统中的重要文件进行了更改之后,重新启动的过程中,这个安全控系统会检测到我们对本地系统进行了更改,因为机器本身不具有检测文件安全性的功能,所以机器本身能做的最好的决定就是,不让你启动,我们在上面的知识扩展中也了解到,selinux一共有三种选择:
*Disabled就不用说了,是禁止的意思。
*permissive就是Selinux有效,
*Enforcing就是你违反了策略,你就无法继续操作下去。
在我们知情的情况下,我们复制了该文件,并且该文件也是安全的,所以我们可以经SELIUNX的值修改为Disabled,不执行安全监测,可以让我们正常启动,当然在我们正常启动并恢复后,我们可以再将该值修改回来,开启安全监测功能。小编的操作如下:
一定要记得,是需要对本地系统的selinux进行的操作,如果修改成了光盘系统中的selinux,那么是不能正常启动的。请一定确定路径的正确性。
在nano编辑器中,我们修改好之后要进行ctrl + o进行保存,Ctrl +x进行退出。退出之后,我们进行重启。
等到重启完成我们就可以进入正常的系统了,如下图所示:
通过这次的实验和学习,我们不仅知道了如何恢复libc.so.6文件,(其实,这种方式也适用于其他重要文件的恢复)还学习到了三个知识点:
明白了libc.so.6文件的作用以及该文件对系统的重要性。
知道了selinux是一种基于域-类型模型(domain-type)的强制访问控制(MAC)安全系统。
知道了LD_PRELOAD是一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。