検索
連載

「C:\Windows\WinSxS」(コンポーネントストア)は絶対に触れてはいけないWindowsの“聖域”山市良のうぃんどうず日記(232)

Windowsの「C:\Windows\WinSxS」フォルダのサイズが気になってしょうがないユーザーは多いようです。特に「C:\Windows\WinSxS\Temp」は一時フォルダなんだから、何とかしてファイルを削除して中身を空っぽにしたいと考えている人がいるようです。でもそれ、絶対にダメですよ。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

「C:\Windows」の中で一番サイズが大きいのは「\WinSxS」?』

本稿ではWindows Sysinternalsのユーティリティーを幾つか使用していますが、それらはhttps://docs.microsoft.com/ja-jp/sysinternals/から入手できる他、Windows 10やWindows 11の場合はMicrosoft Storeから「Sysinternals Suite」として導入することができます。


 Windowsの「C:\Windows\WinSxS」ディレクトリは「コンポーネントストア」とも呼ばれ、Windowsのサービシング(Servicing、Windowsの機能や更新プログラムのインストール/アンインストールなど)に関係するファイルの格納場所となっています。

 Windows Updateはコンポーネントストアに対して更新プログラムをインストールし、更新プログラムのアンインストールによるロールバック用に古いバージョンのコンポーネントをバックアップします(画面1)。

画面1
画面1 Windows Updateで更新プログラムをインストールすると、コンポーネントストアに対して大量の読み書きが行われる

 Windowsでオプションの機能を有効化(サーバの場合は「役割や機能」の有効化)する際には、コンポーネントストアに格納されているソースファイルが使用されます。これにより、インストールメディアを使用したり、MicrosoftのWebサイトからダウンロードしたりしなくても、機能(例えば、Hyper-VやIIS《インターネットインフォメーションサービス》)を有効化できるようになっています。ファイルの破損やブートエラーからシステムを復旧するためのバックアップも格納されています。

 「エクスプローラー」を使用して「C:\Windows」の中のサブディレクトリのサイズを確認すると、「\WinSxS」が最もディスク領域を消費しているように見えるでしょう。しかし、それは見掛け上の話です。Windowsのシステムファイルの多くは、例えば「C:\Windows」や「C:\Windows\System32」にあるDLLファイルやEXEファイルは、実際にはそこに実体があるわけではなく、コンポーネントストアに格納されている最新のDLLファイルやEXEファイルにリンクされたハードリンクを見ているのです。

 例えば、「Windows 10」の「メモ帳」の実行ファイル名は「C:\Windows\System32\notepad.exe」ですが、Windows Sysinternalsの「findlinks.exe」で調べてみると、「C:\Windows\notepad.exe」と「C:\Windows\WinSxS\……\notepad.exe」の2つの別のハードリンクが見つかります。

 ハードリンクの概念からすれば、どのファイルが実体(本体)という区別はなく、全て同じものを参照するリンクにすぎません。ファイルに対するハードリンクの数が「0」になると、ファイルは削除されます。コンポーネントストアの概念からすると、「C:\Windows\WinSxS\……\notepad.exe」が実体ということもできます。「C:\Windows\WinSxS」の下を探してみると、古いバージョン(そのうち1つはオリジナルバージョン)の「notepad.exe」が幾つか見つかります(画面2)。これらは、更新プログラムのアンインストールした際に復元用にコンポーネントストアに残されているのです。

画面2
画面2 「C:\Windows\System32\notepad.exe」には他に2つのハードリンクが存在する。コンポーネントストアには、最新バージョンの「notepad.exe」が1つと、古いバージョン(この例では2バージョン)の「notepad.exe」が存在する

 ここまでで、コンポーネントストア内のコンテンツに安易に触れてはいけないことが想像できると思います。「C:\Windows\WinSxS\Temp」や「C:\Windows\WinSxS\Temp\InFlight」も例外ではありません。「Temp」や「InFlight」という名称から、「一時的」や「フライト中(処理中)」と想像して、削除してもよいのではと考えるかもしれませんが、更新プログラムのインストールが完了し、再起動したとしても、依然としてそこにハードリンクを持つシステムファイルも実際に存在するのです(画面3)。

画面3
画面3 パスに「Temp」や「InFlight」という名前が含まれているからといって、使用されていないわけではない

コンポーネントストアの実サイズの正しい調べ方

 エクスプローラーで表示できる「C:\Windows\WinSxS」のディレクトリサイズは、ハードリンクを考慮しない(ハードリンクか、そうではないかに関係なく全てカウントする)見掛け上のサイズです。実際のサイズを確認する方法は、以下のドキュメントで説明されています。

 具体的には、管理者としてコマンドプロンプトを開き、以下のコマンドラインを実行します(画面4)。

Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore
画面4
画面4 筆者のWindows 11コンピュータでのDISMコマンドによるコンポーネントストアの分析結果(DISMコマンドは「1KB=1024B」ではなく、「1KB=1000B」で換算しているらしい)

 「コンポーネントストアの実際のサイズ」が答えです。そのうち、「Windowsと共有」のサイズは、何かWindowsの機能を削除しない限り、大きく削減することはできません。「バックアップおよび無効な機能」と「キャッシュおよび一時的なデータ」については、コンポーネントストアのクリーンアップによって削減できる場合があります。

 なお、エクスプローラーで8.11GB(=8,717,508,763/1024/1024/1024)なのに、「DISM」コマンドで8.71GBとなっているのは、GB換算方法の違いからくるものだと思います(前者は8,717,508,763/1024/1024/1024、後者は8,717,508,763/1000/1000/1000)。筆者の想像通りなら、DISMコマンドが出力した実際のサイズ8.40GBは、7.8GB(8.4*1000*1000*1000/1024/1024/1024)になります。

