硬盘防震保护¶
作者:Elias Oltmanns <eo@nebensachen.de>
上次修改:2008-10-03
1. 简介¶
ATA/ATAPI-7 指定了带有卸载功能的 IDLE IMMEDIATE 命令。发出此命令应导致驱动器切换到空闲模式并卸载磁盘磁头。此功能在现代笔记本电脑中与加速度计和适当的软件结合使用,以实现防震保护功能。其思想是在预期到紧急情况时,停止内部硬盘上的所有 I/O 操作,并将磁头停在斜坡上。在 GNU/Linux 系统上提供此功能的愿望是最初在 Linux 内核中实现通用磁盘磁头停靠接口的动机。但请注意,您的系统上必须设置其他组件才能使磁盘防震保护工作 (有关更多信息,请参阅下面的第 3 节 “参考”)。
2. 接口¶
对于每个 ATA 设备,内核在 sysfs 中导出文件 block/*/device/unload_heads(此处假设挂载在 /sys 下)。如果设备不支持卸载功能,则对 /sys/block/*/device/unload_heads 的访问将被拒绝,并返回 -EOPNOTSUPP。否则,向此文件写入一个整数值会将相应驱动器的磁头从盘片上移开,并阻止指定毫秒数的所有 I/O 操作。当超时到期且在此期间没有发出进一步的磁盘磁头停靠请求时,将恢复正常操作。接受的最大超时值是 30000 毫秒。超过此限制将返回 -EOVERFLOW,但磁头仍将停靠,超时将设置为 30 秒。但是,您始终可以通过在先前超时的超时到期之前发出后续磁头停靠请求,将超时更改为 0 到 30000 之间的任何值。特别是,总超时可以超过 30 秒,更重要的是,您可以通过指定超时为 0 来取消先前设置的超时并立即恢复正常操作。低于 -2 的值将返回 -EINVAL(有关 -1 和 -2 的特殊含义,请参见下文)。如果最近的磁头停靠请求指定的超时尚未过期,则从 /sys/block/*/device/unload_heads 读取将报告剩余的毫秒数,直到恢复正常操作;否则,读取 unload_heads 属性将返回 0。
例如,执行以下操作,以停靠驱动器 /dev/sda 的磁头并停止所有 I/O 操作五秒钟
# echo 5000 > /sys/block/sda/device/unload_heads
一个简单的
# cat /sys/block/sda/device/unload_heads
将显示在恢复正常操作之前还剩多少毫秒。
一句警告:接口以毫秒为单位运行这一事实可能会引起实际上无法满足的期望。实际上,ATA 规范明确指出,完成卸载操作的时间取决于供应商。ATA-7 中关于这通常在 500 毫秒内的提示在 ATA-8 中显然已被删除。
此实现有一个技术细节可能会引起一些困惑,应该在此处讨论。当成功向设备发出磁头停靠请求后,将推迟连接到此设备的控制器端口上的所有 I/O 操作。也就是说,任何可能连接到同一端口的其他设备也会受到影响。唯一的例外是,将立即执行对该其他设备的后续磁头卸载请求。将推迟该端口上的进一步操作,直到端口上任一设备指定的超时到期。就 PATA(旧式 IDE)配置而言,任何单个端口上最多只能连接两个设备。在 SATA 世界中,我们有端口倍增器,这意味着用户向一个设备发出的磁头停靠请求实际上可能会导致停止对一整组设备的 I/O。但是,由于此功能应该在笔记本电脑上使用,并且在任何其他环境中似乎都不是很有用,因此每个端口大多只有一个设备。即使 CD/DVD 刻录机恰好与硬盘驱动器连接到同一个端口,它通常也应该可以从偶尔因对 HD 的磁头停靠请求而导致的缓冲区欠载中正常恢复。实际上,当您使用 ide 驱动程序而不是其 libata 对等驱动程序(即您的磁盘称为 /dev/hda 而不是 /dev/sda)时,停靠同一端口上的一个驱动器(驱动器 X)的磁头通常不会影响同一端口上另一个驱动器(驱动器 Y)的操作模式,如上所述。只有当需要端口重置才能从驱动器 Y 上的异常中恢复时,才会延迟该驱动器上的进一步 I/O 操作(以及重置本身),直到驱动器 X 不再处于停靠状态。
最后,有一些硬盘驱动器仅符合比 ATA-7 更早版本的 ATA 标准,但仍支持卸载功能。不幸的是,Linux 没有安全的方法可以检测这些设备,因此您将无法写入 unload_heads 属性。如果您知道您的设备确实支持卸载功能(例如,因为您的笔记本电脑或硬盘驱动器的供应商告诉您),那么您可以通过向 unload_heads 属性写入特殊值 -1 来告诉内核为该驱动器启用此功能的使用
# echo -1 > /sys/block/sda/device/unload_heads
将为 /dev/sda 启用该功能,而使用 -2 而不是 -1 将再次禁用它。
3. 参考¶
有几家不同供应商的笔记本电脑具有防震保护功能。由于制造商迄今为止拒绝支持所需软件组件的开源开发,因此 Linux 对防震保护的支持在不同的硬件实现之间差异很大。理想情况下,本节应包含指向旨在在不同系统上实现防震保护的不同项目的列表。不幸的是,我只知道一个项目,尽管该项目仍被认为是实验性的,但适合使用。请随意添加因我的无知而成为受害者的项目。
https://www.thinkwiki.org/wiki/HDAPS
有关 IBM/联想 Thinkpad 中实现的硬盘主动保护系统的 Linux 支持的信息,请参阅此页面。
4. 致谢¶
磁盘磁头停靠的实现灵感来自 Jon Escombe <lists@dresco.co.uk> 最初发布的补丁。我的开发适合合并到主线的此功能实现的努力得到了各种内核开发人员的帮助,尤其是 Tejun Heo 和 Bartlomiej Zolnierkiewicz。