運用を開始して、2年ほどたったWindows Server 2019のサーバの再起動に、20~30分程度かかってしまう現象が出ていました。
原因は、レジストリの肥大化でした。
下記に保存されているキーの数が膨大すぎて、GUIでは開けない。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles
- 環境要因
問題が発生しているサーバは、Citrix XenAppのSBCサーバで、複数のユーザがログインします。
ログインのたびに、プリンタサーバの共有プリンタをマウントしているのですが、
上記のレジストリに、プリンタドライバーのキーが大量に生成されていました。
上記レジストリを格納しているファイル
C:\Windows\System32\config\SOFTWARE
このキャプチャした環境だと、ファイルサイズが、1GBを超えています。
- 対処
手動でちまちま削除はできないので、スクリプトを書いて、自動処理させましょう。
※バックアップは、必ず、実施しておいてください。
管理者でもそのままでは削除できないキーだったので、SYSTEM権限で削除しました。
1 PSEXECを使って、Powershellを起動。SYSTEM権限で実行する。
C:\Users\nouka> psexec -i -s powershell
以下のスクリプトは、SYSTEM権限のPowershell内で実行
2 レジストリのエクスポート。この後、削除対象のキーを限定するのに使います。
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles C:\SOFTWARE_PnpLockdownFiles.reg
3 spoolキーワードが入っているキーのみ削除。
Get-Content "C:\SOFTWARE_PnpLockdownFiles.reg" |select-string "spool" | % { `
$path = ($_.ToString().Replace("[",'').Replace("]",""));
reg delete $path /f
}
この手順でレジストリは削除されて、OSの起動も1~2分に戻りました。
ただ、レジストリファイルは収縮されないので、
ファイル自体を圧縮する場合は、別途手段が必要です。
私の案件では実施しませんでしたが、手順だけ調べたので、メモしておきます。
1 WindowsのインストールISOなどを使って、PE起動する。
2 Shift+F10などで、cmd起動
3 regeditを起動し、C:\Windows\System32\config\SOFTWAREをハイブ読み込み。
4 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFilesを保存。
保存するときは、ハイブ形式。
5 ハイブのアンロード。できないときは、PE再起動。
6 C:\Windows\System32\config\SOFTWAREと、エクスポートしたファイルをスワップ。
- 予後
レジストリを削除して、2~3週間運用しましたが、まったくトラブルは発生していない。
なんためのレジストリキーなのかは調査できていません。