こんばんは くろねこです。
先日、想定外の事態に巻き込まれてしまいました。
ずっと動いているものを止める
めったに動かさないものを動かす
こんなときに起こるのです。
今回はそんなお話です。
全館停電
我が家で実施した電気工事の関係で、ブレーカーを落としました。工事そのものは問題なく終了し、通電のため、ブレーカーを上げます。
今回の工事は分電盤まわりであったため、各ブレーカーの先の通電状態を確認します。
問題が無いことを確認し、次は常時動作している我が家のネットワークやサーバの状態の確認です。
ドメインコントローラを起動、インターネットの接続も問題ないので、一応、確認終了ですが、何か嫌な予感を感じたくろねこでした。
ビンゴ!
この日、ある方の依頼で作業中だったノートPCは内蔵(一部、PDバッテリ)3台を除き、それ以外の固定設置されているサーバの確認で順番に電源入れて行きます。
ビンゴ!
やはりありました。
(こういうときの動物的感覚はものすごいんです、ハイ・・・)
Hyper-Vサーバが下記のメッセージを表示して、ブートしないことがわかりました。
このメッセージ、そのまま、
ブートできるデバイスが見つかりませんということです。
一般的に、HDDが壊れたときに目にするメッセージです。
マジっすか!?
しかも、よりによって、仮想環境ホストかよぉ・・・
1台の物理サーバですが、仮想サーバが複数動作するサーバなので、ホスト+すべての仮想サーバ 分が一斉に動作しなくなったことを意味します(泣)
Hyper-Vって何なのさ?
このマシンは、Windows Server 2012 R2 Standard + Hyper-V が動作するマシンで、ディスクはHDDです。(SSD換装はしていない)
Hyper-Vとは、仮想環境を提供するための Windows Server のひとつのサービスです。
この仮想環境は、くろねこがいろいろなものを開発する際に使用するもので、
・ データベースサーバ(Microsoft SQL Serverなど)
・ Webサーバ(Microsoft IISや、Apacheなど)
・ 開発系ツール(Microsoft Visual Studioなど)
・ Windows 展開サービス などのツール系
・ その他、実験的な環境
の仮想サーバが複数構築されています。
仮想環境を、もっと、簡単に言えば
Windowsか動作する一台のサーバのうえで、複数のWindowsやLinuxを同時に動作させる技術で、20年くらい前に登場した技術です。
現在、クラウド環境はこの仮想環境で実現しています。
問題のサーバは
はなしを戻します。
今回、ブートしなくなったハードウェアは、個人宅なのでサーバ専用機ではなく、通常のデスクトップPCに大容量のHDD(4TB)とメモリ(32GB)を搭載したものです。
このような状態のHyper-Vなので、常に動作しているのではなく、必要に応じて起動するサーバです。(以下、Hyper-Vサーバ と記載します。)
このサーバ、最後に起動したのが、いつのことか?
記憶に残っていないので、相当前になります。
「逝ってしまった!?」
そう考えてもおかしくありません。
でも
ちょっと待てよ!
大きな耳を澄ませて、電源ボタンを押します。
キューン、キュルキュル・・・
どうやら、HDDは回っています。
物理的に壊れた訳では無さそうです。
ディスクの状態は?
HDDの回転音が聞こえるので、「完全な死」 ではありません。
というので、Windows PE(※) でディスクの状態を確認します。
Windows ServerがインストールされたCドライブの内容は壊れていないように見えます。
となると、
Windowsがインストールされたドライブの情報が見つけられないだけの状態である可能性が高いのではと判断しました。
要するに、BCDファイルが破損しているということです。
その他な可能性は
ここまでの確認で、ディスクの構成情報(パーティションやボリューム)は、diskpartコマンドで見えているので、構成情報の破損は無いと考えて良いと思います。
BCDファイルとは、OSをロードして起動するための情報を格納したファイルです。
このファイルが壊れていれば、Windowsがどこにあるのかが分からす、
No Boot Device Found となるのは当然ですね。
<※ Windows PE とは> Wikipediaより引用
Microsoft Windows プレインストール環境 (Windows Preinstallation Environment, Windows PE, WinPE) は、大手企業などが多数のワークステーションやサーバへWindowsをインストールするための、軽量版Windowsである。またPCメーカーが製造過程で自社製PCにOEM版Windowsをプレインストールするためにも利用される。軽量であるがゆえハードディスクドライブのみならずコンパクトディスクやUSBメモリからもブートでき、フロッピーディスクからブートできたMS-DOSに代わるOSの選択肢の1つとして利用可能である。
BCDファイルの復旧
BCDファイルの復旧は、bootrecコマンドやbcdbootコマンドで行います。
この復旧方法は以前より情報として「かじった程度」に認識していましたが、実際に復旧した経験はありませんでした。
今回、きっと蘇生(復旧)できると信じて、経験云々は言わずやるしかないてすね。
試しにコマンドヘルプを見ようとコマンドを叩いてみましたが、残念ながら、これらのコマンドは、Windows PE には実装されていないため、対象サーバと同じバージョンのインストールメディアを用意する必要があります。
ということで、Windows Server 2012R2 のインストールDVDで起動します。
ウィザードの途中で、「システムの修復」から「コマンドプロンプト」を起動します。
「BCDファイル 復旧」で検索すると山のように結果が出てきます。その中から(信用できそうな)記事を複数ざっくり読んだところ、下記の手順で復旧を試みまるのが良さそうです。
bootrec /fixmbr
bootrec /fixboot
bootrec /rebuildbcd
上記のとおりになれば、BCDファイルは復旧となります。
しかし、ここで、
bootrec /rebuildbcd の実行時に
「要求されたシステムデバイスが見つかりません」というエラーが発生する場合があります。(実際にくろねこはこちらのケースでしたが、ハードショット取り忘れてしまいました。ごめんなさい!)
この場合はさらに以下の手順で復旧を試みます。
diskpartコマンドで、BCDファイルのパーティションにドライブレターを割り当てます。手順は下記のとおり (余計なディスクはすべて取り外し、Windowsがインストールされたディスクひとつのみにします。)
diskpart
list disk
select disk 0
(ディスクは1本のみなのでディスク番号は0になっている状態です。)
list partition
表示された各パーティションの中から、容量などからBCDファイルが存在する容量100~300MBのパーティションを選択し、ドライブレターを割り当てます。(ここでは Mドライブとします。)
select partition n (nは該当のパーティション番号)
assign letter=M
exit
壊れたBCDファイルのバックアップを行い、Windowsのブート情報を再作成します。
cd /d m:\EFI\Microsoft\Boot
bootrec /fixboot
ren BCD BCD.bak
(壊れたBCDファイルのバックアップ)
bcdboot c:¥Windows /l en-us /s m: /f ALL
(BCDファイルの復旧)
1~2秒でコマンドは実行完了です。
ホントに復旧したのかよ? と思いつつ、シャットダウンします。(ゼロの状態に)
ブート
医療系ドラマでは、血流再開するシーンです。
電源ボタンを押し、インジケータランプが正常な状態で点灯すること確認
指差し点呼でヨシ!
なかなか画面にメーカーロゴマークが出ず、不安がよぎります(汗)
やがて、一瞬、ロゴマークが表示され、Bootメニューが表示されました!
このメニューはBCDファイルの内容をもとに表示されてます。
復旧の際に、ディスク上のブート可能なOSをスキャンしているため、メニューの選択肢に、Windows Server 2012 R2 が表示されているので、おそらく問題ないものと。
メニューから、起動するOSを選択して、Windows Serverを起動します。
サーバは無事起動し、さらに、仮想OSもいくつか動作確認して、問題ないこと確認します。
Hyper-Vサーバは帰ってきました!
蘇生成功です!
「ワタシ失敗しないので」
言ったとか言わないとか(笑)
それでも Hyper-V は復旧せず
Hyper-Vサーバは無事起動しました。
一応、念のため、仮想サーバを起動してみます。
ハイパーバイザーが実行されていないため、仮想マシンを起動できませんでした。
実は、このPCのコイン電池(CR2032)が老朽化のため、この停電で時刻情報を再設定する必要がありました。
そっか、BIOS設定もデフォルト値に戻ってしまったのね。。。
ということで、BIOS設定を実行します。
このPCのBIOSで
Virtualization Support メニュー →
Virtualization を Enable に変更します。
その後、ブートとして、Windows Serverを立ち上げます。
気を取り直して、仮想サーバを起動します。
ハイパーバイザーが実行されていないため、仮想マシンを起動できませんでした。
しばらく、言葉がありませんでした。。。
もう一度、気を取り直して、このエラーの原因を調査したところ
ブート構成データ ストアに対して変更を加えた場合は、これらの変更点を見直して、ハイパーバーザーが自動的に起動するように構成されていることを確認してください。
という情報を見つけました。(マイクロソフト関連のサイト)
この「ブート構成データ」とは、まさに、BCDファイルのことである。
「これらの変更点を見直して」→ 思いっきり弄ってました!
調査を進めたところ、
ブート構成データ ストアが、ハイパーバイザーが自動的に起動するように構成されていないことが原因 であることがわかりました。
ハイパーバイザーの自動起動の設定は、以下のコマンドで実施します。
bcdedit /set {id} hypervisorlaunchtype auto
id はブートメニューの選択肢にあたるメニューの id で、その確認方法は、引数の無い bcdedit コマンドで確認することができます。
くろねこのケースの場合は下記になりました。
bcdedit /set {current} hypervisorlaunchtype auto
Hyper-Vサーバ を再起動し、仮想サーバが起動することを確認しました。
これで、完全復旧デス!
おわりに
今回のhyper-Vサーバのケース、電気工事による影響は基本的に発生しないはずです。(なぜなら、停電時にこのマシン、電源は落ちていたからです。
あくまでも想像の範囲ですが・・・
BCDファイルの破損は、最後に動作していた時のシャットダウンの際に破損した可能性があったのではと思います。
それが、今回の停電後に発覚したということです。
まあ、今回のトラブルを機に、仮想サーバのバックアップ(VHDファイルのバックアップ)をとっておいたほうが良さそうです。(何かの暗示かも・・・)
BCDファイルの復旧は初めての試みでしたが、うまく復旧できました。正直、ほっとしました。
次回同様なトラブルに見舞われた際に、使える復旧方法を記事として(備忘録として)残しました。
もしかしたら、同様な事態に陥った方の解決のヒントになるかもしれません。
ですが・・・
復旧を試みる場合は、ディスクの状態等をよく確認のうえ、十分注意してください。また、あくまでも自己責任でお願いします。
まあ、今回は無事、復旧できたことは良かったです。
とはいえ、このようなトラブルは一瞬、ぞっとしますね💦
バックアップ採りましょう! 安全第一 です。
あ~ 復旧できてよかったぁぁぁ
ここまで、ご覧いただき、ありがとうございました。