アラインメントをとってプチフリ対策

CF-R3 + SSD + Windows7 はそれなりに使えるのだが、やはりメモリ768MBはさすがに厳しい感じもあるので、XPに戻すことにする。
XPのプチフリ対策で、前回未実施だったのがアラインメントの対応。
結論からいうと、アラインメントはそろって、プチフリも結構軽減され、、たのかな。そこまで変わってないかもしれんが、スパシーボ効果ってことで。

前置き

 アラインメントとるってことは、一般に、規定の境界にそろえてあげることです。例えば主記憶(メモリ)に4byteのデータを置く場合、4の倍数のアドレスに置くきます。そろってなくてもアクセスできないことはないけど、読み出しに必要な命令が2回になって遅くなったりします。
HDDの場合には、64KBで最適パフォーマンスが出やすいらしく、SQL Severで性能を稼ぐときには気にするみたい。SSDの場合にもそれがあるようで、どうも4KBなどが境界のようです。
参考:http://www.tomshardware.com/news/ssd-hdd-sata,6719.html

どうしたいか

 普通にインストールすると最初のパーティションは63セクタから始まります。これが非常にバッド。これを64セクタに変更します。

そもそも

なんで63セクタなんかになっているのか?どう考えても半端すよね。

初期のハードディスクはCHS (Cylinder Head Sector) という物理構造に基づいたアドレッシングをしてました。最小単位である1セクタは512byteでこれは現在でも一緒。ディスク1周(トラック)は1-63(6bit)で最大63セクタです。パーティションを分けるツールはCHSの区切りのよいところに置こうとするため、通常最初のパーティションをC/H/S=0/1/1。2つ目以降はn/0/1。(※セクタは1始まり)

このCHSのアドレッシングはHDDをMBで数えていた頃の遺産で、現在のHDDはこんな単純な物理構造してませんし(トラック辺りのセクタ数は内側と外側で違う)、SDDにいたってはシリンダも何もありません。決定的にはアドレス用のbit数が足りないため、LBAと呼ばれるアドレッシングに変わっており、通し番号(こっちはどうやら0始まり)でセクタを数えます。

で、現状は(ディスクのコントローラから来る?)制約で4KB境界でそろえるのが良いようです。すると、デフォルトのスタート位置であるCHS:0/1/1はLBA:63であり、1セクタ512Bなので、32KBの最後のセクタです。64KBのど真ん中と言うことになります。いけてない。

1トラックが64セクタだったなら、問題なかったのに。結局、なんで1スタートになっちゃったのかよく分からず。

手順

 普通の手順は下記(もしくはその最初でリンクされているページ)が詳しいです。
参考:http://www.ocztechnologyforum.com/forum/showthread.php?t=48309

ここでは、パーティションツールを使わずに、Linuxの手頃な道具でアラインメントをとってみます。

(1) パーティション1 の内容をダンプ

$ sudo dd if=/dev/sda1 of=XP10GB.img bs=512 count=20971520

※ntfscloneなんかを使うと、もっと安全かつ効率的にダンプできるらしい

(2) パーティションを変更
(2-1) sfdiskでパーティション情報を出力
※最初のパーティションWindows XP

$ sudo sfdisk -d /dev/sda > diskconfig.txt
$ cat diskconfig.txt
# /dev/sda のパーティションテーブル
unit: sectors

/dev/sda1 : start=       63, size= 60002712, Id= 7, bootable
/dev/sda2 : start= 60002775, size=  1558305, Id=82
/dev/sda3 : start= 61561080, size= 57319920, Id=83
/dev/sda4 : start=118881000, size=  6313545, Id= c

(2-2) エディタで書き換え

$ cp diskconfig.txt newconfig.txt
$ nano newconfig.txt
$ cat newconfig.txt
# /dev/sda のパーティションテーブル
unit: sectors

/dev/sda1 : start=       64, size= 60002711, Id= 7, bootable
/dev/sda2 : start= 60002775, size=  1558305, Id=82
/dev/sda3 : start= 61561080, size= 57319920, Id=83
/dev/sda4 : start=118881000, size=  6313545, Id= c

(2-3) パーティション変更

$ sudo sfdisk --no-reread -N1 /dev/sda < newconfig.txt
$ sudo reboot

(3) データ書き戻し

$ sudo dd if=XP10GB.img of=/dev/sda1 bs=10M

(4) Partition Boot Sector(Partition Boot Record)を書き換え(結構はまった)
ディスクの先頭に特別なセクタ=MBRがあるように、Windowsパーティションの先頭にはPartition Boot Sectorがあります。勝手にパーティションを移した場合、ここのいくつかの値を書き換えて整合をとる必要があります。バイナリエディタでごりごりと修正。
参考:http://lets-go.hp.infoseek.co.jp/discpara.html

$ dd if=XP10GB.img of=pbs.dat bs=512 count=1
$ bvi pbs.dat

(4-1) Total Sectorsの修正
 パーティションを短くしたので、ここもあわせて修正。
offset: 0x28, size: 8byte
現状値 : 97 91 93 03 00 00 00 00 (= 60002711)
変更値 : 96 91 93 03 00 00 00 00 (= 60002710)

(4-2) Hidden Sectorsの修正
 先頭からのオフセット。
offset: 0x1C, size: 4byte
現状値 : 3F 00 00 00 (= 63)
変更値 : 40 00 00 00 (= 64)

 今回もっともはまったのがこのパラメータ。だって、MicrosoftNTFSの解説には「Not used or checked by NTFS.」って書いてあったのに! 放っておいたらブートしなかった。。。

参考?:MSのNTFS解説:http://technet.microsoft.com/en-us/library/cc781134.aspx#w2k3tr_ntfs_how_dhao
参考:PBRの命令レベルで解説:http://bootmaster.filerecovery.biz/appnote3.html

(4-3) 更新

 $ dd if=pbs.dat of=/dev/sda1 bs=512 count=1

感想

今回、元サイトを見直したら、「64セクタ(32KB)よりも、128セクタ(64KB)にあわせておいた方がいいらしいので、手順も直しておいた」的な書き込みが。
しょうがねーなと、上記のオフセットを64->128にしたら、、、起動しないよ!
ブート途中で、NTFSの整合性チェックらしきもので引っかかって、ブルースクリーン。むぅ。64でもそれなりに快適になった気もするが、、さて。(つーか、IO出し続けるアプリがあると、普通にプチフリする。Chromeとかね。)