使用 hdparm 在 X 分钟后将 HDD 置于待机状态不起作用

使用 hdparm 在 X 分钟后将 HDD 置于待机状态不起作用

我在家用服务器上使用 Ubuntu 12.04。有 5 个硬盘:一个装有操作系统的 SSD 和 4 个使用 mdadm 配置为 RAID5 的 HDD(三星 HD204UI)。

我并不经常需要 RAID(平均每天一次);它包含多媒体数据和一些备份,因此我决定大多数时间让驱动器处于待机状态。

我使用 hdparm 将驱动器配置为 20 分钟后自动旋转,下面/dev/sda是示例:

hdparm -S 240 /dev/sda

该命令的输出证实了这一点:

/dev/sdb:
 setting standby to 240 (20 minutes)

但问题是,驱动器在最后一次访问后约 5 秒(而不是 20 分钟)就会停止旋转,并且

hdparm -C /dev/sdb

显示:

/dev/sdb:
 drive state is:  standby

为什么驱动器不按配置等待 20 分钟?这与 RAID 设置有关吗?(我不这么认为......)

这个非常短的超时是有问题的,因为它是一个 RAID5,当我访问一个文件时,它会按块分散在四个驱动器上。由于读取驱动器 2 时不需要驱动器 1,因此下次使用它时(在读取驱动器 3 之后)它会进入休眠状态。因此驱动器一直在不停地旋转,导致吞吐量接近于零。

对于关心我的驱动器寿命的人来说:驱动器平均每天旋转一次是没有问题的,因为我更喜欢节省能源和热量而不是驱动器的健康(我使用 RAID5 并且内容不是很重要)。

答案1

您的 BIOS 中启用了 AHCI 吗?如果没有,请尝试将其打开并重试。

如果这仍然不起作用,那么您可能需要尝试一些更复杂的方法,因为hdparm它并不总是能与 SATA 驱动器很好地兼容,而我推测您拥有的就是 SATA 驱动器。

查看这一页对于以下使用 crontab 的相对简单的解决方案:

sudo apt-get install sg3-utils
crontab -e

现在,将其添加到您的 crontab 的底部(将 sdx 替换为您要待机的驱动器):

0-59/15 * * * * ( if [ ! -f /dev/shm/1 ] ; then touch /dev/shm/1 /dev/shm/2; fi ; mv /dev/shm/1 /dev/shm/2; cat /proc/diskstats > /dev/shm/1 ) >/dev/null 2>&1
0-59/15 * * * * ( export HD="sdx "; if [ "$(diff /dev/shm/1 /dev/shm/2 | grep $HD )" =  "" ] ; then /usr/bin/sg_start --stop /dev/$HD; fi ) >/dev/null 2>&1

当然,在尝试任何这些之前,强烈建议对硬盘内容进行完整备份。

答案2

也许更好的方法是:

hdparm -B 1 -Y /dev/设备
hdparm -B 255 /dev/设备

第一个 hdparm 立即将设备置于待机状态。第二个 hdparm 关闭 APM,因此磁盘保持待机模式直到下一次磁盘访问。

答案3

我使用 systemd 单元文件在启动后立即将 spindown 超时设置为最低的 21 分 15 秒。它在每次启动时只运行一次,因为它只是一个临时设置,驱动器会忘记它。除此之外,我的 RAID1 配置为 BTRFS 文件系统设备,包含 2TB 三星 870EVO SSD 和三星 HD204UI。

/etc/systemd/system/hdparm.service

[Unit]
Description=hdparm sleep

[Service]
Type=oneshot
ExecStart=/usr/bin/hdparm -S 255 /dev/sdb

[Install]
WantedBy=multi-user.target

https://wiki.archlinux.org/title/hdparm#Putting_a_drive_to_sleep_directly_after_boot

相关内容