windowsのパッチ適用に関する不具合と対策

Windowsのパッチは、月に1回まとめてリリースする運用をとっています。
 日本時間でのリリース日時は「毎月、第二火曜日の翌日の、9:00~9:30頃」です。
セキュリティに関する不具合もあるため、できる限り早めの適用が推奨されていますが、
適用による不具合も多々あり、システム管理者にとっては頭の痛い問題です。

私もパッチ適用関連の障害を多く経験してきましたが、以下のような問題がよく発生します。
・パッチ適用の確認が進まない
・特定のパッチが常にエラーになる
・パッチ適用後の再起動で、OSが起動してこない、起動に長時間かかる
・パッチ適用の再起動後、ログインできない、長時間待たされる
(「個人用設定」”次の個人用設定を設定しています Windowsデスクトップのアップデートコンポーネント”という警告が表示される)
・パッチ適用、再起動後にCPU負荷が長時間発生する
今回自宅の環境で大々的にトラブったので、対策をまとめてみました。


【今回の環境】NASです。
WindowsHomeServer2011sp1(Windows2008R2sp1相当)64bit
CPU非力(Intel Atom D525 1.8GHz )で論理コア数は4
メモリ8GB
システムディスクにはHDD4TB+SSD8GBのハイブリッドディスクを使用


【経緯】
システムが不調になったのでシステム状態を1年前のバックアップからリストアした。
リストア自体は成功したが、1年分のパッチおよそ90件を再適用したところエラーが発生した。
長時間のCPU負荷、再起動後も長時間ログインできない状態となる。
もう一度リストアしたら起動しなくなった。


【事象】CPU約25%の負荷が長時間発生

CPU負荷の原因は TrustedInstaller.exe 。
パッチ適用中にCPU約25%使用。
パッチ適用後(再起動待ち状態)でもしばらくそのままでCPU約25%使用。
OS再起動後もCPU約25%使用となる事がある、ならない事もある。
おそらく論理コア1個分の消費になるもよう。ただし、負荷は1コアに偏らない。

TrustedInstaller.exe とは何か
サービス名=TrustedInstaller
表示名=Windows Modules Installer
説明=「Windows の更新プログラムおよびオプション コンポーネントのインストール、変更、および削除を可能にします。このサービスを無効にしていると、このコンピューターに対する Windows Update のインストールまたはアンインストールが失敗する場合があります。」
スタートアップの種類=手動 (必要に応じて起動されるタイプです)
パッチ適用、プログラムの追加削除、アプリのインストール等で稼働する。
Windows7/Windows2008R2環境でCPU負荷の原因として多数報告されている。


調査したところ、いくつか情報が見つかりました。


<情報1>
Windows Modules Installer サービスのタイムアウト時間、60 分を経過するまでシャットダウンが行われない
https://support.microsoft.com/ja-jp/kb/2827854

ここの「詳細」から読み取れる情報
・Windows Modules Installer サービスが実行中に強制的に終了された場合、ロールバックされる
・次回起動時に再実行される
これがパッチ適用後の再起動で長時間を要する原因の1つと思われる。
既定値ならば最長でも1時間で再起動されるが、その場合処理がロールバック&再実行されるため、負荷が長時間になる。
フリーズと勘違いして強制再起動するとクラッシュの可能性もあるため、可能なら1時間待ってみる。
また、パッチ適用の一連の動作を正しく把握していれば、このタイムアウト時間を短くするのもあり。


<情報2>
サーバー マネージャーが起動し続けていると、TrustedInstaller.exe プロセスがメモリリークします
https://support.microsoft.com/ja-jp/kb/2794283

ここから読み取れる情報
・サーバーマネージャーを起動すると、TrustedInstaller.exe が起動される。

実際にサーバーマネージャーを起動してみると
 TrustedInstaller.exe が起動していない場合→起動されCPU約25%使用状態となる
 既にTrustedInstaller.exe が起動していて、CPU約25%使用中の場合→サーバマネージャーの情報表示まで数分間かかる

<無用な負荷を避けるための対策>
グループポリシーでログオン時にサーバーマネージャーを自動起動しないように設定するのが良い。


<情報3>
C:\Windows\Temp フォルダーに cab_XXX_X ( X は数字) が生成されディスクの容量を圧迫している場合の対処方法
http://blogs.technet.com/b/askcorejp/archive/2015/04/16/c-windows-temp-cab-xxx-x-x.aspx

ここから読み取れる情報
TrustedInstaller.exe は
C:\Windows\Logs\CBS\ にある
CBS.log

CbsPersist_xxxxxxxxxxx.log というファイル名に変更して保存する。

このファイルはプレーンテキストファイルで巨大なサイズになるため、自動的にcab形式に圧縮される。
圧縮の際にテンポラリーフォルダ(%TEMP%)に一時ファイルを多数生成する。
圧縮前のファイルサイズが 2GB を超えている場合、圧縮処理に失敗して一時ファイルが残ってしまう、というバグがある。
以降、TrustedInstaller.exe 起動時に、再度圧縮処理を実施し失敗するため、毎回一時ファイルが増加する。
こうなった場合はログファイルと一時ファイルを手動で削除する必要がある。
気付かずに放置すると、システムドライブがディスクフルとなる。

※システムドライブの空き容量が少ない状態でシステム領域のリストアを実行すると、リストアの途中でエラーとなりOS起動できなくなります。
※今回はそれで2回目のリストアに失敗しました。

