[ Main Page ]

WindowsXP (2003) HDD to SSD migration tips

Windows Vista以降はBCD等に変更が入ったため、以下の方法は原則適用できません。

3rd party softwareを使う場合

Acronis True Imageがおすすめです。Windows Vista以降でも使えるようです。SSD alignmentもできます。 Western Digital製のHDDを持っている場合は、 OEMバージョンを使用できます。 このツールでSSD alignmentを適用するには、まずMBRのみを移行してからWindowsパーティションを移動するとよいようです。

NTFSを移動する

起動することを考えなければ、ディスクのどのセクタからパーティションが始まっていようが、「データパーティション」としては使えます。 従って、ddでコピーするだけで移動はできます。ただし、パーティションブートセクタにはディスク上のMFTの絶対値等が「直値」で 書き込まれているので、パーティションの開始位置が変わった場合、起動はできなくなります。また、CHKDSKを通すと一部の情報が矛盾 してるので直されることがあります。ddを使うときは、bs=1M等にして、SSDのブロックサイズ以上にしないと、 パフォーマンスが出ませんし、場合によっては寿命に影響することもあります。

fdiskでSSDに適応したalignmentにする

AFTと同様、4k以上のalignmentに合わせないと、パフォーマンスが出ません。

基本的には、パーティションを確保する場合、開始位置は、Windows2003まで63セクタ目、Windows Vista以降で2048セクタ目 (1Mbyte)になっていますが、どのOSでも(WindowsNTであっても)プライマリパーティションは基本的にどこからはじまっても大丈夫です。 特に63の縛りがあるわけではありません。CHSからLBAになった時点で、基本、その制約はなくなりました。 なお、BIOS等での容量制限は別問題です。一番楽なのは、Linux等のfdiskで確保する方法でしょうか。 旧バージョンの場合、BIOSで取得できるCHSと異なる値が使われてしまうことがあるので、一度、GRUB等を起動し、geometryでBIOSでの CHSを確認し、fdiskにオプションとしてHやSを指定したほうがよいでしょう。特に、Thinkpadでは、head 240 sector 63、 Dellではhead 255 sector 63に決め打ちされてしまうようなので、パーティション確保前に必ずチェックしたほうが良いでしょう。 MBRのパーティションテーブルのCHS情報がBIOSと矛盾していると、起動できないことがあるようです。また、パーティションのboot flagは 忘れずに立てておきましょう。Typeは0x7 NTFS/HPFSです。

dd等で移動したWindows XP / 2003 パーティションを起動可能にする

ddだと、データディスクとしての移動は完了ですが、上記の通り、PBRが異常になるので、修復する必要があります。 この段階で、フロッピー等で起動してTestDiskを使ってWindowsで直すこともできます。フロッピーをWindows XPで通常フォーマットし、 NTLDR、boot.ini、ntdetect.com等をコピーする方法で作れる起動ディスクでパーティションから起動します。 修復は、本当は、Windows インストールディスクの修復からfixbootを使うと直るはずですが、ディスクが変わったりすると 修復できなくなることがあります。 その場合、TestDiskを使って直せます。 他にも方法があるようですが、面倒なので割愛します。 [Intel][Advanced](Partition選択)[Rebuild BS]で、MFTの位置を解析し、[Write]すると修復できます。 心配なら、同じTestDiskでMBRも書き込んでもいいでしょう。 NT signatureも初期化してもいいと思いますが、どうしても起動しないときに試してもいいかもしれません。

WindowsでNTFSフォーマットすると、NTLDRをロードするPBRを書き込んでくれるので、最悪上記で確保したNTFS パーティションを Windowsでフォーマットし、ファイルコピーするだけで起動するようにはなるはずです。あるいは、別のハードディスクに 同じパーティションテーブルで作成し、フォーマットし、PBRだけ(512)バイト分、パーティションの一番最初と 一番最後(バックアップ)だけddすることでもリカバリできます。

あと、SSD特有の設定をしておきましょう。(Windows XP)

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]
"EnablePrefetcher"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction]
"Enable"="N"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsCurrentVersion\OptimalLayout]
"EnableAutoLayout"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"NtfsDisableLastAccessUpdate"=dword:00000001
    

どうしてもSSDをデフラグする必要がある時

SSDではデフラグは原則必要ありませんが、どうしてもという場合は、ディスクイメージごとハードディスクに一旦コピーし、オフラインで デフラグしてから書き戻すと、SSDの寿命は比較的保たれますし、早く済みます。

その他の情報

NTFS Boot Sector BIOS parameterの詳細な説明。

Partition alignment importance under Windows XP

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

手動でPBRを書き換える方法が載っている。以下抜粋。

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

$ sudo dd if=/dev/sda1 of=10GB.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=10GB.img of=/dev/sda1 bs=10M
      

(4) Partition Boot Sector(Partition Boot Record)を書き換え(結構はまった)

ディスクの先頭に特別なセクタ=MBRがあるように、Windowsパーティションの先頭にはPartition Boot Sectorがあります。 勝手にパーティションを移した場合、ここのいくつかの値を書き換えて整合をとる必要があります。バイナリエディタでごりごりと修正。 参考

$ dd if=10GB.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解説
参考:PBRの命令レベルで解説

(4-3) 更新
  $ dd if=pbs.dat of=/dev/sda1 bs=512 count=1
      
Civilization is the limitless multiplication of unnecessary necessities.
		-- Mark Twain

 <rindolf>  mortal5: you need to print the header.
 <rindolf>  mortal5: print header()
 <mortal5>  rindolf, ...I absolutely love it when my textbook leads me
            wrong..
 <rindolf>  mortal5: what is your textbook?
 <mortal5>  "web wizards guide to perl and cgi"
 <mortal5>  lol
 <mortal5>  only the finest for the students at my university
     <buu>  Hahaha
     <buu>  That's awesome.
  <cfedde>  Is this what we're teacing these days? Oh my.
  <somian>  Blows the mind, doesn't it cfedde!
  <cfedde>  somian: it does.
  <cfedde>  I suppose that I'm commenting out of context. but why the mix
            and match.
    <f3ew>  What mind?
  <cfedde>  yours, with this .48
         *  somian sends in CSI las vegas to clean up
 <rindolf>  mortal5: what is your university?
 <mortal5>  rindolf, I'm too ashamed to tell :p
 <rindolf>  mortal5: heh.
 <rindolf>  mortal5: is it bad?
 <mortal5>  rindolf, no not really, we have a fairly well known cs dept
  <somian>  Just so long as it isn't SUNY@BUFFALO
 <mortal5>  it's just the teacher i'm using, she's a total flake

    -- Misleading Textbooks about Perl
    -- #perl, Freenode


Powered by UNIX fortune(6)
[ Main Page ]