解决 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
2
3
4
5
6
7
8
9
10
for disk in /sys/class/scsi_disk/*; do
echo "=== $disk ==="
for attr in manage_shutdown \
manage_system_start_stop \
manage_runtime_start_stop \
manage_start_stop; do
[ -f "$disk/$attr" ] && \
echo "$attr=$(cat "$disk/$attr")"
done
done

主要关注以下属性:

参数 作用
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
2
/sys/class/scsi_disk/0:0:0:0
/sys/class/scsi_disk/0:0:1:0

以 root 用户执行:

1
2
echo 1 > /sys/class/scsi_disk/0:0:0:0/manage_shutdown
echo 1 > /sys/class/scsi_disk/0:0:1:0/manage_shutdown

也可以针对所有具有此可写属性的 SCSI 磁盘设置(注意,这会影响其他匹配的磁盘):

1
2
3
4
5
for disk in /sys/class/scsi_disk/*; do
if [ -w "$disk/manage_shutdown" ]; then
echo 1 > "$disk/manage_shutdown"
fi
done

检查是否写入成功:

1
grep -H . /sys/class/scsi_disk/*/manage_shutdown

预期会看到类似结果:

1
2
/sys/class/scsi_disk/0:0:0:0/manage_shutdown:1
/sys/class/scsi_disk/0:0:1: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
2
3
udevadm control --reload-rules
udevadm trigger --subsystem-match=scsi_disk --action=change
udevadm settle

验证结果

重启后,重新执行第二节的状态检查命令。本例两块硬盘显示:

1
2
3
4
5
6
7
8
9
10
11
=== /sys/class/scsi_disk/0:0:0:0 ===
manage_shutdown=1
manage_system_start_stop=0
manage_runtime_start_stop=0
manage_start_stop=0

=== /sys/class/scsi_disk/0:0:1:0 ===
manage_shutdown=1
manage_system_start_stop=0
manage_runtime_start_stop=0
manage_start_stop=0

可以看到两块盘的 manage_shutdown 均为 1。

补充说明

理论上,这种方法也适用于其他通过 Linux SCSI 磁盘驱动管理、并暴露可写 manage_shutdown 属性的磁盘,并不局限于 LSI 3008 或 HGST HC620。其他品牌和型号可以按需调整 udev 规则的匹配条件,并自行验证停转效果。