<調査してみた>
C:\Windows\Logs\CBS\ の確認
 TrustedInstaller.exe が起動していて、CPU約25%使用中の場合、CBS.log が徐々に増加する。
 Windows Modules Installerサービスを再起動すると、ログがローテートされ、圧縮プロセスが起動する。
 圧縮プロセスは makecab.exe
 OS再起動や、TrustedInstaller.exe が起動していない状態からのサーバマネージャ起動、でも同様にログのローテートと圧縮が始まる。(始まらない事もある)

ログが2GBを超えないようにするにはどうしたら良いか?
試しにパッチ適用数を小分けにしてみた。
<1>
 パッチ10件(パッチ総サイズ50MB)を適用
 9件成功
 1件失敗 エラー(0x800f0902)が発生した場合
 TrustedInstaller.exeは1時間以上CPU約25%使用のまま稼働
 OS再起動後までで CBS.log は 921MB に増加
 サーバマネージャ起動でTrustedInstaller.exe起動、CPU25%使用
 ログがローテートされ、圧縮プロセスが起動(makecab.exe)
 数分後に 51MB のcabファイルに変換された
<2>
 パッチ15件(パッチ総サイズ65MB)を適用
 15件成功
 TrustedInstaller.exeは1時間以上CPU約25%使用のまま稼働
 OS再起動後までで CBS.log は 1.5GB に増加
 Windows Modules Installerサービスの再起動で
 ログがローテートされ、圧縮プロセスが起動(makecab.exe)
 数分後に 96MB のcabファイルに変換された
<3>
 パッチ10件(パッチ総サイズ21MB)を適用
 OS再起動直後で CBS.log は 433MB
 再起動後もCPU25%利用が続き、最終的に 731MB
 Windows Modules Installerサービスの再起動で
 ログがローテートされ、圧縮プロセスが起動(makecab.exe)
<4>
 パッチ1件(サイズ14KB)を適用
 OS再起動不要、CBS.log は 296MB
 Windows Modules Installerサービスが停止していたので開始で
 ログがローテートされ、圧縮プロセスが起動(makecab.exe)

<考察>
CBS.log の量は、一度に適用するパッチが多い程増加する。
一度に適用する数は10件程度にするのが無難と思われる。
デバッグ用途ならともかくこの量が常時出力されているのは設計のバグ。
それをリカバリするため圧縮する処理を付けて更に事態を悪化させている。



【対策まとめ】

(0)無用な負荷の回避(推奨)
ログオン時に「サーバーの役割管理」を表示しないようにする。
既定では表示されるので、グループポリシーで表示しないように設定する。
コンピュータの構成
 管理用テンプレート
  システム
   ログオン時に[サーバーの役割管理]ページを表示しない=有効
ログオン時に「サーバーマネージャー」と「初期構成タスク」を表示しないように、
グループポリシーを設定する。
コンピュータの構成
 管理用テンプレート
  システム
   サーバーマネージャー
    ログオン時に[初期構成タスク]ウィンドウを自動的に表示しない=有効
    ログオン時にサーバーマネージャーを自動的に表示しない=有効
    サーバーマネージャーの更新間隔を構成する=有効にして11分以上にするか、無効にして自動更新しないようにする
既に各画面で「ログオン時に表示しない」にチェックを入れて非表示にしている場合でも、
他のアカウントでログオンした場合は表示されてしまうので、ポリシーでの設定が推奨。

(1)パッチ適用前の確認1【重要】
パッチ適用前に、TrustedInstaller.exe がCPUを使用していないか確認し、
稼働している場合は終了する(CPU使用0%になる)まで待つ。
TrustedInstaller.exe 稼働中にパッチ適用を始めるとCPU負荷が高くなり時間もかかる。
確証は無いが、パッチ適用が失敗する原因にもなっているのではないかと推測。

(2)パッチ適用前の確認2【重要】
C:\Windows\Logs\CBS\CBS.log が2GBを超えている場合は削除する。tempフォルダも掃除した方がよい。
C:\Windows\Logs\CBS\CBS.log が2GB以下でも大きい時は、TrustedInstaller.exe がCPUを使用していない時に、
Windows Modules Installer サービスを再起動してログをローテート/圧縮させる。

(3)パッチ適用前の確認3【必須】
Windows Update Client は最新版にしておく。

(4)パッチ適用の件数【必須】
パッチを一度に大量に適用しない。10件程度が無難。
C:\Windows\Logs\CBS\CBS.log が2GBを超えないようにする。

(5)パッチ適用後(推奨)
すぐに再起動せずに、TrustedInstaller.exe が終了する(CPU使用0%になる)まで待つ。
もしくは、すぐに再起動して再起動後に、TrustedInstaller.exe が終了する(CPU使用0%になる)まで待つ。
これは、無駄なCPU負荷を作らないための策なので必須ではないが、非力な環境や、負荷に注意が必要なサービスでは重要。



【総まとめ】
適用すべきパッチが大量にある場合、特にリストアや新規インストール直後は全件適用しないようにしましょう。
面倒でも、10件程度を適用し再起動、CPUの負荷が無くなるまで待つ、の繰り返しで。
毎月パッチをちゃんと適用している環境であれば「パッチが多い月は2回に分けて適用」くらいで済みます。


【今回のキーワード】
パッチ適用の確認が進まない
TrustedInstaller.exe
CPU使用率、負荷
CBS.log

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

ナイス

この記事へのコメント

この記事へのトラックバック