こないだ遭遇した事象について備忘録もかねてまとめます。
起きたこと
とあるメーカー製のWindows Server 2012 R2サーバーに対してWindows Updateを適用して再起動したところ、再起動中にSYSTEM_THREAD_EXCEPTION_NOT_HANDLED(0x0000007E)が発生する様になってしまいセーフモードにすら出来なくなってしまいました。
詳細なエラーメッセージは以下の様な感じ。
system_thread_excption_not_handled (WppRecorder.sys)
原因
で、いろいろ調べて見つけたのが以下のサイト達。
BSOD system_thread_excption_not_handled (WppRecorder.sys)
IA Server MAGNIA |Windows Server 2012 R2関連情報| 東芝デジタルソリューションズ
Precautions for using "4KB sector HDD" on NEC Express5800 Servers(PDFファイル)
どうやらWindows Server 2012以降(R2も含む)のサーバーに対して、
- 4Kネイティブのハードディスク*1上で稼働させている
- NTFS圧縮を有効にして
C:¥Windows¥System32¥drivers¥
フォルダ配下のドライバファイル(*.sys)
が圧縮されている
この2つの条件を満たす場合にこのストップエラーが出てしまい起動不可になってしまうそうです。
確かに今回のサーバーではC:¥Windows¥System32¥drivers¥
フォルダ配下の84ファイルが圧縮されていました。
ちなみに、この件についてKBは出ていない様で、Widnowsの不具合なのかサーバーベンダー側の問題(たとえばベンダー提供のドライバが悪いとか)なのかははっきりしていません。
-- 2015/10/02追記 --
この件に関してKB3027108が出ていました。 リンク先から修正プログラムを適用することでも対処できる様です(未検証)。
-- 追記ここまで --
対処法
対処法は上記サイトにある様に圧縮されいてるドライバファイルを解凍してやれば再起動できる様になります。
手順はリンク先を見ればわかるのですが、備忘録もかねて以下に自分のやった手順を記載しておきます。
1. Windows回復環境(Windows RE)からコマンドプロンプトを起動する
Windows回復環境からコマンドプロンプトを起動させる手順についてはこの辺を参照してください。
通常は2回起動に失敗するとWindows回復環境が起動するはずです。
2. ドライバファイルの圧縮を解除する
compact /U
コマンドを使って圧縮されたドライバファイルを解凍します。
C:¥Windows¥System32¥compact.exe /U C:¥Windows¥System32¥drivers¥*.sys
3. サーバーを再起動する
コマンドプロンプトを終了させてサーバーを再起動します。
これでサーバーが再起動するはずです。
予防策
まず、自分の運用しているサーバーのハードディスクが4Kネイティブなのかどうかはfsutil
コマンドを使うと確認することができます。
以下のコマンドでCドライブのハードディスクのセクタ情報を見ることができます。
Fsutil fsinfo ntfsinfo C:
このコマンドの結果で、セクターあたりのバイト数=4096
かつ物理セクターあたりのバイト数=4096
であれば4Kネイティブのハードディスクを使用していることになります。
4Kネイティブのハードディスクを使用している場合、NTFS圧縮を無効にしてやればこの現象を回避することができます。
対処法からすればドライバファイルさえ圧縮されてなければNTFS圧縮が有効でも問題はないと思うのですが、いつ問題を起こしうるドライバファイルが圧縮されてしまうかわからないのでNTFS圧縮自体を無効にしたほうが安全だと思います。
現在NTFS圧縮が有効かどうかは以下のコマンドでわかります。
fsutil behavior query DisableCompression
この結果がDisableCompression = 0
の場合NTFS圧縮が有効で、以下のコマンドで無効にできます。
fsutil behavior set DisableCompression 1
*1:512eのハードディスクは問題ないそうです