![Linux 内核不断唤醒通过 hdparm 置于睡眠状态的 HDD](https://linux22.com/image/206864/Linux%20%E5%86%85%E6%A0%B8%E4%B8%8D%E6%96%AD%E5%94%A4%E9%86%92%E9%80%9A%E8%BF%87%20hdparm%20%E7%BD%AE%E4%BA%8E%E7%9D%A1%E7%9C%A0%E7%8A%B6%E6%80%81%E7%9A%84%20HDD.png)
(我的系统是Debian 11 Bullseye + GNOME 3.38.6)
我有一个 Seagate 2TB 仅用于存储目的,由于它的噪音很大,我将其置于睡眠状态,除非我使用以下命令访问存储:
sudo hdparm -Y /dev/sda
当执行上述操作时,硬盘驱动器进入睡眠状态,但几分钟后,有东西唤醒了硬盘驱动器,我不知道是什么。
我检查了日志,显然每 10 分钟硬盘再次唤醒之前就会发生以下情况:
Jun 09 20:36:59 user0 kernel: ata2: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
Jun 09 20:36:59 user0 kernel: ata2.00: ACPI cmd ef/10:06:00:00:00:00 (SET FEATURES) succeeded
Jun 09 20:36:59 user0 kernel: ata2.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out
Jun 09 20:36:59 user0 kernel: ata2.00: ACPI cmd b1/c1:00:00:00:00:00 (DEVICE CONFIGURATION OVERLAY) filtered out
Jun 09 20:37:02 user0 kernel: ata2.00: ACPI cmd ef/10:06:00:00:00:00 (SET FEATURES) succeeded
Jun 09 20:37:02 user0 kernel: ata2.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out
Jun 09 20:37:02 user0 kernel: ata2.00: ACPI cmd b1/c1:00:00:00:00:00 (DEVICE CONFIGURATION OVERLAY) filtered out
Jun 09 20:37:02 user0 kernel: ata2.00: configured for UDMA/133
造成这种情况的原因/如何防止这种情况?
更新。上述消息仅在 HDD 处于休眠状态时才会出现。否则它们不会在日志中重复出现。
答案1
以下内容可以帮助您了解导致此问题的原因,但不能帮助您解决问题。
您将需要一个用 编译的内核CONFIG_BLK_DEV_IO_TRACE=y
(您可以使用命令检查这一点$ zcat /proc/config.gz |grep BLK_DEV_IO_TRACE
,但前提是内核是用 编译的CONFIG_IKCONFIG_PROC=y
)。
现在您已经拥有了,您可以使用btrace
/blktrace
(debian 软件包是块跟踪) 作为根,例如:
$ sudo btrace /dev/sdc
或等效的:sudo blktrace -d /dev/sdc -o - | blkparse -i -
这将为您提供如下输出,但仅当访问 /dev/sdc (自己使用 sda)时发生:
8,32 4 1 0.000000000 35200 Q FWS [sync]
8,32 4 2 0.000005329 35200 G FWS [sync]
8,32 4 3 0.000024868 166 D FN [kworker/4:1H]
8,32 0 1 0.005341892 35201 D R 36 [sdparm]
8,32 0 2 0.005360604 12 C R [0]
8,32 0 3 0.005483027 35201 D N 0 [sdparm]
8,32 2 1 0.008090821 13354 D R 32 [(null)]
8,32 2 2 0.008109065 24 C R [0]
8,32 2 3 0.008274033 13354 D R 64 [(null)]
8,32 2 4 0.008290535 24 C R [0]
8,32 2 5 0.008435087 13354 D R 64 [(null)]
8,32 2 6 0.008451221 24 C R [0]
8,32 2 7 0.008649311 13354 D R 8256 [(null)]
8,32 2 8 0.008665588 24 C R [65415]
8,32 2 9 0.008839399 13354 D R 8 [(null)]
8,32 2 10 0.008856004 24 C R [0]
8,32 2 11 0.008905781 13354 D R 512 [(null)]
8,32 2 12 0.008913061 24 C R [0]
8,32 2 13 0.008957477 13354 D R 512 [(null)]
8,32 2 14 0.008963625 24 C R [0]
8,32 2 15 0.017343228 35206 Q RA 35156656000 + 8 [udevd]
8,32 2 16 0.017344264 35206 G RA 35156656000 + 8 [udevd]
8,32 2 17 0.017344513 35206 P N [udevd]
8,32 2 18 0.017344733 35206 U N [udevd] 1
8,32 2 19 0.017344993 35206 I RA 35156656000 + 8 [udevd]
8,32 2 20 0.017346335 35206 D RA 35156656000 + 8 [udevd]
8,32 2 21 0.017613109 35206 Q RA 35156655864 + 8 [udevd]
8,32 2 22 0.017613575 35206 G RA 35156655864 + 8 [udevd]
8,32 2 23 0.017613672 35206 P N [udevd]
8,32 2 24 0.017613775 35206 U N [udevd] 1
8,32 2 25 0.017613935 35206 I RA 35156655864 + 8 [udevd]
8,32 2 26 0.017614656 35206 D RA 35156655864 + 8 [udevd]
8,32 2 27 0.017728317 35206 Q RA 35156656064 + 8 [udevd]
8,32 2 28 0.017728616 35206 G RA 35156656064 + 8 [udevd]
8,32 2 29 0.017728680 35206 P N [udevd]
8,32 2 30 0.017728750 35206 U N [udevd] 1
您可以看到一些使用/dev/sdc的进程名称,例如sync、sdparm、udevd和kernel kworker。