ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DL388 Gen10装系统认不到盘:阵列卡驱动加载与排查

DL388 Gen10装系统认不到盘:阵列卡驱动加载与排查

简介:面向 HP ProLiant DL388 Gen10 服务器装机与运维场景的阵列卡驱动包,主要解决系统安装阶段因缺少 Smart Array 驱动而无法识别硬盘空间的问题,适合企业 IT 运维、服务器部署人员及遇到同类故障的读者参考。压缩包共 9 个文件,大小约 1.06MB,包含 exe 安装程序、inf 驱动信息文件、sys 核心驱动、cat 数字签名及 xml 配置脚本等,覆盖驱动安装、系统识别与完整性校验所需的关键组件。目前已有 1728 人学习或下载。包内文件结构较清晰,可帮助读者核对 SmartPqi 驱动版本与签名状态,理解阵列卡驱动由安装入口、设备描述、核心模块和配置文件构成的完整链路,为服务器装机前的驱动准备、故障定位与兼容性排查提供可直接参考的样本。

1. 装系统时认不到硬盘,问题多半不在盘上

机架上新来一台 HP ProLiant DL388 Gen10,U 盘插好,安装程序一路走到「你想把系统装在哪里」,硬盘列表却是空的。托架上的盘亮着绿灯,开机自检时阵列卡也报了正常,可安装器就是看不到任何一块盘。第一次碰 Gen10 的人往往卡在这一步,接着开始拆盘、换槽位、怀疑硬盘损坏,几个小时的排查全花在一个并不存在的故障上。

真实原因通常简单得让人意外:安装介质里没有这块阵列卡的驱动。Gen10 这一代换用了新的 Smart Array 控制器,很多旧镜像自带的通用存储驱动覆盖不到它,安装器连控制器都识别不了,自然不会把挂在上面的逻辑盘列出来。这篇记录面向手上有一台 DL388 Gen10、准备装 Windows Server 或 RHEL、或者正从旧机型迁移过来的同学,把「HP ProLiant DL388 驱动」这件事从版本选择到加载方式再到装坏之后怎么救,一次讲透。

2. 装前把驱动清单列清:DL388 Gen10 到底要装几个驱动

拿到压缩包的第一件事不是双击安装,而是先看清里面装了什么。DL388 Gen10 的驱动不是「一个包解决所有问题」,它至少分成三个互不相干的类别,装错类别的后果各不相同,有些甚至要重装系统才能挽回。

2.1 压缩包里那三类驱动,先分清谁管谁

打开 HP-DL388-Gen10.zip,目录一般会按操作系统分,往下再按硬件分。我习惯先按「这块驱动对应哪个硬件、缺了它会出现什么症状」做一张对照表,装的时候心里有数,出问题也知道往哪儿查。

类别对应硬件缺失时的症状包内目录常见关键字
存储控制器驱动Smart Array P408i-a / E208i-a / P204i-b SR Gen10安装界面看不到硬盘,或系统起来后设备管理器有黄色感叹号Storage / SmartArray / smartpqi / hpsa
网络适配器驱动板载 1Gb 多口网卡、366FLR 一类夹层卡系统装完没有网络,iLO 能进但系统侧 ping 不通Network / NIC / Ethernet
芯片组与通道驱动芯片组、iLO 5 Channel Interface Driver、指示灯与 USB设备管理器残留未知设备,管理软件读不到硬件信息Chipset / iLO / Management

三类的优先级完全不同。存储控制器驱动决定你能不能装上系统,属于「不装就寸步难行」;网卡驱动决定装完之后能不能远程接管;芯片组和 iLO 通道驱动属于「不装也能跑,但管理工具会缺胳膊少腿」。所以真正需要提前准备的只有第一类,后两类可以进系统再补。

还要注意一点:同样是「存储驱动」,Gen10 和 Gen9 走的不是同一条内核路径。Gen10 的 Smart Array 在 Linux 下多数由smartpqi接管,更早的 P440ar 一类是hpsa。这两个模块互不替代,网上抄来的旧命令套到 Gen10 上,lsmod里根本看不到对应条目,白折腾。

2.2 版本对齐:阵列卡固件和驱动必须配套

