先给解决方法
在Debian中,可以通过创建一个systemd服务或使用 /etc/rc.local脚本来实现开机自动执行命令。以下是两种方法的步骤:
方法一:创建systemd服务
创建服务文件:
打开终端,创建一个新的systemd服务文件:sudo nano /etc/systemd/system/scsi-disk-config.service编辑服务文件:
将以下内容复制到文件中:[Unit] Description=Configure SCSI Disk Runtime Start/Stop and Shutdown After=network.target [Service] Type=oneshot ExecStart=/bin/sh -c 'for i in /sys/class/scsi_disk/*/manage_runtime_start_stop; do echo 1 > $i; done' ExecStart=/bin/sh -c 'for i in /sys/class/scsi_disk/*/manage_shutdown; do echo 1 > $i; done' [Install] WantedBy=multi-user.target- 保存并退出:
按Ctrl+O保存文件,然后按Enter确认,最后按Ctrl+X退出编辑器。 启用服务:
使systemd读取新服务文件并启用它,以确保开机自动运行:sudo systemctl daemon-reload sudo systemctl enable scsi-disk-config.service立即启动服务(可选):
如果你想立即执行该服务而不重启系统,可以运行:sudo systemctl start scsi-disk-config.service
方法二:使用 /etc/rc.local
编辑
rc.local文件:
如果/etc/rc.local文件不存在或被删除,可以创建一个新的文件:sudo nano /etc/rc.local编辑文件内容:
在文件中添加你的命令,确保在exit 0之前添加:#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # 在此处添加你的命令 for i in /sys/class/scsi_disk/*/manage_runtime_start_stop; do echo 1 > $i; done for i in /sys/class/scsi_disk/*/manage_shutdown; do echo 1 > $i; done exit 0- 保存并退出:
按Ctrl+O保存文件,然后按Enter确认,最后按Ctrl+X退出编辑器。 设置文件权限:
确保rc.local文件具有可执行权限:sudo chmod +x /etc/rc.local启用
rc.local服务(对于systemd系统):
如果你的Debian系统使用systemd(现代Debian版本通常如此),需要启用rc-local服务:sudo systemctl enable rc-local.service
通过以上任一方法,你的命令将在每次系统启动时自动执行。
若不生效,则需另外排查:
- 某些背板/硬盘笼自带扩展芯片(Expander),固件强制不掉电——只能换“真直通”背板。
- 多电源方案时,硬盘笼比主机先掉电——给笼子和主机接同一 PSU 的 PWR_OK 信号,或使用 24-pin 同步器。
- 确认内核已加载对应 HBA 驱动(lsinitrd | grep mpt3sas / qla2xxx / ...)。
- 若使用 Proxmox / ESXi 等虚拟化,要把“PCIe 直通”同时打开 IOMMU(Intel VT-d/AMD-Vi),否则宿主机收不到关机事件。
造成非正常关机的原因
现在很多直通卡只实现了一个最简的 SCSI-SES 或 SGPIO,没有向 ACPI 报告“我能给下游设备做电源管理”。内核在 scsi_alloc_sdev() 时因此把
manage_system_start_stop = 0
manage_shutdown = 0结果 sd_shutdown() 检索发现为 0,直接跳过发命令这一步,
系统最后一条 ACPI_POWER_OFF 把 12 V/5 V 直接关闭,硬盘非正常关机,导致SMART 里 C0(Power-Off Retract Count)每关一次 +1。
2.正常接主板上的硬盘就不会有这个问题,因为主板自带的 AHCI/SATA 控制器在 ACPI 表里通常带有 ACPI_FADT_LOW_POWER_S0 或者 _PS3 方法,内核自动把manage_start_stop / manage_system_start_stop 置 1,于是关机流程里会走sd_shutdown() → scsi_disk_stop() → START_STOP_UNIT 命令 → 硬盘磁头归位 → 再断电
只要把对应 sysfs 标志手动改成 1,让内核重新走正常的“磁头归位再断电”流程,问题就消失了。