【问题标题】:How to recover after deleting the symbolic link libc.so.6?删除符号链接libc.so.6后如何恢复?
【发布时间】:2012-08-28 06:58:18
【问题描述】:

在我们的服务器中,指向libc.so.6 的符号链接已被删除。现在系统中的所有二进制文件都不起作用。为了解决这个问题,我尝试了:

/bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

正如预期的那样,给了我:

/bin/ln: error while loading shared libraries: libc.so.6: 
    cannot open shared object file: No such file or directory

我也试过了:

/lib/ld-linux-x86-64.so.2  --inhibit-rpath /lib/libc.so.6 \
   --library-path /lib/libc-2.11.3.so \
   /bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

结果相同。进一步不成功的尝试包括cp、mv、cat。

我是通过 ssh 连接的,我相信在关闭这个会话后我将无法打开另一个会话。有没有办法修复这个系统(也许使用 bash 内置)?

[编辑] 我做了:

while read line; do echo $line; done < /lib/libc-2.11.3.so > libc.so.6

复制文件并尝试:

/lib/ld-linux-x86-64.so.2  --inhibit-rpath libc.so.6 --library-path . \
  /bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6

得到:

/bin/ln: error while loading shared libraries: ./libc.so.6: ELF file OS ABI invalid

【问题讨论】:

  • 您可以使用静态二进制文件,例如sash 静态链接的 shell(您之前会安装),其中包含一个内置的 cp-like 命令
  • 你的 echo 需要一个 -nE 否则它会在输出中添加你不想要的换行符,并且可能会解释转义
  • 使用 read/echo 复制文件不会使其可执行...

标签: linux shared-libraries glibc


【解决方案1】:

使用 Knoppix 之类的 live cd 启动,并在将带有“损坏”系统的磁盘从正在运行的 live 系统中安装出来后修复丢失的链接。

【讨论】:

  • 谢谢,但此时我正在寻找一种方法来通过我的开放 ssh 会话解决此问题:(
  • 也许你有一个静态链接的 perl、python、lua、...的二进制文件?
  • 游戏中的 sudo 哪里来的?
  • LD_PRELOAD=/lib/libc.so.6 bash 怎么样?将打开你的外壳,我认为这个外壳内的所有命令都应该继承该设置。或者...也许不是 sudo。您可以使用sudo su 或仅使用su 成为root 用户吗?新环境需要再次设置 LD_PRELOAD。
  • @perreal 你设法绕过 sudo 了吗?如果没有 sudo,我无法将其链接回来...
【解决方案2】:

您可以简单地运行ldconfig。大多数发行版都将其作为静态二进制文件提供。

【讨论】:

  • 好问题。我是在实际获得 root shell 而不是每次都输入 sudo 的老传统中长大的,所以我从来没有遇到过这个问题(是的,我不小心删除了一次 libc.so.6)
  • @Matt 2015 更新:Ubuntu 14.04 LTS 提供 /sbin/ldconfig
  • 我收到了Can't link /usr/lib/libc.so.6 ...Can't create temporary cache file: Permission denied。看起来该命令必须以 root 身份运行。没有打开的 root shell 是否有恢复的机会?
【解决方案3】:

这对我有帮助(实际版本取决于您的库):

ldconfig -l -v /lib/libc-2.13.so

【讨论】:

  • 这给了我ldconfig: Cannot lstat /lib/libc-2.13.so: No such file or directory,我找到了一个名为libc-2.17.so 的文件,但这给了我同样的错误,所以我认为错误是指lstat 缺失?
【解决方案4】:

试试:

LD_PRELOAD=/lib/libc-2.17.so ln -s /lib/libc-2.17.so /lib/libc.so.6

注意:实际版本取决于您的库。

【讨论】:

    【解决方案5】:

    注意,对于 64 位:

    LD_PRELOAD=libc-2.13.so ln -s libc-2.13.so libc.so.6

    这对我很有效

    如果你不在那个目录中,它当然会是这样的:
    LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.13.so ln -s /lib/x86_64-linux-gnu/libc-2.13.so /lib/x86_64-linux-gnu/libc.so.6

    【讨论】:

      【解决方案6】:

      如果你之前执行过 ls 命令并且知道 libc 的版本是什么,

      ldconfig -l -v /lib64/libc-2.x.so
      

      x 是您工作的版本。请注意,它可能是 lib64 或 lib,具体取决于您的版本。

      我刚做了这个,效果很好。

      简而言之,永远不要删除链接。坏主意。

      【讨论】:

        【解决方案7】:

        非常感谢您的以下回答。它适用于根 ID。 我们取消链接libc.so.6 以链接到更高版本,但在取消链接 libc.so.6 服务器后突然变得无响应。 ln -s 命令不起作用。没有其他用户能够通过 ssh 连接到服务器。但是当我们在命令下运行时,它起作用了。 (服务器上存在 libc 版本)服务器开始正常运行。

        以下是正确的命令和救生太......

        LD_PRELOAD=/lib/libc-2.17.so ln -s /lib/libc-2.17.so /lib/libc.so.6
        

        注意:实际版本取决于您的库

        【讨论】:

          【解决方案8】:

          如果您使用的是 Ubuntu,ldconfig 将不起作用。运行:

          /sbin/ldconfig.real
          

          【讨论】:

            【解决方案9】:

            我在尝试升级符号链接时不小心删除了文件 /lib64/libc.so.6... 这很奇怪。 ls、du、cd vim、su 等命令都不起作用

            唯一拯救我的是,我已经以 root 用户身份登录了 所以跑了“$ sln /lib64/libc.so-2.12 /lib64/libc.so.6” 哪种救了我的命

            请参考此链接,它非常有帮助。而不是启动服务器和 https://www.programmersought.com/article/2176688665/ 只需确保您可以再次链接的符号链接与上一个相同

            建议在重新启动之前尝试一切,不要退出 bash 终端

            【讨论】:

              猜你喜欢
              • 2015-01-24
              • 1970-01-01
              • 2013-06-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-26
              • 2020-10-19
              相关资源
              最近更新 更多