驱动版本不能凭「最新就是最好」来选。阵列卡有一套自己的固件,固件和驱动之间存在配套关系:固件太新、驱动太旧,轻则管理工具读不出缓存模块状态,重则开机阶段阵列卡初始化超时,系统卡在转圈。反过来驱动很新、固件停留在出厂版本,也可能出现逻辑盘掉线后无法自动重建。

我的做法是先登 iLO 5 看当前固件版本,再决定要不要一起升。iLO 的 System Information 里能看到存储控制器的固件号,记下来,和驱动包说明里的支持列表对一遍。如果这台机器是从别的项目转过来的,固件很可能被人升过一轮,这时候单拿一个来路不明的驱动包装上去,就是给自己埋雷。

提示:驱动包里的版本号以.inf或.rpm文件自身的版本为准,不要看压缩包文件名。同一份 zip 里可能同时放了适配不同系统版本的多个子目录。

判断要不要升固件,有个很实用的信号:如果系统里能看到盘、能读写,但 Smart Storage Administrator 里缓存模块状态显示异常,或者阵列卡频繁报「Cache module not attached」,那基本是固件与驱动脱节,先对齐版本再谈性能。

2.3 介质准备:把 zip 变成安装器能读的 U 盘

Windows 安装界面只认 FAT32 和部分 NTFS 分区,而且只能读取单个目录下的.inf。所以不要把整个 zip 原封不动丢进 U 盘,先把 Windows 那一层解出来铺平。

# 先解压到一个临时目录,看清结构再决定拷哪些 unzip -o HP-DL388-Gen10.zip -d /tmp/dl388-drv # 只看两层目录,快速判断按系统还是按硬件分类 find /tmp/dl388-drv -maxdepth 2 -type d | sort # 把 Windows 驱动单独摊平到一个目录,方便安装器一次性读完 mkdir -p /tmp/usb/drivers/win find /tmp/dl388-drv -iname '*.inf' -path '*Windows*' -exec cp {} /tmp/usb/drivers/win/ \; ls /tmp/usb/drivers/win

find那一行的意思是:只在路径里带Windows的目录下找.inf,把文件全部拷到同一个平面目录。摊平的好处是安装器扫描时不会因为层级太深漏掉子目录里的驱动。-maxdepth 2是为了避免在大包上递归太久,先看个大概结构,确认分类逻辑之后再深挖。

如果拿到的是 HPE 常见的自解压 SoftPaq(一个.exe),不要直接双击运行,它会走安装流程而不是解压。用/s /e /f:<路径>这三个参数只解压不安装:

:: /s 静默 /e 仅解压 /f 指定输出目录,避免污染系统临时目录 SoftPaq文件名.exe /s /e /f C:\drv\dl388 :: 确认解压出了 inf,而不是只丢了一个 setup.exe dir C:\drv\dl388\*.inf /s

这一步的意义在于:安装界面里点「加载驱动程序」时,指向的是文件夹,安装器自己去找匹配的.inf。如果目录里只有setup.exe,它什么也找不到。

3. 阵列卡驱动加载:三种装法对应三个场景

同一个驱动包,装法取决于你装的是什么系统、介质是不是自己做的、以及这台机器是不是第一次上架。下面三种方式覆盖了绝大多数情况,按场景挑一个就行,不必全都走一遍。

3.1 Windows 安装界面加载:F6 方式的正确姿势

Windows Server 2016/2019/2022 的安装镜像自带一批通用存储驱动,但不见得覆盖到 Gen10 这块卡。走到「选择安装位置」页面,如果列表空白,点左下角「加载驱动程序」,浏览到 U 盘里摊平的那个win目录,安装器会列出匹配的驱动条目。

选择时有个细节容易翻车:列表里可能同时出现好几个条目,名字相近但适用控制器不同。挑名字里带完整型号的那个,比如「Smart Array P408i-a SR Gen10」,不要选泛化的「RAID Controller」。选错的表现是加载完成后列表依然是空的,你会以为驱动包坏了。

加载成功后,硬盘列表会立刻出现逻辑盘。此时不要急着点下一步,先确认容量和数量对不对——如果出现的是多块物理盘而不是一块逻辑盘,说明阵列还没配,得先去配阵列(见 3.3)。

3.2 Linux 用 DUD 驱动盘:install 启动参数怎么加

