PCの不調を復旧する~ほんとうの修復(復元)~

2020/12/19

 ほんとうの修復(復元)のため、破損したパスを特定し、必要なファイルを上書きします。


①孤立ファイルの復元

まず、found.xxxディレクトリ内のファイル名および、バージョン情報からどのファイルパスから切り離されたかを特定します。アプリケーションの一部なら、アプリケーションを再インストールすれば、復元できます。幸いにもバックアップがあれば、切り離された部分の上位から上書きすれば、復元できます。また、アプリケーションの一部であれば、アンインストールや再インストールで、問題を解消できます。


②「破損した基本ファイル構造が見つかりました」の復元

ファイル名が記載されていると思いますので、前記と同様に、ファイルパスを特定後、上書きにより復元が可能になります。


③「ファイル *** のインデックス $I30 で、エラーが検出されました。」の復元

ファイル名が記載されていれば、前記と同様に、ファイルパスから上書きにより復元が可能になります。ファイル番号の場合は、DiskEditというツールで、ファイル番号からファイルパスに変換できます。「diskedit microsoft」の検索で、調べてみてください。


④「ディレクトリ "\***\***" のインデックス "$I30" に不要なリンク ($FILE_NAME: "******") が見つかりました」

これは、WindowsがDLLなどのバージョン管理のために、ハードリンクを多用しているために発生しやすいようです。今回は、ファイルシステムが損傷している時に、WindowsUpdateが走ってしまったので、多発したようです。PCにトラブルが発生した場合は、WindowsUpdateを停止させておくと無難なようです。いずれにしても、次の段階「DISMおよびsfcによる復元」で対応できると思います。


⑤「ブロック 0x** の USA 確認値 0x** が正しくありません。」

これは、NTFSのMFTと呼ばれる属性情報内で、"Update Sequence Array"値の不一致が見つかった場合です。今回のようなPCの不調のように、何らかの問題で属性情報の更新が中断してしまったようです。この不整合が見つかると、ファイル本体のfixupという操作が正しく行われない場合、ファイルクラスタ内の特定の1バイトが誤った内容になることがあります。対象となるパス名を特定することはできますが、非常に手間がかかりますので、「DISMおよびsfcによる復元」で解消できる期待することにします。この段階では、何もしませんが、Active@ Disk EditorというNTFSの内部を参照できるツールとNTFSの構造を理解すると、特定ができるようです。


⑥DISMおよびsfcによる復元

DISMは、Windowsのインストールイメージ作成のため、パッケージの追加・更新・削除ができる非常に多機能なツールです。稼動しているWindowsにたいしても、同様な機能を持っていますので、WindowsUpdateの一部として動作するようです。さらに、下記のようにインストールされているパッケージが破損していれば、復元してくれる便利な機能があります。


Dism /Online /Cleanup-image /RestoreHealth


期待して実行してみましたが、実行結果は「エラー: 0x800f081f ソースファイルが見つかりませんでした。」で復元できませんでした。いくつかのファイルは、復元できたようですが、復元できないファイルがあるようです。このエラーは、WindowsUpdateに対象のファイルが見つからなかったようです。このエラーが発生している事例が結構多いようです。


下記のようにsfcで、Windows本体以外のファイルの復元を試みましたが、これまた、復元できないファイルが残っているようです。


sfc /scannow


ここで、アプリケーションを保持しながらWindowsの上書きインストールを試してみましたが、途中で、何らかの問題があるようで、インストールが中断・ロールバックされてしまいました。


そのため、破損ファイルをできるだけ上書きするために"Windows10 20H2"の更新プログラムを実行したところ、正常に更新されました。


期待しながらDISMとsfcを実行しましたが、やはり破損ファイルが残っていました。ここまでは、自動的なツーツに頼ってきましたが、ここからは、手動操作しかないので、詳細な原因を調べていくしかありません。そこで、"C:\Windows\Logs\DISM\dism.log" と、"C:\Windows\Logs\CBS\CBS.log" を注意深く確認したところ、"Cannot repair"と記載された部分が破損しているが復元できなかったことがわかります。


多くの破損ファイルは、古いバージョンのパッケージに含まれているようで、"C:\Windows\WinSxS" 配下にありました。WindowsUpdateへのアクセスはありましたが、最新のパッケージ情報に基づいたWindowsイメージからしか修復ができないためか、ソースファイルが見つかりませんでしたになっているのではないでしょうか。古いバージョンのファイルは、復元が効かないようです。WindowsUpdateのバージョンは、すでに月次更新が適用されているのではないでしょうか。


