LSI 3Ware tw_cli 和 tdm2 segfault 与 Debian Linux 内核 3.8 之后

And*_*man 2 ubuntu debian 3ware

我已经两次通知 LSI 支持,但到目前为止他们无法重现该问题。我想在这里发帖以获得一些公正的专家的想法,看看是否有其他人遇到过类似的问题。

我们管理着许多提供 Internet 服务的服务器,这些服务器具有非常大的磁盘 IO。全部运行 Debian 测试 (Sid)-amd64 并使用 85xx - 96xx 系列的 3ware RAID 卡。随着 Debian 内核更新到 3.9.x-amd64,我们开始遇到 tw_cli 的段错误。我们测试了 tdm2,它也有段错误。

要重现该问题:(您的系统中不需要 RAID 卡来执行此操作) 1. Debian 测试 (Sid) 的全新安装。ISO 是http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/ 2. 安装 tw_cli 并尝试运行它。

我们在 3.2 和 3.9.6/3.9.8-amd64 下以 root 身份运行 tw_cli,并且在 tw_cli 调用 uname 之后立即发生了段错误,如下所示。

跑得好:

execve("/usr/local/sbin/tw_cli", ["tw_cli", "/c0", "show", "all"], ["TERM=xterm", "SHELL=/bin/bash", "SSH_CLIENT =71.207.183.174 60609 "..., "SSH_TTY=/dev/pts/0", "USER=root", "MAIL=/var/mail/root", "PATH=/usr/local/sbin:/usr /local/"..., "PWD=/root", "LANG=C", "PS1=\\h:\\w\\$ ", "SHLVL=1", "HOME=/root", " LOGNAME=root", "SSH_CONNECTION=71.207.183.174 60"..., "_=/usr/bin/strace"]) = 0
uname({sysname="Linux", nodename="yorick.ironicdesign.com", release="3.2.0-4-amd64", version="#1 SMP Debian 3.2.46-1", machine="x86_64" }) = 0
brk(0) = 0x2664000
brk(0x2685000) = 0x2685000
uname({sysname="Linux", nodename="yorick.ironicdesign.com", release="3.2.0-4-amd64", version="#1 SMP Debian 3.2.46-1", machine="x86_64" }) = 0
open("/proc/devices", O_RDONLY) = 3
...

运行不良:

execve("/usr/local/sbin/tw_cli", ["tw_cli", "/c0", "show", "all"], ["SHELL=/bin/bash", "TERM=screen", "SSH_CLIENT" =98.26.9.112 58271 22", "SSH_TTY=/dev/pts/0", "USER=root", "SSH_AUTH_SOCK=/tmp/ssh-595iwzIik"..., "TERMCAP=SC|screen|VT 100/ANSI X3"..., "PATH=/usr/local/sbin:/usr/local/"..., "MAIL=/var/mail/root", "STY=17473.mdorman", "PWD=/root ", "LANG=C", "PS1=\\h:\\w\\$ ", "HOME=/root", "SHLVL=2", "LOGNAME=root", "WINDOW=0", "SSH_CONNECTION =98.26.9.112 58271"...,"_=/usr/bin/strace"]) = 0
uname({sysname="Linux", nodename="yorick.ironicdesign.com", release="3.10-1-amd64", version="#1 SMP Debian 3.10.1-1 (2013-07-16)",机器="x86_64"}) = 0
brk(0) = 0x26ef000
brk(0x2710000) = 0x2710000
uname({sysname="Linux", nodename="yorick.ironicdesign.com", release="3.10-1-amd64", version="#1 SMP Debian 3.10.1-1 (2013-07-16)",机器="x86_64"}) = 0
--- SIGSEGV(分段错误)@ 0 (0) ---

在上面的良好运行中,uname 之后的下一个调用是打开 /proc/devices,它确实存在并且应该没有问题。我们认为还有一些值得注意的东西,您可以在上面的错误运行中看到它,3.9/3.10 内核中的 uname 向字符串添加了日期。

我们认为这两次 strace 运行可能表明 tw_cli 正在崩溃,因为它从 uname 调用中得到了意外的响应。LSI 支持说:

“即使使用 Ubuntu 最新内核 3.10.x,3dm2 和 tw_cli 也能正常工作,而 Ubuntu 通常会从 Debian 中提取不稳定的内核并将其用于发布。”

FWIW,我不确定 LSI 支持在谈论什么。我们刚刚测试了最新安装的 Ubuntu 1304(Raring Ringtail)并且 uname -a 显示“Linux mac-workstation 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux”。所以 Ubuntu 1304 使用的是 3.8 内核,而不是 3.10。并且 tw_cli 和 tdm2 都可以正常工作。

那么有什么有用的想法吗?目前我们的选择似乎是: - 将我们的内核版本固定到 3.2 并希望任何问题尽快得到解决 - 停止监视我们的 RAID(实际上不是一个选项) - 为我们所有的服务器编译自定义内核,因为显然是股票的 Debian 测试内核有这个问题 - 为我们所有的服务器切换到 Ubuntu(不可行) - 将我们的 RAID 卡切换到像 Areca 这样的人(对于现有服务器也不可行,但正在考虑用于我们的下一代服务器)

================== 后续============================

我刚刚收到 LSI/3ware 支持的以下回复。恐怕我对他们的回应不是很好,但我相信它准确地概括了情况。

LSI/3ware 表示:我们能够使用 Debian 不稳定内核 3.9-1-amd64 重现该问题,但工程部门不会为不稳定或未发布的内核发布软件。如果可能,请等到 Debian 正式发布内核。3dm2 和 tw_cli 应该适用于 Ubuntu 官方版本 13.04,包括更新的内核 3.8.x 到 3.10。

我的回复:

所以最终的结果是:

  • 您不会重新安装 Debian 测试,这会重现该问题。我什至为您提供了“官方”测试 ISO 的链接,该 ISO 确实存在问题。

相反,您首先编译一个以某种方式避免问题的自定义内核。然后你跳过测试到不稳定来重现问题。除了“工程不会为不稳定或未发布的内核发布软件”......所以你再次避免采取任何行动。

  • 那么你有胆量建议我们不使用 Debian 官方版本(我们是)或者我们可以关闭我们所有服务器上运行的服务并切换到新的发行版???

对我们来说,好消息是我们在 Debian 社区中,并将让每个人都知道 LSI 是如何处理的。这将向 Linux 社区的其他成员发出关于您的产品的长期可行性的强烈信号。

谢谢

============我的结论==============

是的,我们确实在生产中使用官方的 Debian 测试版本,有些人认为这是不明智的。

尽管如此,争论并没有解决这里的问题,最终测试中的内核使其进入稳定状态。对于任何制造商来说,修复对其产品使用至关重要的专有软件的时间是使用测试发行版......在它达到稳定之前。

因此,当我们等待 LSI/3ware 决定加载官方 Debian 测试并修复他们的软件时,我们可能会将我们的内核固定到 3.2。我们也可以找时间编译一个不使用 uname -r 输出日期的 3.10 内核,看看这是否确实是原因。如果是这样,我们可以在内核的 uname 调用中进行更改。

小智 5

我在使用内核 3.12.XXX 进行 Debian 测试时遇到了同样的问题。对我来说,命令 setarch(或 linux64)有效:

web3:~# setarch x86_64 --uname-2.6 tw_cli /c0/u0 show all
Run Code Online (Sandbox Code Playgroud)

或者

web3:~# linux64 --uname-2.6 tw_cli /c0/u0 show all
Run Code Online (Sandbox Code Playgroud)