Linux 侧的逻辑不太一样。RHEL 8/9、较新的 SLES 主线内核里smartpqi是内置的,多数情况直接免驱就能看到盘。真正需要额外加载的是老一些的发行版,或者厂商定制过内核的场景。这时候用的是 DUD(Driver Update Disk)。

做法是把驱动包里的 DUD 镜像写到 U 盘的第二个分区,然后在安装器启动菜单按e编辑内核行,末尾追加参数:

# 安装器启动菜单按 e,在内核行尾部追加,注意不要删掉原有的 inst.xxx 参数 inst.dd=hd:/dev/sdb2 # 如果记不住分区名,也可以只写 inst.dd,安装器会弹出设备选择界面 inst.dd

inst.dd=hd:/dev/sdb2里的hd:表示从本地块设备读,/dev/sdb2是 U 盘的第二个分区。之所以要单独分一个区,是因为安装介质本身占着第一个分区,把 DUD 混在一起会互相覆盖。写完回车启动,安装器会在加载阶段把这个分区里的驱动包解开并加载进内存。

判断有没有生效,不用等装完,在安装器的第二个虚拟终端(Ctrl+Alt+F2)里敲:

# 看内核模块是否已经就位 lsmod | grep -E 'smartpqi|hpsa' # 看控制器有没有被 SCSI 层识别 cat /sys/class/scsi_host/host*/proc_name | sort -u

第二条命令输出里应该能看到smartpqi字样。如果只有ahci、megaraid_sas之类,说明 DUD 没加载上,回去检查分区号和内核行有没有写错。

3.3 免驱方案:先用 Intelligent Provisioning 把逻辑盘做好

有一种情况完全不用碰驱动加载:机器出厂状态、盘是全新的、你只是想把系统装上去。这时候直接开机按F10进 Intelligent Provisioning,它能识别 Gen10 的全部阵列卡,在里面把物理盘组成 RAID 1 或 RAID 5,做好逻辑盘,再让它引导去装系统。

这条路的好处是绕开了「安装器认不到卡」的死循环。阵列配置在固件层完成,逻辑盘对上层就是一个标准块设备,安装器哪怕只有通用驱动,也常常能把它列出来。我用这种方式处理过好几次赶时间的上架,从开机到进入安装界面不超过十分钟。

缺点也明显:Intelligent Provisioning 会顺带检查固件一致性,如果检测到固件版本落后,它会推你去跑更新。赶时间的时候这一步很烦,但长期看是好事——把固件一次性拉齐,后面少踩很多坑。

3.4 确认加载成功:从 lsmod 到设备管理器

不管用哪种方式,装完的第一件事都是确认驱动真的挂上了,而不是「碰巧能用」。

Windows 侧打开设备管理器,展开「存储控制器」,应该能看到型号完整的 Smart Array 条目,且没有黄色感叹号。想批量确认就上 PowerShell:

# 列出所有 SCSI/RAID 控制器,看型号和状态 Get-PnpDevice -Class SCSIAdapter | Select-Object FriendlyName, Status, InstanceId | Format-Table -AutoSize # 顺手查一下有没有带感叹号的未知设备,这类通常是芯片组驱动没补 Get-PnpDevice | Where-Object { $_.Status -ne 'OK' } | Select-Object FriendlyName, Status, Class

Status为OK才算过关,出现Error或Unknown就要回去补对应类别的驱动。第二条命令是漏网之鱼检查,芯片组和 iLO 通道驱动缺失时通常就藏在里面。

Linux 侧对应的是:

# 模块、设备节点、控制器名三件套一起看 lsmod | grep -E 'smartpqi|hpsa' lsscsi -g ssacli ctrl all show config

lsscsi -g能看到逻辑盘和对应的 sg 设备节点,ssacli直接读阵列卡配置。三条都正常,说明驱动这一层彻底通了。

4. 系统装完补驱动:网卡、芯片组与 iLO 侧配置

系统能起来只意味着存储这一关过了。真正的收尾工作在进系统之后:网卡不通等于没法远程接管,芯片组没补等于管理工具缺数据,iLO 侧的固件没对齐等于下次重启还得赌一把。

4.1 网卡驱动:pnputil 批量导入比手点靠谱

