我想将另一块硬盘连接到我的电脑上,我希望它 99% 的时间都处于休眠状态。我只会用它做一些事情,但我需要它一直处于挂载状态。
为了实现这一目标,我想知道:
- 如何记录哪些进程访问了设备?我需要通过记录来判断硬盘被唤醒的原因,以便采取相应措施。
- 我是否需要进行任何特殊的内核设置以便设备可以休眠更长时间?
- 如何设置硬盘的睡眠间隔?
答案1
睡眠间隔称为“APM”(自动电源管理)和 spindown_time。它通过hdparm
以下方式控制:
hdparm -B 50 -S 36 /dev/disk/by-label/BACKUP-HDD
它将使您的 HDD 在约 3 分钟不活动时停止旋转。
答案2
我也遇到过类似的问题。我有 SSD,/dev/sdb
带有操作系统(基于 Ubuntu Xenial 的 Linux Mint 18.1),还有 HDD,/dev/sda
带有数据,我时不时会用到。两个磁盘都加密了。HDD 的分区未安装。而且无论如何,几分钟内 HDD 就会唤醒,然后休眠,然后再次唤醒。一团糟。
这是一个重复的问题有帮助的答案,这表明auditd
要找到行为不良的进程。
apt-get install auditd
auditctl -w /dev/sda -p rwa
然后我用 强制 HDD 进入睡眠状态hdparm -Y /dev/sda
。然后等到我听到 HDD 再次旋转。然后运行ausearch -f /dev/sda
。在我的情况下,它显示如下条目。
time->Sat Feb 25 12:38:17 2017
type=PROCTITLE msg=audit(1488022697.651:1744): proctitle=2F7573722F6C69622F756469736B73322F756469736B7364002D2D6E6F2D6465627567
type=PATH msg=audit(1488022697.651:1744): item=0 name="/dev/sda" inode=376 dev=00:06 mode=060660 ouid=0 ogid=6 rdev=08:00 nametype=NORMAL
type=CWD msg=audit(1488022697.651:1744): cwd="/"
type=SYSCALL msg=audit(1488022697.651:1744): arch=c000003e syscall=2 success=yes exit=12 a0=f3fb90 a1=800 a2=7f4745221f64 a3=30 items=1 ppid=1 pid=18520 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="pool" exe="/usr/lib/udisks2/udisksd" key=(null)
相关部分是exe="/usr/lib/udisks2/udisksd"。虽然我也有过smartmontools
谁smartd
也是罪魁祸首。我卸载smartmontools
并停止了udisk2
服务service udisks2 stop
。之后 HDD 按照预期进入睡眠状态。
请注意,udisks2
当我打开时将自动启动磁盘应用程序,所以我不得不再次停止它。另一个缺点是,SMART 参数不会针对两个磁盘进行监控,这不是很好,但作为一种解决方法,它很合适。
还有一点不清楚的是,错误报告表示udisks2
不轮询磁盘,现在轮询由内核完成。但证据似乎表明情况恰恰相反。
答案3
由于您使用的是 Linux,因此您可以使用新的fatrace
实用程序,它会记录每个文件访问并告诉您哪个进程负责:
更多信息请点击这里:
http://www.piware.de/2012/02/fatrace-report-system-wide-file-access-events/
它利用Linux fanotify API(更多细节) 自 Linux 内核 2.6.37 起可用。
fatrace
自 2014 年 7 月起,并非所有发行版都打包了它(它最近进入了 Debian 测试,因此应该在“jessie”中发布),但很容易从源代码安装。
答案4
btrace
或者blktrace
(的包装器btrace
)跟踪内核块 I/O 并可以帮助您。