12 March 2011

(Linux) AFT形式のWD20EARSをLinuxでフォーマットする

AFT(Advanced Format Technology)形式を採用しているWestern DigitalのハードディスクWD20EARSをLinuxで正しくフォーマットする方法

■ AFT概要

ディスクアクセスを従来の512bytes単位から4096bytes単位にすることで、従来ならエラー訂正(ECC)計算を512bytesを転送するごとに行っていたものを、4096bytesに1回で済むことになって、ディスク転送の効率が少しだけ高まるという思想に基づくフォーマット。

通常のOS(Windows 7やUbuntu Linux 10.04など)は512bytes単位でディスクアクセスするため、セクタ境界をAFTにあわせて4096bytesにしないと、転送効率が落ちるということで、フォーマットプログラムがAFTを認識しないWindows XPやUbuntu 10.04では手動設定でフォーマットする必要がある。。。

20110312-aft-fig.jpg
Fig 1が従来の512bytes単位のアクセス。Fig 2がAFTの4096bytes単位のアクセス。
緑色の部分のECC(エラー訂正データ)が、8分の1個に減っているのが新しい点。

というのが、Webからかき集めてきた知識。

About Western Digital Advanced Format Hard Drives (WD公式ページ)
LinuxでAFT仕様のHDDを使用する

■ 検証環境

・Windows 7にWDのWD Align - Acronis Windowsをインストールして検証
・Ubuntu 10.04 LTS

■ UbuntuのGPartedまたはfdiskで”標準的な設定”でフォーマット

ブランクのディスクに、”ディスクサイズ一杯”の新規パーティションを作成する。たとえば、fdiskの場合なら

# fdisk /dev/sdb 警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。 and change display units to sectors (command 'u'). コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 シリンダ (1-243201, 初期値 1): ← リターンキーのみを押す 初期値 1 を使います Last シリンダ, +シリンダ数 or +size{K,M,G} (1-243201, 初期値 243201): ← リターンキーのみを押す 初期値 243201 を使います コマンド (m でヘルプ): p ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x94285ea3 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 1 243201 1953512001 83 Linux コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): 7 領域のシステムタイプを 1 から 7 (HPFS/NTFS) に変更しました # fdisk -lu ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x94285ea3 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 63 3907024064 1953512001 7 HPFS/NTFS

標準的なオプション(特に、開始セクタなどを指定しない)の場合は、開始セクタが63となり、終了セクタ(+1)も8で割り切れない数値となっている。

( fdisk -u /dev/sdb とコマンドを入力して開始すれば、表示が最初から”セクタ単位”で表示される。)

この状態で、Windows 7のWD Alignで検証を行うと、AFTに準拠していないパーティションと表示される。

■ Ubuntuのfdiskで”fdisk -H 224 -S 56”でフォーマット

Google検索では、この解決方法が結構掲載されているが…

# fdisk -H 224 -S 56 /dev/sdb

この方法でフォーマットして、Windows 7のWD Alignで検証を行うと、やはりAFT非準拠と判定される。


■ Ubuntuのfdiskで”fdisk -H 128 -S 32”でフォーマット

# fdisk -u -H 128 -S 32 /dev/sdb 警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。. コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 セクタ (32-3907029167, 初期値 32): 2048 Last セクタ, +セクタ数 or +size{K,M,G} (2048-3907029167, 初期値 3907029167): ← リターンキーのみを押す 初期値 3907029167 を使います コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): 7 領域のシステムタイプを 1 から 7 (HPFS/NTFS) に変更しました コマンド (m でヘルプ): p ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト ヘッド 128, セクタ 32, シリンダ 953864, 合計 3907029168 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x0007470f デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 2048 3907029167 1953513560 7 HPFS/NTFS

開始セクタを2048にしたのは、Windows 7のフォーマットプログラムと値をあわせたため。本来なら、8で割り切れる数であれば、何でもよいはず。(ただし、MBRの位置である 0は除く)

この方法で領域確保後、Windows 7のWD Alignで検証を行うと、合格!

20110312-wdalign.jpg


■ Windows 7 管理ツールでフォーマットした場合

# fdisk -lu /dev/sdb ディスク /dev/sdb: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = セクタ数 of 1 * 512 = 512 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0xa16ecf40 デバイス ブート 始点 終点 ブロック Id システム /dev/sdb1 2048 3907026943 1953512448 7 HPFS/NTFS

■ ベンチマーク

Windows版のCrystal Diskmarkで調べてみました

・Windows 7のディスクの管理でフォーマットした場合

20110312-win7format.jpg


・Ubuntu 10.04LTS (Linux)のfdiskでフォーマットした場合

20110312-ubuntuformat.jpg


若干、Linuxでフォーマットしたものの方がアクセス速度が速いような感じだが、ハードディスクの個性だろうか。(同じ店で2台同時に購入したので、ロットは同じと思われる)
それとも、Linuxのmkfs.ntfsの方がフォーマット結果がよいのか… よくわからない。

AFT方式でLinuxのfdiskを用いてフォーマットできることはわかった。


■ ベンチマーク 番外編 (USB接続した場合)

・Windows 7のディスクの管理でフォーマットした場合

20110312-win7format-usb.jpg

・Ubuntu 10.04LTS (Linux)のfdiskでフォーマットした場合

20110312-ubuntuformat-usb.jpg