一台机器上往往有好几个网络端口,一个个在设备管理器里点「更新驱动」效率太低,还容易漏。用pnputil一次性把目录里所有.inf灌进去:

# /subdirs 递归子目录,/install 导入后立即尝试安装到匹配设备 pnputil /add-driver C:\drv\dl388\Windows\*.inf /subdirs /install # 导入完成后核对驱动仓库里确实多了条目 pnputil /enum-drivers | Select-String -Pattern 'hp|HPE|Smart Array' -Context 0,2

/subdirs是关键参数,少了它只会扫当前目录这一层,深层子目录里的网卡驱动会被跳过。/install让它在导入的同时尝试匹配现有设备,省掉一次手动触发。执行完最好重启一次,让网络栈重新枚举。

有些网卡驱动只提供.exe安装程序,没有独立.inf。这种就用静默参数跑:setup.exe /s,HPE 的 SoftPaq 一般还支持/silent。跑之前先看同目录下有没有 readme,静默参数的写法各家不完全一样。

4.2 安装顺序:芯片组先行,存储居中,网络殿后

驱动安装顺序不是玄学,是有实际影响的。芯片组驱动负责把主板上的各种总线控制器描述清楚,装晚了,后面的存储和网络驱动可能挂在一个「未知的父设备」下面,功能能用但状态显示不正常。

我一般按这个顺序走:

  1. 芯片组与 iLO 5 Channel Interface Driver——先把硬件拓扑描述清楚
  2. 存储控制器驱动(如果系统里还没装)——确保阵列卡状态可读
  3. 网络适配器驱动——恢复远程访问能力
  4. 管理组件(SSA、iLO 集成工具等)——最后装,它们依赖前三者

第 2 步容易被跳过,理由是「系统都装上了说明驱动没问题」。但装机时的驱动可能是安装器临时加载的,进系统后并没有真正落到驱动仓库里,设备管理器里显示的是「Microsoft 基本磁盘」。这种情况在克隆部署的机器上尤其常见。

4.3 iLO 5 侧检查:固件版本和驱动版本要对得上

系统侧装完,别急着交付,登一次 iLO 5 把固件版本抄下来,和驱动包说明里的配套表对一遍。iLO 的 System Information 页面能看到存储控制器、网卡、BIOS 各自的固件号。

配套关系不对齐的典型表现是:系统里一切正常,但 Active Health System 日志里反复出现控制器复位记录,或者阵列卡的缓存电池状态读不出来。这类问题不会立刻让业务中断,却会在下一次非正常断电时暴露——缓存里的数据没写进盘,逻辑盘一致性校验失败。

固件升级建议走 SPP(Service Pack for ProLiant)整体刷,不要单独拿一个组件包往里灌。单独刷的风险是版本组合没人验证过,出问题也很难定位到具体是哪个组件。

5. 避坑与排查:Gen10 装驱动的五条血泪记录

下面这五条都是我在 DL388 Gen10 上真实遇到过的,按「现象 → 原因 → 解决」记下来,遇到类似症状可以直接对号入座。

5.1 装 Server 2008 R2 一类老系统,引导阶段直接黑屏

现象:驱动加载成功,硬盘也认到了,系统文件复制完重启,卡在引导阶段,屏幕一片黑,没有任何报错。

原因:Gen10 出厂默认是 UEFI 引导模式,老系统不支持 UEFI 引导,必须切到 Legacy BIOS(CSM)。驱动问题和引导模式问题经常同时出现,容易误判成驱动没装好。

解决:进 BIOS/Platform Configuration(RBSU),把 Boot Mode 改成 Legacy BIOS,同时确认引导顺序里阵列卡逻辑盘排在第一位。改完保存重启,再走一遍安装。

5.2 驱动装完盘能用,但写入慢得离谱

现象:阵列卡驱动正常,逻辑盘读写都通,但顺序写入速度只有几十 MB/s,和机械盘单盘差不多。

原因:阵列卡的缓存电池或超级电容还没充好电,写策略自动降级为 Write Through,所有写入直通磁盘。这时候看驱动版本、换线、换盘都是白费劲。

解决:用 SSA 或ssacli ctrl all show status看缓存模块状态,等电池充到 Ready 再测。如果状态一直是 Failed,检查超级电容的排线有没有插紧——运输途中松脱很常见。

