我最近在我的 Debian VPS 服务器上apt-get update
执行了以下apt-get upgrade
命令。突然(至少)wget
停止工作并出现错误Segmentation fault
。它甚至没有尝试做任何事情。因此,经过一番谷歌搜索后,我安装gdb
并尝试调试 wget:
~# gdb wget
(gdb) run
Starting program: /usr/bin/wget
Error while mapping shared library sections:
'/lib/libc.so.5': not in executable format: File truncated
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
看着/lib/
给了我这个:
~# ls -l /lib/
total 288
lrwxrwxrwx 1 root root 21 Oct 14 08:52 cpp -> /etc/alternatives/cpp
drwxr-xr-x 2 root root 4096 May 7 2015 discover
drwxr-xr-x 2 root root 4096 May 7 2015 ifupdown
drwxr-xr-x 2 root root 4096 May 7 2015 init
-rwxr-xr-x 1 root root 71416 Oct 5 2014 klibc-IpHGKKbZiB_yZ7GPagmQz2GwVAQ.so
-rwxr-xr-x 1 root root 23904 Jan 26 22:08 libc.so.5
lrwxrwxrwx 1 root root 17 Nov 8 2014 libip4tc.so.0 -> libip4tc.so.0.1.0
-rw-r--r-- 1 root root 31416 Nov 8 2014 libip4tc.so.0.1.0
lrwxrwxrwx 1 root root 17 Nov 8 2014 libip6tc.so.0 -> libip6tc.so.0.1.0
-rw-r--r-- 1 root root 31416 Nov 8 2014 libip6tc.so.0.1.0
lrwxrwxrwx 1 root root 15 Nov 8 2014 libipq.so.0 -> libipq.so.0.0.0
-rw-r--r-- 1 root root 10544 Nov 8 2014 libipq.so.0.0.0
lrwxrwxrwx 1 root root 16 Nov 8 2014 libiptc.so.0 -> libiptc.so.0.0.0
-rw-r--r-- 1 root root 5816 Nov 8 2014 libiptc.so.0.0.0
lrwxrwxrwx 1 root root 20 Nov 8 2014 libxtables.so.10 -> libxtables.so.10.0.0
-rw-r--r-- 1 root root 51896 Nov 8 2014 libxtables.so.10.0.0
drwxr-xr-x 3 root root 4096 May 7 2015 lsb
drwxr-xr-x 2 root root 4096 May 7 2015 modprobe.d
drwxr-xr-x 3 root root 4096 May 7 2015 modules
drwxr-xr-x 2 root root 4096 May 7 2015 startpar
drwxr-xr-x 8 root root 4096 Jan 27 15:19 systemd
drwxr-xr-x 15 root root 4096 May 7 2015 terminfo
drwxr-xr-x 4 root root 4096 Jan 27 15:13 udev
drwxr-xr-x 4 root root 12288 Jan 27 15:20 x86_64-linux-gnu
drwxr-xr-x 2 root root 4096 May 7 2015 xtables
我们可以看到,1 月 26 日 libc.so.5 发生了一些事情,但我真的不知道是什么。
我已经检查过了dmesg | grep "wget"
:
(truncated)
[247973.065698] wget[9959]: segfault at 0 ip (null) sp 00007ffc31e37558 error 14 in wget[400000+63000]
[248272.905735] wget[10886]: segfault at 0 ip (null) sp 00007ffcf3e14038 error 14 in wget[400000+63000]
[248572.716856] wget[11824]: segfault at 0 ip (null) sp 00007fffdcc9e2d8 error 14 in wget[400000+63000]
[248873.509595] wget[12742]: segfault at 0 ip (null) sp 00007ffd84ad95d8 error 14 in wget[400000+63000]
[249173.463737] wget[13689]: segfault at 0 ip (null) sp 00007ffca87ba518 error 14 in wget[400000+63000]
[249472.948078] wget[14664]: segfault at 0 ip (null) sp 00007ffe54fd32a8 error 14 in wget[400000+63000]
[249776.082815] wget[15640]: segfault at 0 ip (null) sp 00007ffecc36c758 error 14 in wget[400000+63000]
[250072.819988] wget[16595]: segfault at 0 ip (null) sp 00007fff07f4f9d8 error 14 in wget[400000+63000]
[250373.130105] wget[17570]: segfault at 0 ip (null) sp 00007ffcec9c01d8 error 14 in wget[400000+63000]
[250672.640891] wget[18493]: segfault at 0 ip (null) sp 00007ffe9f78cc08 error 14 in wget[400000+63000]
[250975.950585] wget[19412]: segfault at 0 ip (null) sp 00007fff46300128 error 14 in wget[400000+63000]
服务器是 Wedos.com 上运行 Debian 的 VPS:
~# uname -a
Linux server1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux
有人能帮我看看发生了什么事以及如何修复段错误吗?这是具有实时流量的生产服务器。
谢谢!
答案1
这里的关键是
'/lib/libc.so.5': not in executable format: File truncated
C 库是类 Unix 系统(包括 Linux)的核心组件之一。它的损坏意味着几乎没有可以正常工作。您很幸运,因为您的系统运行正常,但启动或重新启动任何程序都可能会失败。
请勿重新启动系统。就目前情况来看,它几乎肯定不会再回来了。
尤其是因为这是 VPS,而且这是在升级时发生的,我想知道您是否耗尽了磁盘空间或 inode 等资源。我认为这种情况不会破坏您系统上的更多东西,因此您可能需要实施某种形式的灾难恢复。最简单的选择可能是恢复您最近的备份。
至少,您必须重新安装 C 库。在我的 Debian 系统上,这由libc6
软件包系列提供,主要是libc6
。您可以运行dpkg -S libc.so
以列出所有提供名称包含子字符串的文件的软件包libc.so
。如果您无法在有问题的 VPS 上运行此命令,请设置一个单独的系统(可以是某个地方的低配置 VM;这并不重要)并使用相同版本的 Debian,更新软件包列表,然后在那里运行命令;它会告诉您哪些软件包是重新安装的候选。
一旦你掌握了最基本的操作,你可能需要查看如何验证软件包安装的文件是否与原始文件匹配?如何验证(至少大部分)其他内容也没有被破坏。
就我个人而言,尤其是考虑到这可能是一个重要的系统(因为你说它是一台“有实时流量的生产服务器”),我可能更愿意启动你现有的任何灾难恢复计划。这很可能比尝试就地修复问题更容易、更快捷,而且你永远不知道你可能错过了什么错误。这实际上只是需要从轨道发射核弹才能确保。