修复Mac OS X Load_Cycle_Count激增问题

知道机械硬盘的SMART参数Load_Cycle_Count还是08年的事儿,当时笔记本上用的是Ubuntu 8.04 LTS,某日在Twitter还是LinuxSir论坛惊闻江湖传言Ubuntu存在损坏笔记本硬盘的严重问题,当即花了些时间研究了一番:关于Ubuntu损坏笔记本硬盘的问题

事实上这是一个Linux ACPI(acpi-support)的bug:High frequency of load/unload cycles on some hard disks may shorten lifetime,存在于大多数Linux发行版本中。其实除了Linux之外,这个问题同样存在于Mac OS X和Windows中。不同之处在于:

  • Linux下可以通过hdparm命令行工具手动修改硬盘ATA参数来避免问题,所谓的Ugly Fix就是用hdparm写的acpi脚本。Ubuntu官方终于在Bug创建两年后的2009年1月修复了这个问题,并通过官方源把fix push到最终用户端:Ubuntu修复Load/Unload Cycle过于频繁的bug
  • Windows里除了设置高级电源管理(参考这个回复),只能望洋兴叹了,也懒得去研究。
  • Mac OS X中存在这个问题,早已被发现(Energy Saver中即使Put the hard disk(s) to sleep when possible也无济于事),但Apple从未做过任何回应,也没有任何迹象表明这个问题将会被修复。
    我觉得苹果是这么认为的:只要是普通用户看不到的问题,就睁一只眼闭一只眼,除非事情闹大再花人力物力去解决。ZFS最终没能作为系统默认的文件系统,和这种态度也不无关系。其实修复Load_Cycle_Count问题,举手之劳而已,实在无法理解苹果对待此问题的态度。

症状:即使在Energy Saver中去掉Put the Hard disk(s) to sleep when possible选项,使用电源或者电池时,Load_Cycle_Count还是在以惊人的速度增加。可以下载smartctl这个工具查看SMART属性(具体方法参考:关于Ubuntu损坏笔记本硬盘的问题),通过ports装smartmontools应该也可以做到。

解决方法:考虑到Mac OS X是UNIX BSD分支,应该有办法通过直接设置硬盘的ATA参数来解决问题。首先想到的是通过MacPorts,Homerew等安装smartmontools和hdparm。搜索后发现有个叫Bryce McKinlay的新西兰哥们儿用C写了一个类似于Linux hdparm的命令行工具hdapm,直接提供了源代码和编译好的二进制;-)

简介:
hdapm
一个Mac OS X下用来设置ATA硬盘电源管理(APM)级别的命令行工具

可以被用来:

  • eliminate “clicking when idle“ noises exhibited by some laptop hard drives
  • make a drive save more power and spin down more aggressively that in does with the default OS settings.

兼容性:Mac OS X 10.4 - 10.6. ATA/SATA hard disk with APM support. **Does not work with USB or Firewire attached drives. **

hdapm工作的原理是发送”APM Level” ATAPI命令到硬盘,所以前提是你的硬盘必须支持该命令。 对底层I/O感兴趣的可以下载C源代码看看是如何实现的,还是很容易看懂的;-)

下载hdapm

安装:将hdapm复制到/usr/local/bin下,该路径默认被加入到$PATH(另外一个原因是hdapm.plist里hard code了路径和参数),在Terminal下可以直接调用。

命令使用方法
用Disk Utility.app GUI或者diskutil list命令找出硬盘的Disk Identifier

terry:~ terry$ diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *320.1 GB disk0 1: EFI 209.7 MB disk0s1 2: Apple_HFS Mac 80.0 GB disk0s2 3: Apple_HFS Data 239.6 GB disk0s3 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: Apple_partition_scheme *9.6 MB disk1 1: Apple_partition_map 32.3 KB disk1s1 2: Apple_HFS hdapm 9.6 MB disk1s2

我的Macbook是Seagate 7200.4 320G,很容易识别,id是disk0。

Example:
hdapm to fix Load_Cycle_Count problem on Mac OS X

在我的Macbook上命令是:
hdapm disk0 max

执行该命令后,硬盘会以最佳I/O性能模式运行,Load_Cycle_Count在关机之前不会再增加;-)
注意:睡眠,唤醒一次后LCC会增加1,这个都能理解吧?

这相当于Linux下的:
hdparm -B 254 /dev/sda

系统启动时自动运行:将hdapm.plist复制到**/Library/LaunchDeamons**目录下,若hdapm不在/usr/local/bin下,请按需修改hdapm.plist文件(Disk Identifier,Level)。这样的话,系统启动时会默认就会按需启动hdapm,我平时多数时候用电源,所以用max;-)

诸位用SSD的兄弟就不用看此文了,你们需要担心的是SSD的读写次数限制/寿命问题,以及等待一个更好的文件系统出现;-)