先给解决方法

在Debian中,可以通过创建一个systemd服务或使用 /etc/rc.local脚本来实现开机自动执行命令。以下是两种方法的步骤:

方法一:创建systemd服务

  1. 创建服务文件
    打开终端,创建一个新的systemd服务文件:

    sudo nano /etc/systemd/system/scsi-disk-config.service
  2. 编辑服务文件
    将以下内容复制到文件中:

    [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
  3. 保存并退出
    Ctrl+O保存文件,然后按 Enter确认,最后按 Ctrl+X退出编辑器。
  4. 启用服务
    使systemd读取新服务文件并启用它,以确保开机自动运行:

    sudo systemctl daemon-reload
    sudo systemctl enable scsi-disk-config.service
  5. 立即启动服务(可选)
    如果你想立即执行该服务而不重启系统,可以运行:

    sudo systemctl start scsi-disk-config.service

方法二:使用 /etc/rc.local

  1. 编辑 rc.local文件
    如果 /etc/rc.local文件不存在或被删除,可以创建一个新的文件:

    sudo nano /etc/rc.local
  2. 编辑文件内容
    在文件中添加你的命令,确保在 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
  3. 保存并退出
    Ctrl+O保存文件,然后按 Enter确认,最后按 Ctrl+X退出编辑器。
  4. 设置文件权限
    确保 rc.local文件具有可执行权限:

    sudo chmod +x /etc/rc.local
  5. 启用 rc.local服务(对于systemd系统)
    如果你的Debian系统使用systemd(现代Debian版本通常如此),需要启用rc-local服务:

    sudo systemctl enable rc-local.service

通过以上任一方法,你的命令将在每次系统启动时自动执行。

若不生效,则需另外排查:

  1. 某些背板/硬盘笼自带扩展芯片(Expander),固件强制不掉电——只能换“真直通”背板。
  2. 多电源方案时,硬盘笼比主机先掉电——给笼子和主机接同一 PSU 的 PWR_OK 信号,或使用 24-pin 同步器。
  3. 确认内核已加载对应 HBA 驱动(lsinitrd | grep mpt3sas / qla2xxx / ...)。
  4. 若使用 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,让内核重新走正常的“磁头归位再断电”流程,问题就消失了。

最后修改:2025 年 10 月 24 日
如果觉得我的文章对你有用,请随意赞赏