そこで、DISMのメッセージ「機能の復元に必要なファイルの場所を指定するには、”Source” オプションを使用してください。ソースの場所 の指定の詳細について は、http://go.microsoft.com/fwlink/?LinkId=243077 を参照してください。」に従い/Sourceオプションを使用するため、rufusを使用してWindowsインストールイメージをUSBメモリに保存しました。各ビルド毎のWindowsインストールイメージが選べる点が優れています。今回は、破損したファイルのビルド番号から"Windows10 20H2"でした。


下記のようにDISMで、ローカルドライブにWindowsイメージを展開し、mount状態にします。mountと言っても、所有者をTrustedinstallerにして、容易な改ざんを防いでいると思われます。"index:3"は、Windows10 Professinalを指定しています。(それぞれのパスは、環境により変わりますのでご注意ください)


Dism /Mount-Image /ImageFile:H:\sources\install.wim /index:3 /MountDir:G:\dism\mount


次のように復元を試みましたが、依然「エラー: 0x800f081f ソースファイルが見つかりませんでした。」となりましたが、いくつかの破損したファイルは修復できたような感じです。


Dism /Online /Cleanup-Image /RestoreHealth /Source:G:\dism\mount /LimitAccess


ディレクトリ名からファイルのビルド番号がはっきりしていますので、Windowsの更新履歴から、WindowsUpdateカタログの番号を特定し、対象の更新プログラムを見つけダウンロードして再インストールを試みましたが、すでにインストール済になり、再インストールができませんでした。これは、パッケージの状態がパーマネント(更新プログラムがクリーンアップされている場合)であると、修復ができないのではないかと思われます。


最終手段として、破損しているファイルを手作業で上書きすることにしました。ところが、問題は、特定できたビルド番号のDLLなどの更新ファイルがWindowsUpdateカタログから入手した更新プログラムから直接取り出せないことでした。再インストールもできませんので、DISMのイメージ管理機能を使用し、mountできているWindows10インストールイメージに、更新プログラムを適用してDLLなどのファイルの実体を取り出すことにしました。C:\mountに更新プログラムを配置した場合、下記のようなコマンドとなります。


Dism /image:G:\dism\mount /add-package /PackagePath:C:\mount


Windows10インストールイメージ、"G:\dism\mount\Windows\WinSxS" から特定のパッケージのDLLなど、対象ファイルを上書きすることにしました。事前準備として、上書きが必要なファイルの所有者を変更し、更にフルコントロールの権限を付与しておく必要があります。上書き後は、元に戻しておく必要があります。残った破損ファイルが2つのファイルだけでしたので、それほどの手間ではありませんでした。


再度、DISMで修復確認を行うと、100%完了状態となりました。


次は、sfcで残ったファイルを復元することにしました。"C:\Windows\Logs\CBS\CBS.log" 内の"Cannot repair"の破損したファイルが対象になります。DISM時の復元手順と同じように上書きし復元しました。


また、"Visual C++ 2008 Redistribute - X64"のDLLが破損しているとのことで、これは、アンインストールし、改めて最新版をインストールすることで、破損部分を破棄できました。


以上のような復元にチャレンジした結果、CHKSDK、DISM、sfcをすべてクリアできました。まずは、ほっとしました。

(再クロール更新:2022/12/22)

PCの不調を復旧する~CHKDSKの修復と復元とは違う~

2020/12/18

 CHKDSKは、下記のステップでファイルシステム構造上の不整合を検出・修復できるツールです。


ステージ 1: 基本のファイル システム構造を検査しています ...

ステージ 2: ファイル名リンケージを検査しています ...

ステージ 3: セキュリティ記述子を検査しています ...

CHKDSK は Usn ジャーナルを確認しています...


ここでの「修復」が問題です。これはファイルシステムの不整合(エラー)の修正(fix)だけです。


ファイルシステムは、ツリー構造のファイル(ディレクトリ)からなり、その構造を管理するための様々な属性情報を持っています。ファイルシステムの構造上の不整合があると、エラーを検出してプログラム(Windowsを含む)が処理の継続ができなくなるだけでなく、ファイルを探す場合、正常に見つけられない、読み込む場合、本来の内容以外の壊れた内容を読み込んでしまう、書き込む場合、書き込んだ内容が既存のファイルや属性情報を壊してしまうなど、Windowsが自滅することにもつながります。


