我是 NAS 的所有者,运行一些 Linux 发行版。它配备了一个网络管理前端,我可以在其中管理多项服务、用户权限以及何时应该进入睡眠状态。我的问题是,由于某种原因,当 NAS 进入睡眠状态时,硬盘驱动器会在几分钟后再次打开。然后它会旋转一段时间,然后再次休眠。这会无限期地持续下去。
我该如何尝试确定其原因?我对 Linux 很陌生,但我设法获得了 root 访问权限,现在有了 SSH 连接。
答案1
inotify 工具是执行此操作的一个简单方法。他们的网站上有几个示例可以完成您想要的操作(有关真正基本的示例,请参阅 inotifywatch 示例)。
答案2
尝试跑步iotop
也许?我过去发现它很有用。
答案3
您需要告诉内核通知您所有对磁盘的读/写操作,然后您需要查看该信息。
所以:
# sync
# echo 1 > /proc/sys/vm/block_dump
# dmesg -c | grep '/dev/sda'
sync
将所有待处理的写入刷新到磁盘,以便您只能看到新的读取或写入。
dmesg -c
显示内核消息并清除它们(否则每次运行 dmesg 时您也会看到旧的消息)。
grep
过滤 dmesg 的输出以了解您感兴趣的磁盘的活动。将 /dev/sda 替换为您的实际设备。
我通常使用这样的方法来降低磁盘转速,然后检查它何时再次旋转:
# sync
# hdparm -y /dev/sda
# while true; do hdparm -C /dev/sda ; sleep 600 ; done
该while
循环每 10 分钟检查一次磁盘活动/空闲状态。当你看到它启动时,运行dmesg
上面的行来查看侦探小说。
答案4
另一个提示:使用 Systemtap,systemtap 网站上有一堆探测脚本,足以找到罪魁祸首。
在另一种情况下,
如果您想找出哪个进程导致磁盘旋转,您可以通过设置标志来收集信息/proc/sys/vm/block_dump
。设置此标志后,Linux 会报告发生的所有磁盘读写操作,以及对文件进行的所有块脏操作。这使得调试磁盘需要旋转的原因并进一步延长电池寿命成为可能。 block_dump 的输出被写入内核输出,并且可以使用“dmesg”检索它,或者查看 syslog kern 工具以获取调试消息的目标。一般来说,应该是/var/log/debug
。当您使用 block_dump 并且您的内核日志记录级别还包括内核调试消息时,您可能需要关闭 klogd,否则将记录 block_dump 的输出,从而导致通常不存在的磁盘活动。