解决 LSI 3008 直通卡连接的硬盘在关机时不自动停转的问题(HGST HC620 SAS 版)
近期遇到 Linux 关机过程中硬盘未正常停转的问题。本人使用环境较为特殊,是使用 LSI SAS 3008 HBA 直通卡连接 HGST Ultrastar HC620 的 SAS 版本硬盘。
遇到此问题,可以检查 Linux SCSI 磁盘驱动提供的
manage_shutdown
属性:它控制正常关机时是否尝试向磁盘发送停止命令。可以用先通过
echo 临时设置值,并实际关机测试,确认有效后,再通过 udev
规则持久化。
硬件环境
- HBA 控制器:LSI SAS 3008(直通模式)
- 硬盘型号:
HSH721414AL42M0 - 系统:Debian 12
- 连接方式:SAS 硬盘连接 LSI HBA 控制器
检查 SCSI 磁盘关机管理状态
执行:
1 | for disk in /sys/class/scsi_disk/*; do |
主要关注以下属性:
| 参数 | 作用 |
|---|---|
manage_shutdown |
管理正常关机时是否向磁盘发送停止命令 |
manage_system_start_stop |
管理系统挂起、恢复等电源状态转换时的磁盘启停 |
manage_runtime_start_stop |
管理运行时电源管理相关的磁盘启停 |
manage_start_stop |
兼容性状态属性,不需要单独设置 |
manage_shutdown=0
表示该功能未开启;manage_shutdown=1
表示已开启。manage_start_stop=0 不代表
manage_shutdown 无效。
使用 echo 临时设置
本例两块 SAS 硬盘对应的路径为:
1 | /sys/class/scsi_disk/0:0:0:0 |
以 root 用户执行:
1 | echo 1 > /sys/class/scsi_disk/0:0:0:0/manage_shutdown |
也可以针对所有具有此可写属性的 SCSI 磁盘设置(注意,这会影响其他匹配的磁盘):
1 | for disk in /sys/class/scsi_disk/*; do |
检查是否写入成功:
1 | grep -H . /sys/class/scsi_disk/*/manage_shutdown |
预期会看到类似结果:
1 | /sys/class/scsi_disk/0:0:0:0/manage_shutdown:1 |
之后执行一次正常关机,观察硬盘是否停转。此设置是临时的,重启或设备重新初始化后可能恢复默认值。如果有效,再进行持久化设置。
通过 udev 永久设置
创建规则文件:
1 | vim /etc/udev/rules.d/99-hgst-sas-shutdown.rules |
写入:
1 | ACTION=="add", SUBSYSTEM=="scsi_disk", ATTRS{vendor}=="HGST*", ATTRS{model}=="HSH721414AL42M0", ATTR{manage_shutdown}="1" |
该规则在匹配型号的 SCSI 磁盘添加时,将 manage_shutdown
设置为 1,不会主动修改其他型号的设备。如果使用不同型号,
可以按需修改。
保存后重新加载规则:
1 | udevadm control --reload-rules |
由于规则只匹配 add
事件,新规则将在设备下次添加(例如重新启动时)应用。若希望在当前系统上通过
change 事件验证,也可以将规则首项改为
ACTION=="add|change",然后执行:
1 | udevadm control --reload-rules |
验证结果
重启后,重新执行第二节的状态检查命令。本例两块硬盘显示:
1 | === /sys/class/scsi_disk/0:0:0:0 === |
可以看到两块盘的 manage_shutdown 均为
1。
补充说明
理论上,这种方法也适用于其他通过 Linux SCSI
磁盘驱动管理、并暴露可写 manage_shutdown
属性的磁盘,并不局限于 LSI 3008 或 HGST
HC620。其他品牌和型号可以按需调整 udev
规则的匹配条件,并自行验证停转效果。