## 先给解决方法 在Debian中,可以通过创建一个systemd服务或使用 `/etc/rc.local`脚本来实现开机自动执行命令。以下是两种方法的步骤: ### 方法一:创建systemd服务 1. **创建服务文件**: 打开终端,创建一个新的systemd服务文件: ```bash sudo nano /etc/systemd/system/scsi-disk-config.service ``` 2. **编辑服务文件**: 将以下内容复制到文件中: ```ini [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读取新服务文件并启用它,以确保开机自动运行: ```bash sudo systemctl daemon-reload sudo systemctl enable scsi-disk-config.service ``` 5. **立即启动服务(可选)**: 如果你想立即执行该服务而不重启系统,可以运行: ```bash sudo systemctl start scsi-disk-config.service ``` ### 方法二:使用 `/etc/rc.local` 1. **编辑 `rc.local`文件**: 如果 `/etc/rc.local`文件不存在或被删除,可以创建一个新的文件: ```bash sudo nano /etc/rc.local ``` 2. **编辑文件内容**: 在文件中添加你的命令,确保在 `exit 0`之前添加: ```bash #!/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`文件具有可执行权限: ```bash sudo chmod +x /etc/rc.local ``` 5. **启用 `rc.local`服务(对于systemd系统)**: 如果你的Debian系统使用systemd(现代Debian版本通常如此),需要启用rc-local服务: ```bash 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,让内核重新走正常的“磁头归位再断电”流程,问题就消失了。 Loading... ## 先给解决方法 在Debian中,可以通过创建一个systemd服务或使用 `/etc/rc.local`脚本来实现开机自动执行命令。以下是两种方法的步骤: ### 方法一:创建systemd服务 1. **创建服务文件**: 打开终端,创建一个新的systemd服务文件: ```bash sudo nano /etc/systemd/system/scsi-disk-config.service ``` 2. **编辑服务文件**: 将以下内容复制到文件中: ```ini [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读取新服务文件并启用它,以确保开机自动运行: ```bash sudo systemctl daemon-reload sudo systemctl enable scsi-disk-config.service ``` 5. **立即启动服务(可选)**: 如果你想立即执行该服务而不重启系统,可以运行: ```bash sudo systemctl start scsi-disk-config.service ``` ### 方法二:使用 `/etc/rc.local` 1. **编辑 `rc.local`文件**: 如果 `/etc/rc.local`文件不存在或被删除,可以创建一个新的文件: ```bash sudo nano /etc/rc.local ``` 2. **编辑文件内容**: 在文件中添加你的命令,确保在 `exit 0`之前添加: ```bash #!/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`文件具有可执行权限: ```bash sudo chmod +x /etc/rc.local ``` 5. **启用 `rc.local`服务(对于systemd系统)**: 如果你的Debian系统使用systemd(现代Debian版本通常如此),需要启用rc-local服务: ```bash 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 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