Linux 7年前

linux删除了libc.so.6

作者头像 刘宇帅
8840 0

不小心删除了libc.so.6

升级系统软件说依赖更高glibc库,然后升级过程中错误删除了libc.so.6。。导致所有的命令均无法执行。
例如执行ll,有如下提示

ll
sh: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

libc.so.6介绍

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。

sh bash这些都是依赖与glibc库的,所以你如果删除了glibc.so.6链接库,你对系统机会什么都做不了。。

误删libc.so.6恢复

如果你shell窗口还没关闭,并且还是root用户

libc.so.6位于/lib64/libc.so.6。这个文件是一个软连,所以一般误删除之后源文件并未删除,我们可以通过重建软连接来恢复。

  • 第一步我们需要找到源文件,可以通过ll /lib64/libc- 命令行自动提示的功能来找到源文件(例如是: /lib64/libc-2.17.so)
  • 第二步 使用变量 LD_PRELOAD来重新建立链接
    LD_PRELOAD=/lib64/libc-2.17.so ln -s /lib64/libc-2.17.so /lib64/libc.so.6      // 两条命令必须同一行执行!!

    linux调用库文件的时候会到系统的lib目录查找,而LD_PRELOAD则能够改变搜索路径,会现在LD_PRELOAD变量值的目录里找,再到系统lib库里找。

另外如果你是redhat6版本可以通过busybox恢复(网上找到的方案,非验证) 通过busybox恢复如下

busybox ln -s /lib64/libc-2.17.so /lib64/libc.so.6

除了处于这个状态的情况下可以通过命令行操作恢复,其他状态均无法恢复。因为丢失了libc.so.6你什么都干不了

无法通过命令行方式恢复状态列举
  1. 如果你删除了libc.so.6软连,当前用户是非root则无法通过命令行简单恢复 首先你不是root,想用方法1是不可能的,因为你没有/lib64目录的写权限
    看了方法1,可能会想到用以下方式
    LD_PRELOAD=/lib64/libc-2.17.so ln sudo -s // 或则su root

    答案是不可以,因为su、sudo里LD_PRELOAD变量是不加载的或者说是不生效的。

  2. shell窗口关闭则无法恢复,应为ssh不可执行,根本就登录不上了。。

shell链接断开,或者libc源文件丢失

  1. 虚拟机:关闭出问题的虚拟机,当前虚拟机同一个母机的其他虚拟机,增加虚拟硬盘,选择出问题的虚拟机硬盘文件。然后把libc文件复制过去
  2. 实体机:拆下硬盘挂到其他linux系统上,把文件复制过去即可。

重装系统

直接重装

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

stdin stdout stderr

首先我们知道什么是流(stream),流物理设备的输入输出、存储设备上的文件的输入输出都映射到逻辑上的数据流,这是用来消除设备直接差异而抽象的一个概念。 通常情况下每个程序在启动的时候都会定义3个流:stderr、stdout、stderr,分别用来输入、输出、诊断和错误信息的输出,通常他们会被连接到用户终端(tty(4)),但是也可以修改到其他的文件和设备(重定向)。这取决于双亲进程的选择和设置。 Linux的本质是一切皆是文件,输入输出设备也是使用文件的形式存在和管理的,内核启动的时候默认会打开三个I/O设备文件:stdin、stdout、stderr,分别得到的描述符是0,1,2,并且他

Linux命令file

file介绍 file命令用来探测文件的类型 用法 -b:列出辨识结果时,不显示文件名称; -c:详细显示指令执行过程,便于排错或分析程序执行的情形; -f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称; -L:直接显示符号连接所指向的文件类别; -m<魔法数字文件>:指定魔法数字文件; -v:显示版本信息; -z:尝试去解读压缩文件的内容。 file源码编译安装 github库 以安装5.25为例 wget https://github.com/file/file/archive/FILE5_25

Linux命令xargs

介绍 xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。 xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。 xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。 xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了

Centos配置软件源

Centos7修改软件源 这里以Centos7为例子,6同样的方法url里相应7修改为6即可 配置remi源 remi源依赖epel源,安装epel源 yum install epel-release 安装remi源 rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-7.rpm rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi 启用remi源 /etc/yum.repos.d/remi.repo,在[remi]下边的enabled=0改为enabled=1 同时也安装了各版本的php

Linux命令ssh

ssh介绍 SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。 命令参数 -1:强制使用ssh协议版本1; -2:强制使用ssh协议版本2; -4:强制使用IPv4地址; -6:强制使用IPv6地址; -A:开启认证代理连接转发功能; -a:关闭认证代理连接转发功能; -b:使用本机指定地址作为对应连接的源ip地址; -C:请求压缩所有数据; -F:指定ssh指令的配置文件; -f:后台执行ssh指令; -g:允许远程主机连接主机的转发端口; -i:指定身份文件;