在做实验的过程中,对于一些系统关键的库,要小心使用,稍不留神就会造成系统的瘫痪,比如小编在做实验的时候不小心将/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的时候找不到该文件,后来经过查找资料才得以解决,下面小编将我的方法分享给大家:

j_0069.gif

在开始解决问题之前我们首先的搞清几个概念:

*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),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。

i_f27.gif

以上都是概念的补充,接下来我们会用到。

造成系统找不到libc.so.6库的原因有三种:

*)文件的名字被更改了,即重命名。

*)文件被移动到别的目录了。

*)文件被删除了。

针对以上三种情况,前两种情况可以看作一种情况处理,文件还在,就是路径系统找不到了,这种情况相对来说要好办一点,对于第三种情况,文件整个都不存在了,这个时候我们就得借助外部的文件进行解决。

我们首先来看一下系统加载libc.so.6的路径信息:

wKiom1l8kT_iVJXwAAA4FoJCwrE705.png

在系统中,libc.so.6的路径明确指明是/lib64/libc.so.6如果此路径发生变化或者文件名对不上号了,都会导致系统找不到该共享文件。

第一种:文件存在,系统找不到

对于这种情况,我们不能再将文件重新复制到或移动到原目录中,因为mv和cp等大多数命令都不能执行了,所以我们看着就是挺着急没办法,首先我们来看一下这种情况:

wKioL1l6je2Qeb5JAAArJ3UP4BQ697.png

移动了libc.so.6文件

wKioL1l8j5qBa7zSAAAbsgJ4tkU129.png

重命名了libc.so.6文件

ls命令和id命令都不能使用了,这个时候我们就用到LD_PRELOAD这个环境变量了,经过上面的知识补充,我们知道,通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。现在我们可以使用这个环境变量来临时加载还存在但是不在原目录或是名字被篡改了的库文件,在临时添加环境变量的后面接上我们要执行的命令就可以将libc.so.6库恢复到原来的样子,让小编带你进行实验验证:

wKiom1l8jsKATZgrAAAhA3jYDA4831.png

将移动的文件恢复

wKiom1l8kIiy2nibAAAgvsRHVNs590.png

将重命名的文件恢复

第二种:文件被删除,不存在了

对于这种情况比较复杂,我们不能通过本地直接进行恢复,我们必须借助外面的文件进行恢复,具体的思路就是通过加载光盘系统文件,将该函数库重新拷贝到本地系统中来,达到恢复的目的,让小编画图来说明:

wKiom1l6iYWzla6qAABavyNE6GU882.png

我们要借助光盘系统将光盘系统中的/lib64/libc.so.6拷贝到本地系统的/lib64/中,达到恢复的目的。

光盘系统和本地系统都是Linux系统,所以有着相似的根目录,需要把本地系统的根挂载到光盘系统根下的一个子目录中,系统默认挂载到/mnt/sysimage/下,这里的/mnt/sysimage/就是我们本地系统的,接下来跟随小编来看一看具体的步骤吧。

首先小编先将我本地的libc.so.6文件删除,为接下来的实验做准备。

wKioL1l9nYHCN8UXAAAuLt0CErI138.png

wKioL1l9nYGyvVOoAAAiC9wCR1E703.png

在没有这个库文件的情况下,我们是不能使用命令正常关机或重新启动的,我们是在虚拟机的情况下进行的实验所以此步骤仅供参考,不过原理都是一样的。

我们要在虚拟机上进行强制重新启动,如图所示:

wKioL1l9nd7h8Mc6AABOAcJmeRc276.png

在启动前我们需要把系统镜像挂载到CD/DVD(IDE)上,如下图所示:

wKioL1l9noPjn-MFAAAdh7UCAXo530.png

当进入开机画面的时候要快速的按一下ESC键,进入如下所示的界面,(我们要把鼠标点进虚拟机中,这样执行的操作才是对虚拟机的指令,不要按的太快,别错过这个界面。)选择第三项:光盘驱动。

wKiom1l9nsbA2pwuAAARueORB50861.png

这个时候我们会进入装机引导界面,这几项分别是:安装或升级存在的系统、安装系统用基本视频驱动、恢复安装的系统、从当地驱动器启动、内存测试。我们要选择恢复安装的系统,如下图所示:

