CentOS中误删除libc.so.6系统库文件,如何恢复?

在做实验的过程中,对于一些系统关键的库,要小心使用,稍不留神就会造成系统的瘫痪,比如小编在做实验的时候不小心将/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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 安装Supervisor 1 yum install python-setuptools
设置时区(CentOS 7) 先执行命令timedatectl status|grep 'Time zone'查看当前时区,如果不是时区(Asia/Shanghai),则需要先设置为中国时区,否则时区不同会存在时差。 #已经是Asia/Shanghai,则无需设置 [root@xia
vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" ONBOOT=yes IPADDR=192.168.8.106 NETMASK=255.255.252.0 GATEWAY=192.168.
一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [root@localhost local]# yum install -y gcc 二、下载并解压安装包 [root@localhost local
第一步 On CentOS/RHEL 6.*: $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm On CentOS/RHEL 7: $
/// <summary> /// 取小写文件名后缀 /// </summary> /// <param name="name">文件名</param> /// <returns>返回小写后缀,不带“.”</ret
which nohup .bash_profile中并source加载 如果没有就安装吧 yum provides */nohup nohup npm run start & nohup ./kibana &
1.1 MySQL安装 1.1.1 下载wget命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装My
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 top 日期 date 设置时间 date 033017002015 #月日时间年 日历 cal
1、firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 :
1 下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令就直接下载了安装用的Yum Repository,大概
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。 一、相关命令 通过initctl help可以查看相关命令 [root@localhost ~]# initctl help Job commands: start Start job. sto
1、使用命令:df -lk 找到已满磁盘 2、使用命令:du --max-depth=1 -h 查找大文件,删除
ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储位置: /etc/services文件 route:查看路由信息 wget:下载网路文件,例如 wg
ps -ef:查看所有进程, ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 kill 640,强制杀:kill -9 640 man:查看帮助,例如 man ps 查看
useradd:添加用户 useradd abc,默认添加一个abc组 vipw:查看系统中用户 groupadd:添加组groupadd ccna vigr:查看系统中的组 gpasswd:将用户abc添加到ccna组 gpasswd -a abc ccna groups abc:查看用户abc属