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

我已经两次通知LSI支持,但到目前为止,他们无法再现问题。 我想在这里张贴一些无偏见的专家关于它的想法,看看是否有其他人看到类似的问题。

我们pipe理大量服务器,通过非常繁重的磁盘IO提供Internet服务。 所有运行的Debiantesting(Sid)-amd64和使用85xx – 96xx系列的3ware RAID卡。 随着Debian内核更新到3.9.x-amd64,我们开始用tw_cli获得一个segfault。 我们testing了tdm2,也发现了段错误。

重现这个问题:(你的系统中不需要RAID卡)1.全新安装Debiantesting(Sid)。 ISO是http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/ 2.安装tw_cli并尝试运行它。

我们在3.2和3.9.6 / 3.9.8-amd64下以strace的身份运行tw_cli,并且在tw_cli调用uname之后,segfault正好发生,如下所示。

良好的运行:

 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
打开(“/ 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) machine =“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) machine =“x86_64”})= 0
 --- SIGSEGV(分段错误)@ 0(0)---

在上面的好运行,uname之后的下一个呼叫是打开/ proc /设备,这是否存在,应该不是一个问题。 还有一些我们认为值得注意的东西,你可以在上面的坏运行中看到它,在3.9 / 3.10内核中uname会为string添加一个date。

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

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

FWIW,我不确定LSI的支持是什么意思。 我们刚刚testing了最新的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都能正常工作。

那么有帮助的想法? 目前我们的select似乎是: – 将我们的内核版本固定为3.2,并希望不久的问题得到解决 – 停止监控我们的RAID(不是真正的select) – 为我们所有的服务器编译自定义的内核,因为Debiantesting内核有这个问题 – 切换到所有我们的服务器的Ubuntu(不可行) – 切换我们的RAID卡像Areca(也不是现有的服务器可行,但正在考虑我们的下一代服务器)

===================跟进============================

我刚刚收到LSI / 3ware支持的以下回复。 恐怕我对他们的回应不是很好,虽然我相信它是准确地总结出来的。

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

我的回复:

所以最终的结果是:

  • 您将不会重新安装Debiantesting来重现问题。 我甚至给你链接到“官方”testingISO有问题。

相反,你首先编译一个自定义的内核,以避免这个问题。 然后,您将OVER Testing跳转到Unstable以重现问题。 除了“工程不会为非稳定或未发布的内核发布软件”…所以再次避免采取任何行动。

  • 那么你有胆量build议我们不使用Debian正式版本(我们是),或者我们可以closures我们的服务在我们所有的服务器上运行,并交换到一个新的发行?

对我们来说,好消息是我们在Debian社区,让大家知道这是由LSI处理的。 这将会向Linux社区的其他人发出一个强烈的信号,说明您的产品的长期可行性。

谢谢

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

是的,我们在生产中使用正式的Debiantesting版本,有些人认为这并不明智。

虽然这个讨论并没有解决这个问题,但最终在Testing中的内核变成了Stable。 对于任何制造商来说,修复他们使用其产品所必不可less的专有软件的时间是在testing发行版之前…在达到稳定之前。

所以当我们等待LSI / 3ware决定加载官方Debiantesting并修复他们的软件时,我们可能会把我们的内核固定到3.2。 我们也可以find编译3.10内核的时间,它不会用uname -r输出一个date,看看是否确实是这个原因。 如果是这样的话,我们可能能够在内核的uname调用中得到改变。

在使用Kernel 3.12.XXX进行Debiantesting时,我遇到了同样的问题。 对我来说,命令setarch(或linux64)工作:

web3:~# setarch x86_64 --uname-2.6 tw_cli /c0/u0 show all 

要么

 web3:~# linux64 --uname-2.6 tw_cli /c0/u0 show all 

问题不在于date,而是tw_cli正在寻找XYZ(-R-arch)的版本,它只能得到XY(-R-arch) – 3.2.0-4-amd64 vs 3.10-2-amd64。 当版本设置为3.10.0-2-amd64时,它运行良好。 他们可能正在做有限的格式sscanf(),很less或没有错误检查。

果酱:〜#uname -r
 3.10-2-AMD64
果酱:〜#tw_cli / c0显示固件
分段故障
果酱:〜#echo 3.10.0-2-amd64> / sys / module / utsname / parameters / release
果酱:〜#uname -r
 3.10.0-2-AMD64
果酱:〜#tw_cli / c0显示固件
 / c0固件版本= FE9X 4.10.00.027

如果二进制是dynamic的,你可以看到LD_PRELOAD的uname()replace,但它是静态的。 没有源代码,所以我们的选项是有限的:

  • LSI / 3ware修复tw_cli,希望删除所有uname()废话
  • 让Debian在发行版中使用XYZ-R-arch
  • 组装好的人拿出一个二进制补丁或类似的东西
  • 运行一个定制的内核
  • 运行一个较旧的内核
  • 沟3ware

我喜欢我的9650,但这是废话。

除非您想testing,否则您不应该运行Debiantesting。 特别是不在服务器上。 我会说试图在Debian稳定中重现它。

此外,LSI 3ware卡还附带一个出色的基于Web的pipe理界面,可让您将其configuration为发送警报。 在这种情况下,您不需要在脚本中使用tw_cli来发送此类警报,从而避免您遇到的问题。

其实想起来,如果tdm2段错误,那么pipe理界面也无法正常工作…

在使用3.10内核的Debiantesting(包括tw_cli segfault)上有同样的问题。 需要提及的是,Debiantesting比其他发行版“稳定版本”要稳定得多);然而,似乎与内核版本相关的问题比testing发行版更为重要。 切换回3.2,它工作正常,也等待LSI软件更新,但我们有3ware 9500系列,所以没有太大的希望。