ほんとうの修復(復元)のため、破損したパスを特定し、必要なファイルを上書きします。
①孤立ファイルの復元
まず、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)