5.3 Linux 下lsmod里根本看不到 smartpqi

现象:按教程加了inst.dd参数,装完进系统,lsmod | grep smartpqi什么都没有,但盘能读写。

原因:驱动被编译进了内核(built-in),不是以模块形式加载,所以lsmod里查不到。这种情况下lsmod不给结果不代表驱动没生效。

解决:改用cat /sys/class/scsi_host/host*/proc_name确认,输出里有smartpqi就说明在用。另一个佐证是dmesg | grep -i smartpqi,内置驱动同样会打初始化日志。

5.4 开机提示存在外部配置,盘全部显示为 Foreign

现象:机器挪过位置或者换过阵列卡,开机自检报「Foreign Configuration Found」,系统里看不到原来的逻辑盘。

原因:阵列卡的配置信息存在盘上和卡上的 NVRAM 里,换了卡或者卡被重置过,两边对不上,卡就把这些盘当成「外来盘」保护起来,不会自动挂载。

解决:进 SSA 或开机时的阵列配置界面,选 Import Foreign Configuration 把配置导回来。不要选 Clear,那是把这些盘上的阵列元数据抹掉,数据就真找不回来了。导入前先确认这批盘的顺序和原来一致。

5.5 用 clonezilla 一类工具克隆,目标机起不来

现象:同型号机器之间克隆系统,源机正常,目标机启动后蓝屏或卡在启动画面。

原因:克隆把源机的存储控制器驱动一起带过去了,但目标机的阵列卡固件版本不同,或者逻辑盘的分区偏移不一致。也可能是克隆工具没有正确处理引导分区。

解决:克隆完成后,用安装介质引导进修复模式,重新加载对应版本的阵列卡驱动,再跑一次引导修复。根本的解决办法是克隆前把两台机器的固件版本拉齐,别在版本不一致的机器之间做整盘克隆。

6. 装完怎么验证:三层检查确认阵列卡真的跑起来了

驱动装上、系统起来,只能算「看起来能用」。要确认这套环境真的跑得住,我一般走三层检查,从硬件状态到实际读写,一层层往下压。

第一层看控制器状态。Windows 侧用 SSA 打开,控制器、逻辑盘、物理盘三层都要是 OK;Linux 侧一条命令搞定:

# 控制器整体状态、逻辑盘状态、物理盘状态一次看全 ssacli ctrl all show status ssacli ctrl all show config detail | grep -E 'Logical Drive|Physical Drive|Status|Cache'

关注三个字段:控制器 Status 是不是 OK,逻辑盘 Status 是不是 OK,缓存模块状态是不是 Ready。任何一个不是 OK,先解决再往下走。

第二层看系统层面的设备枚举。Windows 用设备管理器确认无感叹号,Linux 用lsscsi -g确认逻辑盘和 sg 节点都在。这一步的目的是排除「控制器正常但系统没挂上」的情况,多见于驱动装了两份互相打架。

第三层做一次真实读写。Windows 上winsat disk -drive c跑一遍,看顺序读写是否落在该型号该 RAID 级别的合理区间;Linux 上用dd加oflag=direct绕过缓存写 4GB,观察速率是否平稳。速率抖动剧烈、写入过程中出现长时间停顿,往往是缓存策略或盘本身的问题。

检查层命令/入口期望结果异常时先看什么
控制器ssacli ctrl all show status控制器、逻辑盘、缓存均 OK缓存模块排线、固件配套
系统枚举lsscsi -g/ 设备管理器逻辑盘存在且无感叹号是否装了两份驱动
实际读写winsat disk/dd oflag=direct速率平稳、无长停顿写策略是否降级为 WT

三层都过,这台机器才算真的装好了。最后补一个我必做的动作:把ssacli ctrl all show config detail的输出和dmesg里跟存储相关的段落各存一份到运维记录里,标上日期和固件版本。下次这台机器出问题,有这份基线在手,判断是「一直就这样」还是「最近变坏了」,能省掉大量猜测。

从那以后我每次装完 Gen10,不管多赶时间,都会强制走一遍这三层验证再交付——驱动这东西装上了不等于装对了,跑起来也不等于跑得对,中间差的往往就是这几分钟。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进