![Gentoo 无头服务器突然挂起,需要重新启动才能恢复](https://linux22.com/image/554360/Gentoo%20%E6%97%A0%E5%A4%B4%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AA%81%E7%84%B6%E6%8C%82%E8%B5%B7%EF%BC%8C%E9%9C%80%E8%A6%81%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E6%89%8D%E8%83%BD%E6%81%A2%E5%A4%8D.png)
最近我的 gentoo 服务器开始断开所有网络连接。由于它是一台隐藏在壁橱中的无头服务器,我没有其他登录方式,因此当这种情况发生时我无法进入。恢复连接的唯一方法是使用重置按钮并重新启动机器。
当这种情况发生时,内核或其他任何地方都不会记录任何消息,至少不会以在重启后保存到磁盘进行检查的方式记录。
有关该系统的一些简短信息:
- 常规 Linux 内核 2.6.35
- 在配备 1GB RAM 的 Pentium D 上运行 x86
- 板载网络和外部卡,其中只有板载卡插入了电缆
- 板载 VIA Technologies, Inc. VT6102 [Rhine-II] (rev 7c)
- 外部是 Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
- 已加载模块 via-rhine、8139cp、8139too(这些模块已在系统中存在一段时间了)
近期变动:
- 我最近迁移到了基于 OpenRC 的布局,遵循 gentoo迁移指南。
- 我安装了 brscan4 和 brscan-skey(Brother 扫描软件/驱动程序)
- 将 libieee1284 升级到 0.2.11-r1
我无法找到发生这种情况的任何模式,也无法确定是否只有网络停止了,或者其他一切也停止了。
我需要帮助弄清楚发生了什么,所以我需要一些建议来解决这些问题:
- 我如何确定这是否只是网络问题,还是一切都崩溃了?
- 假设它是网络,我如何才能启用一些日志记录来告诉我发生了什么?
我很乐意接受这些问题的答案、可能存在错误的建议或其他可能让我更接近弄清楚发生了什么的问题。
更新:
我卸载了 brscan4 和 brscan-skey,因为这些是最新更改,但仍然发生挂起,因此排除了它们可能的原因。我还让 syslog 每分钟标记一次日志,以便轻松跟踪服务器上何时停止。结果发现,当网络断线时,syslog 立即停止记录,因此似乎不仅仅是网络问题,而是整个系统挂起。
我还使用 genkernel 工具构建了一个新内核,因此在上次挂起之后,我现在在 2.6.38-gentoo-r6 上运行,希望这能以某种方式解决问题。
更新 2:
升级内核没有帮助。
我现在一直在观察 lm_sensor 输出在挂起之前是否有温度变化(或其他任何变化),但在最后三次挂起中,挂起之前或之后的温度没有明显变化,因此该理论似乎失败了。
一种新趋势是,在使用 MediaTomb 作为 DLNA 服务器观看电影时,系统会挂起。然而,这两者之间没有直接联系,因为我们可以连续观看几个小时,不会出现任何问题,然后关掉电视,几个小时后,当我们回来想看点什么时,系统会在几分钟后挂起,这种情况连续发生三次。但最近十次挂起都是在播放电影时发生的,而长时间的其他使用都没有造成任何问题。
更新 3:
尝试切换使用其他网卡,但没有成功。
更新 4:
终于有进展了?挂起次数足够多之后,现在该进行强制磁盘检查了,检查进行得很顺利,但之后又挂起。我想这可能表明问题出在磁盘或磁盘控制器上,因为此时启动过程中没有太多其他事情发生?
更新 5:
根据建议,我整夜运行了 memtest86+,但不幸的是没有发现任何错误。
更新 6:
今天进行的更多测试揭示了以下情况:
/dev/urandom
从(使用dd
)创建 250MB 文件/dev/sda1
:没问题/dev/urandom
从上创建一个 250MB 的文件/dev/sdb3
:没问题- 将 250MB 文件从
/dev/sdb3
复制到/dev/sda1
:没问题 - 将 250MB 的文件从
/dev/sda1
复制到/dev/sdb3
:(几乎) 立即挂起!
我将对此进行进一步测试,特别是因为许多挂起似乎都是在仅从 /dev/sdb3 读取时发生的,但这似乎不会在本次测试中造成问题。
对于可能导致此问题的原因,您有什么建议吗?或者有什么故障排除技巧可以尝试找出原因?
答案1
您可能想要尝试在服务器上配置某种日志记录过程,以便当网络连接断开时,您可以判断服务器是否仍然处于活动状态。这可以是简单的 cron 作业,其中包含wget
远程 URL(然后您可以监视其流量日志),也可以是设置远程 syslog 服务器,用于捕获来自该框的所有日志流量。
您还可以使用 cron 安排重新启动网络系统(/etc/init.d/net.eth0 restart
大约每小时一次);这样,如果您由于网络接口出现某些问题而丢失连接,则可以通过重新启动来解决问题,而无需弹出整个框。
不过,我接下来要做的事情如下:
- 在桌面上设置一个 cron 作业,每分钟 ping 一次盒子,这样当它停止响应时,您就能立即知道。(也许让它在每次 ping 时都输出到带有时间戳的日志中,这样您就不必将其记录在其他地方。)
- 等十分钟。
- 去重启服务器。
- 连接到服务器并查看 /var/log/messages(实际上是整个 /var/log),看看在服务器停止响应和重新启动之间是否发生了任何事情。
如果网络连接中断时日志消息也停止,则可能是内核崩溃了,您可以为此启用额外的日志记录以找出原因。如果网络连接中断后日志消息继续,则可能是其他原因造成的。(在这种情况下,我会怀疑网卡有问题或驱动程序有问题,但这只是我个人的看法。)您可以编写一套小型网络诊断程序,ifconfig
/ traceroute
/等,然后将其从 cron 运行到日志文件中;然后,当您有网络不活动的时间范围时,您可以检查日志以查看当时机器正在查看什么。
更新:由于问题似乎是内核完全崩溃,因此我接下来要尝试设置lm_传感器并每分钟将命令的输出写入sensors
日志。这样,您将能够看到温度是否有任何快速或逐渐的变化,这些变化往往与恐慌有关。
答案2
从集体更新来看,这种情况可能会朝着两种方向发展:
- 硬盘问题
- RAM 问题
要尝试的测试:
- 硬盘测试(只读、读/写)
- 内存测试
答案3
如果尚未考虑,您可以尝试切换到或同时使用第二个 NIC。这将有助于识别或消除主 NIC 和/或其相关电缆、硬件等。
答案4
不确定这应该是一个答案还是一个评论。
你的描述有点像https://bugs.gentoo.org/show_bug.cgi?id=359671。尽管情况的某些参数似乎有所不同,尤其是您甚至没有连接到 realtek 的电缆,但我猜这仍然可能与 realtek 驱动程序的不稳定有关,在这里提出这个想法可能是值得的。
因此,请尝试将 realtek 模块列入黑名单。