CHKDSKは、ファイルシステム構造上の不整合を検出し、Windowsがどのファイルにも安全にアクセスできるように、可能な限りその不整合を解消します。「可能な限り」とは、利用できる情報があれば不整合を修正し、その結果で正常な範囲を温存し、異常な部分を切り離します。この切り離された部分を含み、ファイルシステムが使用済みとマークされた領域に断片的なファイルの属性情報や内容が見つかれば、孤立ファイルとして、ルートディレクトリの配下にfound.xxxというディレクトリに配置されます。異常な部分を切り離によっては、必要な情報が整っていない場合、ファイルやディレクトリの救済ができず紛失することもあります。


この過程で、下記のような難解なログメッセージが吐き出されます。


破損した基本ファイル構造が見つかりました

ブロック 0x** の USA 確認値 0x** が正しくありません。

ディレクトリ "\***\***" のインデックス "$I30" に不要なリンク

 ($FILE_NAME: "******") が見つかりました

 ... オンラインで修復しました。

ファイル *** のインデックス $I30 で、エラーが検出されました。


破損して利用できない部分は、トカゲのしっぽのように切り離し、Windowsがどのファイルにも安全にアクセスできるようにできるわけですが、必須なファイルが紛失したり、修復過程でファイルの破損やハードリンクに問題が発生するとWindowsが正しく動作しないことがあります。


以上のように、CHKDSKは、破損した部分を復元(restore)できるわけではありません。運よくWindowsが立ち上がれば、破損したパスを特定し、破損したファイルを上書きをしなければ復元ができません。

(再クロール更新:2022/12/22)

PCの不調を復旧する~突然PCが落ちる~

2020/12/17

 Windows10 Professionalが突然落ちて、画面が真っ黒になり、何が起こったのかわからなくなりました。気が付いてみると、PCを購入してからすでに8年ほど経っていました。半年ぶりにPC内部の埃の掃除し、点検しましたが、特に問題は見つかりませんでした。


SSDのSMARTを確認し、記憶内容の読み込みエラーが発生していないか確認しましたが、読込みエラーは、ありませんでした。次に、怪しい部分は、電源の不調によりリセットが発生したかもしれないので、念のため電源容量が十分な新しい電源ユニットに交換してみました。依然として、突然PCが落ちることが治りませんでした。


ここで、以前のWindowsなら、ブルースクリーンが出てから落ちるようになっていたことに気が付き、なぜブルースクリーンが出ないか、確認すると、Windows10では、システムエラー時、「自動的に再起動する」がデフォルトになっていました。おせっかいの極みです。ブルースクリーンが出るようにすると、「MEMORY_MANAGEMENTエラー0x0000001a」が発生していました。


これは、メモリーに問題がある場合に発生することが多いため、メモリー診断を行いましたが、問題無いようでしたが、よっぽど状態が悪くない限りエラーを発見できないようです。突然PCが落ちる頻度は、30分~数時間ですので、次に、DIMMコネクターの接触不良ではないかと、接点を清掃して2枚のDIMMを入れ替えましたが、まだ、突然PCが落ちます。しかたがないので、メモリを新調したところ、治まりました。


原因が特定できて少しほっとしたました。ところが今度は突然PCが落ちたために、SSDのCHKDSKが必要な状態になりました。しばらく起動時のCHKDSKをスキップさせていましたので、CHKDSKを行うと修復はできましたが、ボロボロ状態でした。念のため、バックアップソフトで、パーディションのバックアップを取ろうとしましたが、セクター単位でしかバックアップが取れませんでした。(ファイルシステムに問題がある証拠です)


NTFSは、ジャーナルによって、ファイルシステムが必要なロールバックにより、整合性を保つ仕組みがあるはずでしたが、なぜか、修復を必要な状態になってしまいました。泣きっ面に蜂状態です。思い起こすと、HDDをSSDに乗せ換えたときに、AHCI モードを使用し、ドライブ側のWriteキャッシュを有効にしていたことに気が付きました。これでは、ドライブ側のWriteキャッシュが捨てられることが発生し、NTFSのロールバックが意味なくなることになります。わかっていたものの、パフォーマンスを重視しすぎました。


さて、たくさんのアプリケーションをインストールしている環境なので、Windowsの新規インストールは避けたいところです。SSDの復旧をするしかない状況になりました。

(再クロール更新:2022/12/22)