wKiom1l9nzCS3OItAAaP6HzcF70662.png

之后会进入选择语言的界面,请根据以下小编的步骤一步步进行:

wKioL1l9n9rS09nZAAA7YM-Fm8E550.png

wKiom1l9n9rhbKaLAAA6fJPFv4c216.png

wKioL1l9n9vBSmQ9AAAsZDUwRu0086.png

wKiom1l9n9vT9RGrAABZ23OhcqQ983.png

这里显示,你的系统将会被挂载到/mnt/sysimage目录下,如果你想在本地硬盘root环境下操作,运行命令:chroot /mnt/sysimage

wKiom1l9n9zjYTiTAABLbDipGqc542.png

wKioL1l9n9yj1AIzAAApsw-Dtvc982.png

当你选择OK之后系统就会Start shell,如下所示的命令行,此时,我们进入的是光盘系统下的Linux,切记,不要弄混乱了。

wKioL1l9n9ywHm45AAAxNnUBhOs421.png

这里有必要说明以下,目前进入的系统是光盘中引导的Linux系统,不是真实的本地系统,我们真正的系统刚才也提示过了,被挂载到了/mnt/sysimage中,所以除了/mnt/sysimage下的东西,别的都是光盘系统中国的文件。

wKioL1l9oiKhk9RQAAAu1ofRR8o735.png

我们的本地系统中没有了libc.so.6这个文件,所以我们需要将光盘系统中的这个文件进行copy到本地系统中,并放到原来的目录下,这里一定要看清楚自己所在的目录,尽量使用相对路径来进行复制:如小编操作所示:

wKiom1l9oiLCwGn9AAAF40ES7aI781.png

进行完文件的恢复之后,我们还要对本地系统下的selinux这个文件进行修改,根据我们前面的只是补充,我们知道selinux是一种强制访问安全控制系统,当我们对系统中的重要文件进行了更改之后,重新启动的过程中,这个安全控系统会检测到我们对本地系统进行了更改,因为机器本身不具有检测文件安全性的功能,所以机器本身能做的最好的决定就是,不让你启动,我们在上面的知识扩展中也了解到,selinux一共有三种选择:

*disabled就不用说了,是禁止的意思。

*permissive就是Selinux有效,

*Enforcing就是你违反了策略,你就无法继续操作下去。

在我们知情的情况下,我们复制了该文件,并且该文件也是安全的,所以我们可以经SELIUNX的值修改为disabled,不执行安全监测,可以让我们正常启动,当然在我们正常启动并恢复后,我们可以再将该值修改回来,开启安全监测功能。小编的操作如下:

wKioL1l9oiPyxf0EAAAFDIrcS6w211.png

一定要记得,是需要对本地系统的selinux进行的操作,如果修改成了光盘系统中的selinux,那么是不能正常启动的。请一定确定路径的正确性。

wKioL1l9oiOAlTcJAABIaV-L3HI357.png

nano编辑器中,我们修改好之后要进行ctrl + o进行保存,Ctrl +x进行退出。退出之后,我们进行重启。

wKiom1l9oiTCVFWoAAAEwresCF8577.png

等到重启完成我们就可以进入正常的系统了,如下图所示:

wKiom1l9oibwIjETAAPrlqGASME753.png

通过这次的实验和学习,我们不仅知道了如何恢复libc.so.6文件,(其实,这种方式也适用于其他重要文件的恢复)还学习到了三个知识点:

明白了libc.so.6文件的作用以及该文件对系统的重要性。

知道了selinux是一种基于-类型模型(domain-type)的强制访问控制(MAC)安全系统

知道了LD_PRELOAD是一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。

收获满满!

j_0003.gif

