WD WD20EARSの正しい扱い方

先日増設したWesternDigitalのハードディスクWD20EARS-00MVWB0ですが、何も知らずに使うとパフォーマンスを発揮してくれません。 導入の際に正しい知識を持っておかないと、後悔します。 まさにキワモノです。

ただ、この知識は導入の際に一度だけ使うだけなので、実運用では忘れてもかまいません。

データを入れる前にこのことを知ったのが幸いです。id:akihirom さん、どうもありがとうございます。

正しいfdiskのやりかた

このハードディスクは、Advanced Format Technologyという技術が使われています。 ハードディスクのセクタは通常512バイトですが、AFTでは4096バイトになっています。 そのため、パーティションを切る際にヘッド数とセクタ数を調整しておく必要があります。

http://calves.jugem.jp/?eid=1009 によると、fdiskは「fdisk -H 224 -S 56 /dev/sda」とする必要があります。 そして、開始シリンダを56にしておきます。

【警告!】fdiskを実行すると、ハードディスク内のデータが消し飛びます!


$ sudo fdisk -H 224 -S 56 /dev/sda

The number of cylinders for this disk is set to 311465.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sda: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders
Units = cylinders of 12544 * 512 = 6422528 bytes
Disk identifier: 0x319c4ba8

Device Boot Start End Blocks Id System

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-311465, default 1): 56
Last cylinder or +size or +sizeM or +sizeK (56-311465, default 311465):
Using default value 311465

Command (m for help): p

Disk /dev/sda: 2000.3 GB, 2000398934016 bytes
224 heads, 56 sectors/track, 311465 cylinders
Units = cylinders of 12544 * 512 = 6422528 bytes
Disk identifier: 0x319c4ba8

Device Boot Start End Blocks Id System
/dev/sda1 56 311465 1953163520 83 Linux

Command (m for help): x

Expert command (m for help): p

Disk /dev/sda: 224 heads, 56 sectors, 311465 cylinders

Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 0 1 55 223 56 1023 689920 3906327040 83
2 00 0 0 0 0 0 0 0 0 00
3 00 0 0 0 0 0 0 0 0 00
4 00 0 0 0 0 0 0 0 0 00

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

普通にfdiskをかける場合とのパフォーマンス差は顕著です。 「mkfs.ext4 /dev/sda」でフォーマットするとき、上記の方法ならば7分かかります。 対して、普通のfdiskでは10分以上かかります。


$ time sudo mkfs.ext4 -m0 /dev/sda1 [~]
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
122077184 inodes, 488290880 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
14902 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
sudo mkfs.ext4 -m0 /dev/sda1 3.44s user 63.73s system 15% cpu 7:01.07 total

強引にIntelliParkを無効にする

そして、もうひとつの大きな問題がWD独自のIntelliParkという技術です。 これは、8秒間ハードディスクにアクセスがないとヘッドを退避させる省電力技術です。 こうすることで電気代を浮かせることができるらしいです。

省電力は寿命を縮める

これだけ聞くとよさげに思えますが、パフォーマンス上に大きな問題をかかえます。 退避されたヘッドを元の位置に戻すまでに当然のことながらかなり時間がかかります。 実際に、リアルタイムな応答が要求されるゲームで、数秒間止まるプチフリーズが発生している という例もあります。

IntelliParkについては新しい技術ゆえ未検証ですが、一般に、ハードディスク省電力機能はハードディスクの寿命を縮めます。 ハードディスクはつねに回転している状態が理想です。 とくに頻繁な電源on/offに弱いです。 そのため、PCはつけっぱなしで省電力機能を無効にすることで、大幅に長もちします。 省電力でわずかばかりの電気代が浮いたところで、すぐに故障してしまっては意味がありません。 ハードディスクが壊れると、ハードディスク本体のコストに加え、データ復元の時間的コストがかかり、最後のバックアップから現在の状態の差分が失われてしまいます。 PCつけっぱなしによる電気代増はこれらのコストを肩代りしている保険料と考えています。

実際に、3GBのハードディスクが11年持ちました。 当時はPCケースが小さくて通気性が悪い状態だったため、放熱がしっかりしていればもう少し長もちしたと思います。 それくらい長もちすれば、壊れる前に退役させることもできます。

IntelliParkを強引に無効にする

そう考えると、IntelliParkはまさに「余計なお世話」に他なりません。 しかも悪いことにIntelliParkを無効にするジャンパスイッチは存在しません。 WDが配布していた(過去形)wdidle3というMS-DOSアプリケーションを使えば無効にしたり、IntelliPark発動の時間を長くすることができるらしいです。 しかし、もともと自己責任な上、WDが配布停止していることを考えると危ない香りがします。 おまけにMS-DOSアプリケーションなので、マザーボードSerialATA対応でないといけません。 僕みたいに古いPCにSerialATAボードをつけている人では動かすことができません。

一見、どうすることもできないようですが、解決策はあります。 5秒おきに強制的にディスクアクセスさせるのです。 以下のシェルスクリプト disable-intellipark.sh では現在時刻を5秒ごとに書き込みます。 ハードディスクは /2t にマウントされていることが前提なので、マウント位置が異なる場合は適宜書き換えてください。


#!/bin/sh
while true;do
date > /2t/disable-intellipark
sleep 5
done

~/.xinitrcに以下の行を追加し、X起動時に自動で起動しておくようにしておきました。


disable-intellipark.sh &

Linuxの場合、ディスクアクセスを遅延するのでこのスクリプトで正しく5秒ごとに本当にディスクに書き込まれているかはよくわかりません。 しかし、こちらの環境ではIntelliParkが発動していません。

補足:IntelliPark発動回数を数える

ところで、どうやってIntelliParkの回数を数えるかというと、SMART機能を使います。 smartmontoolsを導入し、smartctlコマンドを実行します。 「smartctl -a /dev/sda」を実行すると、長々と出力されますが、ヘッダの退避回数はLoad_Cycle_Countの一番右の値です。


$ sudo smartctl -a /dev/sda | grep Load_Cycle_Count
193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 346

disable-intellipark.sh 設置前のわずか2日で346回もヘッダが退避しているのは明らか異常です。 1時間あたり10回近くも発動している計算です。 しかし、disable-intellipark.sh を設置してから17時間、この値はまったく変化していません。

参考資料