コンポーネントストアのクリーンアップ効果は?

 前出の画面4のDISMコマンドの結果、コンポーネントストアのクリーンアップが推奨されました。コンポーネントストアのクリーンアップは、通常、Windowsのタスク「\Microsoft\Windows\Servicing\StartComponentCleanup」で定期的にスケジュール実行されますが、以下で説明されている方法を用いて、手動で確実に実行することもできます。

 なお、「\Microsoft\Windows\Servicing\StartComponentCleanup」はバッテリー稼働時には実行されないため、タブレット端末など使用中は常にバッテリー稼働しているデバイスの場合、長時間、実行されない場合があることに注意してください。

 確実に実行するには、コマンドプロンプトを管理者として開き、次のいずれかのコマンドラインを実行して、完了するまで待ちます(画面5)。

Dism.exe /online /Cleanup-Image /StartComponentCleanup
または
Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
画面5
画面5 コンポーネントストアのクリーンアップにより、「バックアップおよび無効な機能」が1GB以上削除された

 後者の「/ResetBase」パラメーターは、サイズ縮小の効果が最も期待できますが、置き換え済みのコンポーネントを全て削除します(つまり、ロールバック用の古い更新バージョンを削除します。ただし、オリジナルバージョンは残ります)。そのため、その時点までにインストールされた更新プログラムはアンインストール不能になります。システムが安定稼働している場合にのみ利用してください。

あなたを幻惑するコンポーネントストアのサイズ

 ちょっと面白いことを実験してみましょう。「Windows Sysinternals」にディレクトリの使用状況を再帰的に調査できる「Directory Usage(du.exe)」というユーティリティーがあります。このユーティリティーを次のように異なるオプションで実行してクリップボードに結果をCSV形式で格納し、「Microsoft Excel」のワークシートに貼り付けてみました。

du -nobanner -l 1 -ct -u c:\windows | clip
du -nobanner -l 1 -ct c:\windows | clip

 1つ目のコマンドの結果がBook1、2つ目のコマンドの結果がBook2です(画面6)。

画面6
画面6 du.exeの「-u」パラメーターの有無で結果が大きく変わる

 Book1では「C:\Windows\WinSxS」が「C:\Windows」のサブディレクトリの中で最もディレクトリサイズ(DirectorySize)が大きく、そのサイズ(バイト)はエクスプローラーのサイズと正確に一致しています。

 一方、Book2では1GB程度しかなく、1位の「C:\Windows\System32」、2位の「C:\Windows\Installer」に続く第3位に陥落してしまいました。

 なぜこうなったのでしょうか。du.exeの「-u」パラメーターは、ハードリンクファイルの各インスタンスを全てカウントします。つまり、エクスプローラーと同じ見掛け上のサイズを結果として返します。このパラメーターを指定しないと、複数のハードリンクを持つインスタンスを1回しかカウントしません。

 「WinSxS」はアルファベット順で最後の方になるので、現在システムファイルとしてアクティブなハードリンクは「C:\Windows\WinSxS」のサイズを計算する際には、そのほとんどが既にカウント済みになっており、「C:\Windows\WinSxS」ではカウントされなかったということです。

 その結果、DISMコマンドの「バックアップおよび無効な機能」のサイズ(前出の画面5)に大きく近づいたわけです。もちろん、Book2が正確なディレクトリのサイズというわけではありません。「C:\Windows\WinSxS」の下にあるハードリンクの多くが、別のディレクトリで先にカウントされてしまったというだけです。

 というわけで「C:\Windows\WinSxS」の見掛け上のサイズに惑わされないようにしてください。実際のサイズの確認方法やクリーンアップ方法は、公式ドキュメントで説明されている方法で実施してください。

 Windows 10や「Windows 11」の機能更新プログラムでインプレースアップグレードが実行されると、「C:\Windows」が置き換えられ、「C:\Windows\WinSxS」も初期状態に近い状態からスタートします。そのため、肥大化がどうしても気になる、絶対にこのサイズは異常だ、クリーンアップが失敗するという場合であっても、機能更新プログラムが解消してくれるはずです。

 ただし、Windows 10 バージョン2004からバージョン21H2まで、OSのコアは「VB_RELEASE(19041)」であり、イネーブルメント(有効化)パッケージという方法でWindows 10のマイナーアップデートが続いています。そのため、適切にクリーンアップされていないと、大きく肥大化しているかもしれません。現在のコンポーネントストアに疑念がある場合は「PCのリセット(新たに開始)」を実施することで、フレッシュな状態からまたスタートできる可能性があります。

 最後に話はそれますが、これまで「半期チャネル(Semi-Annual Channel、SAC)」でリリースされてきたWindows 10ですが、Windows 10 バージョン21H2からは、Windows 11と同じ1年に1回リリースの「一般提供チャネル(General Availability Channel)」に変更されました。Windows 11に対応していないPCの場合、次のWindows 10の機能更新プログラムは2022年秋の予定です。その際、再びイネーブルメントパッケージなのか(またビルド+1の19046とか)、そうでないのかについて、現時点で何の情報もありません。

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP 2009 to 2022(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る