2011/03/09(Wed)起動ドライブをPATAからSATAに変更した時のINACCESSABLE_BOOT_DEVICE復旧方法

2011/03/09 2:38 Software::Windows
友人が新しいノートPCを買ったというので、今の環境をそっくりそのまま移行する手伝いをしたのだが、そうもすんなりいかない。
起動ドライブがPATAからSATAに切り替わったことが原因で、STOP 0x0000007B INACCESSABLE_BOOT_DEVICEというBSODが発生してしまった。それの復旧法をメモっておく。

構成

今回は、Let's note CF-W5からThinkPad X60への載せ替えをした時のメモ。
OSはWindows 7。

下準備

移行元のLet's noteで、Panasonicのユーティリティ系を削除しておく。
そしてAcronis True Imageをブートし、Cドライブ全体をtibイメージにUSB HDDに固める。ラクチン♪
しかし、それをする前に後述のレジストリ編集をしておけばよかった……。

書き戻し、そして問題発生

ThinkPadの方でも同様にTrue Imageをブートし、Cドライブに書き戻しをしたのだが、Windows 7のロゴが出た後あたりでBSOD 0x7Bが発生。
"Inaccessable boot device"ということで、直訳すると想定したデバイスにアクセスできないというわけだが、まあそれもそのはず。
これまではPATA 2.5"のHDDから起動していたのだが、今度はSATA 2.5"になったのだから。

私なら構成が変わった時は、クリーンインストール間違いなしなのだが、友人が「できればそうしたくない」というので……。

ちなみにWindows 7のインストールDVDを使って、スタートアップエントリの修正を行ったが、「自動修復できませんでした」というだけで直らず。しゅん。

復旧方法

"STOP 0x7B Windows 7"でググって最初に出てくる、「ブート ドライブの SATA モードを変更した後で Windows 7 または Windows Vista ベースのコンピューターを起動すると、エラー メッセージ "STOP 0x0000007B INACCESSABLE_BOOT_DEVICE" が表示されるというのがその解決法になる。
詳細に述べられているとおり、
Windows 7 または Windows Vista のインストール処理では、使用されていないストレージ ドライバーはすべて無効に設定されます。これにより、オペレーティング システムの起動処理が速くなるからです。ブート ドライブを、無効になっているドライバーに変更する場合は、ハードウェア構成を変更する前に新しいドライバーを有効にする必要があります。
(中略)
この問題が発生するのは、ブート ドライブだけです。変更するドライブがブート ドライブ以外の場合、この問題は発生しません。
とのことなので、Let's noteでPATAにインストールされたWindows 7はSATAのAHCI機能がオフになっていたのに、ThinkPadではSATAなので困った、というわけね。


しかし、既にブートすらしない段階ため簡単にレジストリが編集出来ず、編集してからもう一度書き戻すのも面倒なので一工夫。
本来、レジストリは起動しているシステム自身から弄ることしかできないのだが、ハイブとして読み込ませれば、システム自体が死んでいても値を書き換えることが可能。


まずはブートする環境がいるので、Windows 7のインストールDVDでブート。修復モードに入って、コマンドプロンプトを立ち上げる。
そして、書き換えたいレジストリを現在起動しているWindows PE上のレジストリエディタに読み込んで編集する。
下記のようにやれば、HKEY_LOCAL_MACHINE\tempsys以下に、HKEY_LOCAL_MACHINE\SYSTEMが読み込まれる。
(もしかしたら、CドライブがSystem reservedパーティションのこともあるので、その場合はDドライブなどに読み替えて。)
X:\Sources> cd /d C:\Windows\System32\config

C:\Windows\System32\config> reg load HKLM\tempsys system

この操作を正しく終了しました。

C:\Windows\System32\config> regedit
reg_hive.png


そして、HKLM\tempsys\以下の
  • ControlSet001\services\Msahci
  • ControlSet002\services\Msahci
  • ControlSet001\services\IastorV
  • ControlSet002\services\IastorV
にある、StartというDWORD値を3から0に変更すればよい。
起動時は001と002のどっちか分からないが、どちらかがCurrentControlSetとして読み込まれるはず。*1

ちなみに、Startの各値の意味は
0
OSローダー起動時に構成(デバイスドライバ向け)
1
コンポーネント起動時(IOInitSystem)に構成(デバイスドライバ向け)
2
システム起動後のサービスとして自動起動
3
手動起動(オンデマンド)
4
無効
となっている。(参考元:Services Start Code

終わったらレジストリエディタを終了してから、
C:\Windows\System32\config> reg unload HKLM\tempsys

この操作を正しく終了しました。
という感じ。
まあ一連の操作をレジストリエディタのGUI上からやっても良い。*2

*1 : 片方は前回起動した起動構成とかでバックアップになっている?まあ、どっちみちどの構成でもドライバを読んでもらわないと困るのでこれでいい。

*2 : その際は、ハイブ読み込み/アンロード時に、それぞれHKLM/HKLM\tempsys上を選択状態にしている必要がある。それ以外ではメニューがグレーアウトするので。

あとは

そのまま起動して待っていれば、勝手にデバイスドライバがインストールされる。
Windows 7になってかなりデバイスのインストールは楽になった…。

x60_devinstall.png


これは途中の状態だが、結果的に放っておけば(オンラインからの自動インストールもさせれば)全て認識した。

あとは、メーカ独自のユーティリティなどを足して終了。