资讯详情

资讯详情

LSI3008阵列卡驱动mpt3sas编译加载与排障调优

简介面向服务器与存储运维人员、IT 管理员的 LSI 3008 RAID 阵列卡驱动包主要用于让 Windows 系统识别并管理基于 SAS 技术的 LSI 3008 控制器完成阵列初始化、配置、监控与故障排查适合在服务器部署、系统重装或驱动升级时使用。压缩包共 97 个文件约 21.1MB包含 sys、inf、cat 等核心驱动与签名文件dll、exe 等管理工具组件以及 msu 更新包、efi、pdf 和 txt 说明文档便于按系统版本和安装方式取用。目前已有 2176 人学习下载说明其在同类阵列卡维护场景中具有一定参考价值。包内相对完整的驱动与工具组合可帮助读者核对驱动兼容性、补充缺失组件、配合阵列管理程序完成配置检查并为旧平台维护和排错提供可用资料。1. 3008 整列卡驱动LSI3008不是“插上就能认盘”的附赠品3008 整列卡驱动LSI3008最容易被低估的地方是它看起来像一块插上就能认盘的普通扩展卡。某次给一台存储节点换卡系统能启动lspci也能看到 LSI3008但lsblk只出来一半盘日志里反复出现mpt3sas复位记录。换内核后更直接卡还在盘全没了。这篇围绕 3008 整列卡驱动把三件事讲透mpt3sas 驱动栈到底管哪一段内核配置和外部模块怎么编、怎么加载以及参数调优和排错时先看哪些寄存器与日志。读者对象是正在做存储节点扩容、系统集成、阵列卡排障的人。新手能按命令复现熟手能对着参数和边界判断值不值得继续调。2. 先认清 LSI3008 的驱动栈mpt3sas 不是孤立的一个 .ko2.1 3008 控制器在 PCIe 与 SAS 拓扑里的位置LSI3008 在系统里首先是一个 PCIe 设备然后才是 SAS 控制器。它常见形态是 8 个 SAS PHY、PCIe 3.0 x8 上行单 PHY 协商 12Gb/s。链路上任何一个环节降级最后表现都可能变成“驱动有问题”PCIe 插槽只跑 x4SAS 背板只协商到 6Gb/s或者 expander 后面的盘被识别成单路径都会让mpt3sas的日志看起来很正常但吞吐和盘数不对。我一般先画一条最小拓扑控制器 - 背板/expander - 盘。控制器在lspci里是一个 PCI 功能驱动 probe 之后才会注册scsi host再由 SCSI 层扫描出sdX。所以排查顺序不能反过来先看 PCIe 枚举再看驱动绑定再看 SAS PHY 协商最后才看块设备。很多人一上来就lsblk盘没出来就怀疑驱动实际卡在 PCIe 链路训练或背板供电上。判断 PCIe 层是否健康用lspci -vv看LnkCap和LnkSta。LnkSta里的 Speed 和 Width 是实际协商结果不是卡的理论能力。如果卡支持 x8插槽只给 x4带宽直接砍半如果 Speed 从 8GT/s 掉到 5GT/s 或 2.5GT/s驱动再调也没用。这个检查在换槽、换主板、加转接卡之后必须做一次属于血泪经验。SAS 层看/sys/class/sas_phy/phy-*/negotiated_linkrate。正常应该是 12.0 Gbit/s背板或线缆质量差会掉到 6.0 或 3.0。盘时有时无的时候这个值比dmesg更早给出信号。/sys/class/sas_device下能看到每块盘的 SAS 地址和端口配合lsscsi -s可以确认盘到底挂在哪条 PHY 后面。2.2 mpt3sas、固件与 OpROM 的三层关系LSI3008 的驱动栈不是“内核模块直接操作硬盘”。更准确地说mpt3sas通过 mailbox 和控制器固件通信固件负责 SAS 协议、PHY 管理、RAID 元数据如果卡工作在 IR 模式驱动负责把 SCSI 命令翻译成固件能理解的请求。卡上还有一份 OpROM负责上电自检和启动阶段初始化进入 Linux 后驱动会重新初始化一遍。三层里任何一层版本错配表现都可能是 I/O timeout 或掉盘。所以“驱动版本”不能只看modinfo mpt3sas。还要看卡上固件版本常见做法是用sas3flash -list读或者在dmesg里搜Firmware version。驱动和固件之间有兼容矩阵老驱动配新固件、新驱动配老固件都可能翻车。不要凭感觉升级固件先确认当前内核自带的mpt3sas版本再对照硬件供应商给的兼容表。没有兼容表时至少保证驱动和固件来自同一代发布批次升级前记录原版本。OpROM 的设置也会影响 Linux 下的行为。IT 模式直通盘IR 模式带 RAID 元数据两者在mpt3sas下都会枚举出 SCSI 设备但盘上的元数据布局不同。把 IR 模式的盘直接插到 IT 模式卡上或者反过来可能出现“能看见盘但读不出分区表”。这种问题不是驱动 bug是模式不匹配。上架前确认卡的工作模式和盘的来源比事后猜日志省时间。还有一点容易被忽略mpt3sas是内核主线驱动但不同内核版本 backport 的补丁不同。企业级内核可能带厂商补丁主线内核可能没有。外部编译模块时vermagic必须和目标内核完全一致否则insmod直接拒绝。这个在下文编译章节会展开。2.3 用 lspci 和 dmesg 判断当前系统到底认到了哪一层排查第一步不是改参数而是把当前状态固定下来。下面这段命令做一次分层快照PCIe 设备、驱动绑定、内核日志、块设备。输出贴到工单里后面每次改动都有对照。echo PCIe lspci -nnk | grep -A3 -i sas\|scsi || true echo driver lsmod | grep mpt3sas || true modinfo mpt3sas 2/dev/null | egrep ^(filename|version|description|parm): || true echo dmesg dmesg | grep -i -E mpt3sas|sas|scsi host | tail -n 80 echo block lsblk -S 2/dev/null || true lsscsi -s 2/dev/null || truelspci -nnk里的-k很关键它直接显示Kernel driver in use。如果这一行是空的说明驱动没绑定后面看dmesg里的 probe 失败原因。-nn显示数字 ID方便在日志里搜。grep -A3是为了把设备行和后面的驱动行一起带出来不然只剩一行设备名判断不了绑定状态。modinfo的parm行列出当前内核暴露的模块参数。不同内核版本参数名会变所以调参前先跑这条不要照抄旧文章。dmesg只取最后 80 行避免刷屏如果已经出现mpt3sas复位往前多翻一点找第一次报错的位置后面的报错往往是连锁反应。lsblk -S看 SCSI 设备层lsscsi -s看容量和型号。两个命令互补前者看块设备树后者看 SCSI 拓扑。盘没出来时先确认scsi host有没有注册scsi host没注册说明驱动 probe 阶段就失败了和分区表、文件系统无关。3. 把 3008 整列卡驱动编进内核或编成模块最小可复现路径3.1 内核 config 里和 mpt3sas 有关的几个选项大多数通用内核已经把mpt3sas编成模块但做精简内核或自编译内核时必须显式打开。关键选项如下CONFIG_SCSIy CONFIG_BLK_DEV_SDy CONFIG_PCI_MSIy CONFIG_SCSI_MPT3SASm CONFIG_SCSI_MPT3SAS_MAX_SGE128CONFIG_SCSI_MPT3SASm是驱动本体编成模块方便替换和调试如果系统盘挂在 3008 下编成y可以减少 initramfs 依赖但升级驱动要重新编内核取舍看场景。CONFIG_SCSI_MPT3SAS_MAX_SGE控制 scatter-gather 表项数常见默认 128范围一般在 16 到 128 之间。它不是越大越好表项多单个 I/O 能合并更多内存段但也会增加驱动内存占用和固件处理开销。小 I/O 密集场景不要盲目拉满先用默认值跑基线。CONFIG_PCI_MSIy影响 MSI-X 中断3008 的多队列性能依赖它。如果内核关掉 MSI中断会退化成共享 INTx多盘并发时 CPU 软中断会明显升高。CONFIG_BLK_DEV_SDy是 SCSI 磁盘上层没有它驱动 probe 成功也出不了sdX。这些选项在make menuconfig里按SCSI-SCSI low-level drivers-MPT3SAS的路径找不同内核菜单层级略有差异以实际为准。改完 config 后make olddefconfig让新增选项取默认值再make -j$(nproc)。如果只想验证驱动不建议全量重编内核外部模块编译更快下一节走这条路。3.2 外部模块编译一条 make 命令背后的四个变量从内核源码树里把drivers/scsi/mpt3sas复制到独立目录或者直接在源码树里改都可以外部编译。最小命令如下KVER$(uname -r) KDIR/lib/modules/${KVER}/build test -d $KDIR || { echo 缺少内核构建目录 $KDIR; exit 1; } make -C $KDIR M$PWD clean make -C $KDIR M$PWD modules -j$(nproc) modinfo ./mpt3sas.ko | egrep ^(filename|version|vermagic|parm):KVER是当前运行内核版本KDIR指向内核构建目录通常是/lib/modules/$(uname -r)/build的软链接。test -d先确认头文件和 Makefile 存在缺构建目录时make会报一堆找不到include/generated的错误提前拦住比看报错快。make -C $KDIR让 make 先进入内核构建目录读取内核顶层 MakefileM$PWD告诉 kbuild 外部模块源码在当前目录modules是目标。clean先清掉上次的.o和.ko避免旧对象文件混进来。-j$(nproc)并行编译模块文件少时收益不大但源码树里带多个文件时明显。编译完必须看vermagic。modinfo输出里的vermagic包含内核版本、SMP 预抢占、模块签名等标志和目标内核不一致时insmod会报Invalid module format。version是驱动自身版本和固件兼容表对得上才有意义。parm列出这个模块支持的参数后面调参以它为准。如果编译报unknown type name bool之类多半是内核头文件不完整报No such file or directory: .../Module.symvers说明内核构建目录没准备好。先装对应内核的开发包或完整源码再重试。外部模块编译不是玄学九成问题在KDIR和vermagic。3.3 加载、验证与写进 initramfs 的顺序编译出mpt3sas.ko后先确认系统盘不挂在这块卡上再卸载旧模块。生产环境直接modprobe -r mpt3sas可能导致根文件系统失联这个后悔药没有。sudo modprobe -r mpt3sas 2/dev/null || true sudo insmod ./mpt3sas.ko dmesg | tail -n 60 lsmod | grep mpt3sas lsscsi -s 2/dev/null || truemodprobe -r先卸载旧模块失败也不中断因为有些内核把mpt3sas编进内核根本卸载不了。insmod直接加载当前目录的.ko适合验证它不会自动处理依赖所以依赖模块要提前在。dmesg看 probe 是否成功重点搜scsi host和Firmware version。lsmod确认模块在lsscsi确认盘出来了。验证通过后写持久化配置。模块参数放在/etc/modprobe.d/mpt3sas.conf例如echo options mpt3sas max_msix_vectors8 | sudo tee /etc/modprobe.d/mpt3sas.conf sudo depmod -a sudo update-initramfs -u 2/dev/null || sudo dracut -fmax_msix_vectors8只是示例具体值看 CPU 核数和队列需求。depmod -a重建模块依赖update-initramfs -u和dracut -f二选一按系统实际工具走。initramfs 必须包含新模块和/etc/modprobe.d里的参数否则重启后还是旧行为。改完重启一次再用dmesg确认参数生效不要只看当前会话。注意如果根盘挂在 3008 下卸载驱动、重建 initramfs 都有失联风险先在测试机或救援环境验证。4. 驱动参数与队列调优让 12Gb/s 链路不被软件层拖死4.1 先确认协商速率、链路宽度和队列深度调优前先确认瓶颈不在物理层。下面这段命令把 PCIe 链路、SAS PHY 速率、块设备队列深度一次拉出来BDF$(lspci -Dnn | awk /SAS3008|SAS 3008/{print $1; exit}) echo BDF$BDF sudo lspci -vv -s $BDF | egrep LnkCap|LnkSta|DevSta for p in /sys/class/sas_phy/phy-*; do printf %s $p cat $p/negotiated_linkrate 2/dev/null done for d in /sys/block/sd*; do [ -e $d/device/queue_depth ] || continue printf %s qd%s nr%s sched%s\n $d \ $(cat $d/device/queue_depth) \ $(cat $d/queue/nr_requests) \ $(cat $d/queue/scheduler) doneBDF是 PCI 域:总线:设备.功能号lspci -Dnn输出完整地址awk匹配控制器名称。lspci -vv里的LnkCap是理论能力LnkSta是实际状态两个对照看。DevSta里有CorrErr、FatalErr时先处理 PCIe 错误不要调驱动。negotiated_linkrate读的是 SAS PHY 当前协商速率。12.0 Gbit/s 是目标值6.0 或 3.0 说明线缆、背板或盘的问题。多 PHY 卡要逐个看别只看第一个。queue_depth是 SCSI 设备队列深度nr_requests是块层请求数scheduler是 I/O 调度器。三者一起看才知道是驱动队列限制还是块层限制。如果LnkSta是 x8 8GT/sPHY 是 12.0 Gbit/s但queue_depth只有 32那瓶颈在软件队列不在链路。反过来链路掉到 x4调队列也没用。先物理后软件这个顺序不能乱。4.2 mpt3sas 模块参数怎么查、怎么改、怎么回滚不要背参数名直接查当前内核modinfo -p mpt3sas输出里每一项都是参数名:描述 (类型)。常见项包括max_msix_vectors、logging_level、diag_buffer_enable、mpt3sas_fwfault_debug、disable_discovery。不同内核版本可能增删所以下表只作方向参考实际以命令输出为准。参数作用常见取值风险max_msix_vectors限制 MSI-X 向量数8、16、-1太小影响多队列太大浪费中断logging_level日志详细度0、1、2调高会刷屏影响 I/O 延迟diag_buffer_enable诊断缓冲区0、1占用内存排障时临时开mpt3sas_fwfault_debug固件故障时行为0、1调试用生产慎开disable_discovery关闭设备发现0、1只用于调试开了不认盘改参数有两种方式临时用modprobe mpt3sas max_msix_vectors8永久写/etc/modprobe.d/mpt3sas.conf。临时方式重启失效适合验证永久方式要配合 initramfs 重建。回滚就是删掉配置行depmod -a重建 initramfs重启。不要在生产机上反复insmod/rmmod每次卸载都会重置控制器状态盘上的 I/O 可能超时。max_msix_vectors是最常调的。默认-1让驱动自动分配通常按 CPU 核数和控制器能力取。中断太多会导致每个 CPU 都处理一点缓存局部性差中断太少会导致少数 CPU 被打满。我的习惯是先看/proc/interrupts里mpt3sas的中断分布如果集中在一两个 CPU再考虑限制向量数并手工绑核。绑核用smp_affinity但不要一上来就写死先用irqbalance跑一轮基线。logging_level调高只适合短时间抓日志。曾经为了追一个掉盘问题把日志开到最高结果 I/O 延迟从 0.2ms 涨到 2ms问题没复现业务先报警。排障时开抓完立刻降回去。4.3 块层参数与 fio 最小验证块层参数里queue_depth和nr_requests最容易被人一把拉满。blk-mq 下nr_requests的语义和旧单队列不同它更多是每个硬件队列的请求数不是全局队列。拉太大只会增加内存占用和延迟不会线性提升 IOPS。scheduler对 SSD 或全闪阵列常见选none对机械盘或混合负载可以试mq-deadline但要在同一基线下面比。DEV/dev/sdX echo 1024 | sudo tee /sys/block/${DEV##*/}/queue/nr_requests echo 256 | sudo tee /sys/block/${DEV##*/}/device/queue_depth echo none | sudo tee /sys/block/${DEV##*/}/queue/scheduler fio --namerandread --filename$DEV --direct1 --rwrandread \ --bs4k --iodepth64 --numjobs4 --ioenginelibaio --time_based \ --runtime60 --group_reportingnr_requests和queue_depth的单位是请求数不是 KB。scheduler写none表示不使用 I/O 调度器适合低延迟设备。fio里--direct1绕过页缓存--iodepth64是单 job 队列深度--numjobs4起四个并发 job--time_based --runtime60跑 60 秒。--group_reporting把结果汇总方便看总 IOPS 和延迟。验证顺序先跑单 job 低队列深度确认单盘基线再跑多 job 高队列深度看扩展性最后对比调参前后。如果多 job 的 IOPS 不涨反降多半是中断集中或队列深度超过控制器能力回退参数再试。不要只看iostat的%util队列设备上%util经常接近 100%没有区分度看await和fio的 p99 延迟更直接。5. 避坑与排查3008 阵列卡驱动最常见的 5 个翻车点5.1 现象lspci 有卡dmesg 没有 scsi host现象很典型lspci能看到 LSI3008但dmesg里没有scsi host注册lsblk当然也没有盘。lspci -k的Kernel driver in use是空的或者显示mpt3sas但 probe 失败。原因通常在三处。第一PCIe 链路没训练起来插槽供电或转接卡导致设备可见但不可用第二卡上固件损坏或 OpROM 卡在初始化第三内核缺少依赖模块mpt3sas加载了但 SCSI 上层没起来。先看dmesg | grep -i pcie有没有link down或correctable error再看lspci -vv的LnkSta是不是Width x0或Speed unknown。解决顺序换插槽、去掉转接卡、最小化配置再试用sas3flash -list确认固件能读出来读不出说明卡本身或 PCIe 通路有问题确认CONFIG_SCSI、CONFIG_BLK_DEV_SD和mpt3sas都在。不要在这一步就重装系统先让scsi host出来再谈盘。5.2 现象驱动加载了盘时有时无日志有 PHY reset现象是系统能起来盘偶尔出现dmesg里反复出现phy reset、link rate changed或SAS topology discovery。lsscsi有时能看到盘有时看不到重启后盘符还会变。原因多半在物理层SAS 线缆质量差、背板供电不稳、盘和背板协商速率不一致或者盘本身有坏道导致链路复位。LSI3008 支持 12Gb/s但老背板或长线缆可能只能稳定跑 6Gb/s。协商失败时驱动会重试重试次数多了就表现为盘时有时无。解决先固定速率测试把可疑 PHY 或背板降速到 6Gb/s看是否稳定换已知好的线缆和背板用smartctl -a /dev/sdX看 CRC 错误和重映射扇区。/sys/class/sas_phy/phy-*/negotiated_linkrate逐个 PHY 看不要只看能认出来的盘。盘符变化可以用/dev/disk/by-path或by-id规避不要依赖sdX。5.3 现象升级内核后模块加载失败报 vermagic 或 Unknown symbol现象是升级内核后modprobe mpt3sas报Invalid module format、version magic ... should be ...或Unknown symbol。系统可能还能启动但盘全没了如果根盘在这块卡上直接进不了系统。原因外部编译的mpt3sas.ko还是旧内核的vermagicinitramfs 里没有新模块安全启动开启后模块签名不匹配依赖模块顺序不对。depmod没跑也会导致modprobe找不到正确版本。解决确认uname -r和modinfo ./mpt3sas.ko | grep vermagic一致depmod -a重建依赖update-initramfs -u或dracut -f把新模块打进 initramfs安全启动环境下给模块签名或者关闭安全启动做验证。不要用insmod强行加载不匹配的模块Unknown symbol会越滚越多。5.4 现象I/O timeoutmpt3sas 复位业务连接断开现象是业务侧先报超时dmesg里出现mpt3sas复位、command timeout、firmware fault。盘可能还在但 I/O 卡住几十秒数据库或文件系统进入只读。原因驱动和固件版本错配队列深度超过控制器或盘的能力单块盘故障导致整条链路复位PCIe 可纠正错误累积。还有一种容易忽略max_sectors或上层 I/O 合并太大固件处理超时。解决先记录dmesg第一次报错的位置不要只看最后一次复位用sas3flash -list和modinfo mpt3sas对版本把queue_depth降回默认或更低观察是否还复位用smartctl单盘排查。如果是固件 fault收集diag_buffer或控制器日志再决定升级还是回退。不要在生产高峰做固件升级。5.5 现象单盘正常多盘并发吞吐腰斩现象单盘fio能跑到接近链路上限多盘并发总吞吐不涨甚至比单盘还低iostat里await很高但磁盘利用率不高。CPU 的%si可能升高。原因MSI-X 中断集中在一个 CPUNUMA 节点不匹配PCIe 卡和内存跨节点PCIe 链路降级到 x4块层nr_requests或queue_depth设置不合理。3008 的多队列能力需要中断、内存、块层一起配合任何一环拖后腿都会让多盘扩展性变差。解决看/proc/interrupts里mpt3sas中断是否集中必要时用smp_affinity分散用numactl --hardware确认卡所在 NUMA 节点把测试进程绑到同节点lspci -vv确认LnkSta没有降级回退nr_requests和queue_depth到默认值再跑基线。调参一次只改一个变量否则出了问题不知道是哪一项。6. 进阶用一次健康检查把 3008 的故障挡在重启之前我现在上架前会跑一遍固定检查把输出存进工单。不是等告警响了再翻日志而是先确认 PCIe、固件、驱动、PHY、盘五层都在预期状态。下面这段脚本不写盘、不改参数只读BDF$(lspci -Dnn | awk /SAS3008|SAS 3008/{print $1; exit}) echo BDF$BDF sudo lspci -vv -s $BDF | grep -E LnkSta|DevSta sudo sas3flash -list 2/dev/null | egrep -i firmware|sas address|version modinfo mpt3sas | egrep ^(version|vermagic|filename): for p in /sys/class/sas_phy/phy-*; do printf %s $p cat $p/negotiated_linkrate 2/dev/null doneLnkSta看实际速率和宽度DevSta看有没有 PCIe 错误sas3flash -list读固件版本和 SAS 地址modinfo确认驱动版本和vermagicPHY 速率逐个确认 12.0 Gbit/s。任何一项和基线不一致先处理再上业务。检查项命令正常值PCIe 链路lspci -vv -s $BDF | grep LnkSta速率和宽度与卡能力一致固件sas3flash -list版本在兼容表内驱动modinfo mpt3sasvermagic匹配当前内核SAS PHY/sys/class/sas_phy/*/negotiated_linkrate12.0 Gbit/s盘健康smartctl -a /dev/sdXCRC 错误不增长这套检查花不了两分钟但能挡住大部分“重启后才发现”的问题。我的习惯是每次换卡、换线、升级内核后都跑一次把输出和上次对比。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →