アラインメントをとってプチフリ対策
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)
今回もっともはまったのがこのパラメータ。だって、MicrosoftのNTFSの解説には「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