増設した直後は起動し (未フォーマットの状態)、Windows が起動後「ディスクの管理」でドライブを初期化し、シンプルボリュームを追加した。

そのあと再起動したら起動しなくなった。具体的には起動時に「オプションの選択」画面となり「続行」が表示されない状態。起動させることができないので「トラブルシューティング」するしかない。

「トラブルシューティング」からいろいろやったがダメ

  • 「スタートアップ修復」→何も起こらない。ログのパスも表示されない
  • 増設したSSDを外してみる → はずしてもダメで、つけたりはずしたり全パターンやったがダメ
    • これが結構ひどくて、現状復帰というのが不可能に
  • 「コマンドプロンプト」でなんとかする
  1. まずオペミスで起動ファイルが消えてないから確認する。→ あった
  2. しかしドライブレターがおかしい
  3. なぜかわからないが、このコマンドプロンプト上だと起動ディスクのドライブレターがCではなくFになっている

ディスクが生きているし、回復画面は出るので、Windows Boot Manager までは起動して、Windows Boot Loader が起動できないということのようだ。結局、こうなると修復コンソールのコマンドラインから以下を行うとなおる。

まず修復対象のシステムパーティション(EFIボリューム)を見つける。

> diskpart
DISKPART> list volume
# 同じディスクのボリュームが近くに表示されるみたいなことはないので
# 勘で見つけるしかない

DISKPART> select volume 6
ボリューム 6 が選択されました。

DISKPART> assign letter B
DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> exit
> B:
> cd \EFI\Microsoft\Boot
# バックアップを一応とっておく
> copy BCD BDC.bak

> bcdboot  f:\windows /l ja-jp /s b:


bcdboot これは「ソース」を「f:\windows」として、ロケールを ja-jp とし、システムパーティション(ESP)として b: を指定している。

これでBCDというブートに必要なファイルが作りなおされる。

コマンドプロンプトからディスクにアクセスする方法

一度 diskpart を起動すると、それだけでドライブレターが割り当てられるみたい。割り当てられたら普通に cd や dir で見れる。もしかして間違えてフォーマットしていないか? ということの確認はできる。

ref.

原因は? ドライブレターが問題?

結構調べたがよくわからなかった。前述した F: というドライブレターは回復コンソール上のコマンドプロンプトの話なので、Windows起動前であり、ここで違っていても、そこまでおかしくない。Windows起動後はレジストリエントリからドライブレターを解決するが、この段階だとまだレジストリは読まれていないはずだからだ。

まず BCD ってなんだ

BCD (Boot Configuration Data) は Windows Boot Manager で使われる設定ファイルであり、実体としては小さいレジストリファイル形式のデータベースである。

起動状態の Windows の BCD は bcdedit コマンドで見ることができる (管理者権限が必要)。ただし raw な情報を出力する方法はなく、「親切な」情報しか表示されない。なのでトラブルシューティングにはとても使いにくい。

BCD を bcdedit で見ると、device というパラメータには partition=c: とか書かれている。が、実際は partition=c: という内容が BCD に記録されているわけではない…… 現在実行中の環境のドライブレターなどを参照してそれっぽく表示している。レターの割当をなくしたりすると partition=\Device\HarddiskVolume1 みたいな形式になったりする。

BCD は Windows Registory 形式 (バイナリ) なので、Linux 向けのツールとかで、なんやかんやして読める状態のテキストファイルである .reg 形式になおすと、以下のようになっている。

11000001 というのが device にあたるエントリ。内容は、たぶんディスクの GUID やパーティションのGUIDが書かれている。

[\Objects\{6f0fb257-f0af-11ee-a710-b12de9d2818d}\Elements\11000001]
"Element"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,06,00,00,00,00,\
  00,00,00,48,00,00,00,00,00,00,00,67,5e,ec,72,84,4c,7f,4d,a5,74,08,9e,22,5c,\
  38,fc,00,00,00,00,00,00,00,00,6e,22,e2,de,e4,ec,50,40,bb,b7,79,4a,a3,72,c7,\
  8d,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00

疑問: GUID で指定されているなら、増設したぐらいでおかしくならなくない?

そうなんだよな~ 結局なんでなのかはわからなかった。BCD の差分とか眺めてみたけどわからない。

起動しなくなるのは割とショックがでかいので勘弁してほしい。

  1. トップ
  2. tech
  3. ディスクを増設したらWindowsが起動不能に

Windows は EFI が入っているパーティションのことを ESP: EFI System Pertition と呼んでいるようだ。diskpart で list volume したときに「システム」と書かれているボリュームが起動中のシステムの ESP になる。通常、ESP は FAT32 フォーマットになっており、トップレベルに EFI というディレクトリがある。通常は自動的にドライブレターがつくことはなく、非表示のボリュームとなっている。

変なディスクがシステムパーティションになっているときの変更方法

先日、Windows が起動しなくなったときになんやかんやしていたら、以下にように D: ドライブがシステムパーティションになってしまった。NTFS でも ESP になれるんか、という発見もありつつ、気持ちが悪いので是正したいと思った。別にそのままでも問題はないが……

以下の手順でやるのが比較的安全だと思われる。

  1. 本来のEFIパーティションに対し bcdboot で EFI ファイルを作る
  2. マザーボードのUEFI画面(BIOS画面)に入り、ブート対象に表示されている Windows Boot Manager を、インストールしたものに切り替える
  3. 起動したら diskpart で list volume して、意図したボリュームが「システム」になっているか確認する
  4. 古いほうのEFIを消す

本来のEFIパーティションに対し bcdboot で EFI ファイルを作る

bcdboot についての公式ドキュメント: https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/bcdboot

まず、本来の EFI パーティションをマウントしなければならない。diskpart でドライブレターを割当る。

> diskpart
DISKPART> list volume
# 同じディスクのボリュームが近くに表示されるみたいなことはないので
# 勘で見つけるしかない

DISKPART> select volume 6
ボリューム 6 が選択されました。

DISKPART> assign letter B
DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> exit
> B:

そして、割当たドライブレターを /s オプションの引数として渡して bcdboot を実行する。以下のようにする

bcdboot  c:\windows /l ja-jp /s b:

これで b: に割当てたパーティションはESPとして現在のシステムを起動するようになったはず。

マザーボードのUEFI(BIOS)画面で起動順を変更する

マザーボードの設定に入り、起動ディスクを変更する。新たに ESP を作っているので、少なくとも2つの Windows Boot Manager と名前がついたものを起動対象として選べるはず。なので、新しく作ったほうの Windows Boot Manager を選ぶ。

そして起動させてみる。

一応、ブートの挙動を書いておくと

  1. マザーボードのファームウェア(UEFI/BIOS)がディスクをスキャンしてEFIアプリケーションを探す
    • これがマザーボードの設定の起動ディスクに表示される
  2. マザーボードは選択されたEFIアプリケーションを起動する。Windows では Windows Boot Manager
  3. Windows Boot Manager は BCDストアを読み、起動すべきシステムを選択する。 (通常起動や、休止からの起動、メモリテストなど)。ここでは通常起動 (Windows Boot Loader )
  4. Windows Boot Loader は Windows OS 本体をブートさせる

起動して確認する。

diskpart で list volume して、意図したボリュームが「システム」になっているか確認する。

この状態で古いほうの ESP は不要になったので、とりあえずリネームとかして置いておけば良い。

  1. トップ
  2. tech
  3. 変なディスクがシステムパーティション(ESP: EFI System Pertition)になっているときの変更方法