CentOS中误删除libc.so.6系统库文件,如何恢复?的更多相关文章

  1. ios – 存档期间不存在Xcode环境变量

    我有一个具有TestFlight构建方案的iOS应用程序.在此方案中,我在“运行”选项卡中设置了一个称为TESTFLIGHT的环境变量,值为1.此外,在构建方案的“配置文件”选项卡中,它已选中“使用RUn操作的参数和变量”选项,并在列表中看到相应的EV.当从Xcode运行应用程序时,这可以正常工作,但是当我在存储设备上运行应用程序时,环境变量TESTFLIGHT不存在.我的问题是有一个我在这里缺少的选项/方案选项卡?

  2. ios – 为什么在Swift中使用私有属性/方法并不常见

    为什么在Swift/Cocoa中你很少看到私有访问器用于你不希望程序的其他部分访问的属性?有人可以如此善良并解释一般的概念访问器吗?

  3. Swift 新特性 - 访问控制Access Control

    模块和源文件Swift中的访问控制模型基于模块和源文件这两个概念。在Swift中,Framewordk或Appbundle被作为模块处理。访问级别Swift提供了三种不同的访问级别。通常情况下,某个接口或Framework作为内部结构使用时,你可以将其设置为internal级别。访问控制语法通过修饰符public、internal、private来声明实体的访问级别:除非有特殊的说明,否则实体都使用默认的访问级别internal,可以查阅默认访问级别这一节。

  4. [翻译]Swift编程语言——访问控制

    Protocolscanberestrictedtoacertaincontext,ascanglobalconstants,variables,andfunctions.除了提供访问控制的多种级别,Swfit通过提供默认访问级别来限制需要指定明确访问级别的需要。模块和源文件Swfit的访问控制模型是基于模块和源文件概念的。访问级别Swift提供了三种访问级别。Private限制只能在实体对象的定义文件使用它们。Public是最高的访问级别,Private是最低的访问级别。下文会涵盖针对Swfit语言的不

  5. 2015年2月到2015年6月8日2.0发布Swift主要更新

    存放的元素需要遵循hashable协议。调用一个抛出错误的函数/方法/闭包,前面要用try。捕获和处理错误do-catch格式:do{尽量确保能捕获所有错误。catch不指定匹配模式将匹配所有错误。调用,不必处理错误。如有错误发生,会导致运行时错误。多个defer语句按照定义顺序倒叙执行。

  6. Swift学习之 访问控制

    模块和源文件Swift中的访问控制模型基于模块和源文件这两个概念。在Swift中,Framework或Appbundle被作为模块处理。访问级别Swift提供了三种不同的访问级别。Public为最高级访问级别,Private为最低级访问级别。访问控制语法通过修饰符public、internal、private来声明实体的访问级别:publicclassSomePublicclass{}internalclassSomeInternalClass{}privateclassSomePrivateClass{

  7. Swift学习笔记系列——24访问控制

    Swift学习笔记系列——访问控制访问控制的对象单个的类、结构体和枚举属于1的属性、方法、构造方法和下标协议的适用范围模块和源文件访问控制的基础模块一系列代码,Xcode中的一个构造目标源文件单独的源代码文件三种访问级别public本模块的任意源文件内可以访问导入所在模块的其他模块的源文件可以访问Internal默认的访问级别同一模块的任意源代码中都可以访问Private同一源文件可以访问访问级别的指导原则衍生物的访问级别不能高于母体。

  8. Swift访问控制(Access Control)

    当你在Swift编写一个类时,默认其中任何属性,方法都能被外部访问的。在swfit用于访问控制的有三个关键字。如你使用XCTest测试某个类时,就需要在类前添加public。internal:swift默认访问控制,允许在项目内访问。private:私人访问,只能在当前类中访问。

  9. Swift 的访问控制private,internal,public

    在Swift语言中,访问修饰符有三种,分别为private,internal和public。同时,Swift对于访问权限的控制,不是基于类的,而是基于文件的。如果是App代码,也是在整个App代码,也是在整个App内部可以访问。

  10. Swift新特性 -- 访问控制Access Control

    模块和源文件Swift中的访问控制模型基于模块和源文件这两个概念。在Swift中,Framewordk或Appbundle被作为模块处理。访问级别Swift提供了三种不同的访问级别。通常情况下,某个接口或Framework作为内部结构使用时,你可以将其设置为internal级别。访问控制语法通过修饰符public、internal、private来声明实体的访问级别:除非有特殊的说明,否则实体都使用默认的访问级别internal,可以查阅默认访问级别这一节。

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部