プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

unattended-upgrade 実行失敗と復旧

[Ubuntu] セキュリティアップデートの自動インストール に書いたように、セキュリティアップデートを自動で適用しています。先日、別の作業で、サーバーにログインしてみると、セキュリティアップデートの適用に失敗していることに気づきました。

今回、これを修復するにあたって行った作業を、自分の作業記録代わりにまとめておきます。なにぶん慣れない作業だったので、あれこれ試したことも書いていますので、ご容赦ください。

 

セキュリティアップデートのログは、 /var/log/unattended-upgrades 以下に保存されているので、ログファイルを調べるとカーネルヘッダのアップデートの際にエラーが起きてました。

2015-08-18 06:48:35,902 INFO 許可されているパッケージ導入元: ['o=Ubuntu,a=precise-security']
2015-08-18 06:50:36,988 INFO Packages that are upgraded: linux-headers-virtual linux-image-virtual linux-libc-dev linux-virtual
2015-08-18 06:50:36,989 INFO dpkg のログを '/var/log/unattended-upgrades/unattended-upgrades-dpkg_2015-08-18_06:50:36.988737.log' に書き込み中
2015-08-18 06:51:06,919 ERROR アップグレードのインストールが失敗しました!
2015-08-18 06:51:06,920 ERROR エラーメッセージ: 'installArchives() failed'

さらに詳細にログを見ると、ディスク容量不足とありました。ちなみに、インストールに失敗したのは、linux-headers-3.2.0-89 および linux-headers-3.2.0-89-virtual パッケージのインストールでした。

なお、現時点で動作しているカーネルのバージョンは、

bitnami@ip-10-132-190-144:~$ uname -r
3.2.0-88-virtual
bitnami@ip-10-132-190-144:~$ 

でした。

 

なにはともあれ、まずは不要なファイルを削除して、再度インストールすればいいかと思い、

bitnami@ip-10-132-190-144:~$ sudo apt-get update
bitnami@ip-10-132-190-144:~$ sudo apt-get -f install
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-image-3.2.0-76-virtual
(略)
  linux-headers-3.2.0-65-virtual
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  linux-headers-3.2.0-90 linux-headers-3.2.0-90-virtual linux-headers-virtual linux-image-3.2.0-90-virtual linux-image-virtual linux-virtual
提案パッケージ:
  fdutils linux-doc-3.2.0 linux-source-3.2.0 linux-tools
以下のパッケージが新たにインストールされます:
  linux-headers-3.2.0-90 linux-headers-3.2.0-90-virtual linux-image-3.2.0-90-virtual
以下のパッケージはアップグレードされます:
  linux-headers-virtual linux-image-virtual linux-virtual
アップグレード: 3 個、新規インストール: 3 個、削除: 0 個、保留: 177 個。
5 個のパッケージが完全にインストールまたは削除されていません。
25.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 104 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-image-3.2.0-90-virtual amd64 3.2.0-90.128 [12.9 MB]
取得:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-virtual amd64 3.2.0.90.104 [1,760 B]
取得:3 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-image-virtual amd64 3.2.0.90.104 [2,318 B]
取得:4 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-3.2.0-90 all 3.2.0-90.128 [11.7 MB]
取得:5 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-3.2.0-90-virtual amd64 3.2.0-90.128 [978 kB]
取得:6 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main linux-headers-virtual amd64 3.2.0.90.104 [2,286 B]
25.6 MB を 1秒 で取得しました (22.8 MB/s)    
Selecting previously unselected package linux-image-3.2.0-90-virtual.
(データベースを読み込んでいます ... 現在 566980 個のファイルとディレクトリがインストールされています。)
(.../linux-image-3.2.0-90-virtual_3.2.0-90.128_amd64.deb から) linux-image-3.2.0-90-virtual を展開しています...
Done.
Selecting previously unselected package linux-headers-3.2.0-90.
(.../linux-headers-3.2.0-90_3.2.0-90.128_all.deb から) linux-headers-3.2.0-90 を展開しています...
dpkg: /var/cache/apt/archives/linux-headers-3.2.0-90_3.2.0-90.128_all.deb の処理中にエラーが発生しました (--unpack):
 ディレクトリ `./usr/src/linux-headers-3.2.0-90/arch/ia64/include/asm/uv' の作成中にエラーが発生しました: デバイスに空き領域がありません
MaxReports にすでに達しているため、レポートは書き込まれません
                                                             dpkg-deb: error: subprocess ペースト was killed by signal (Broken pipe)
Selecting previously unselected package linux-headers-3.2.0-90-virtual.
(.../linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb から) linux-headers-3.2.0-90-virtual を展開しています...
dpkg: /var/cache/apt/archives/linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb の処理中にエラーが発生しました (--unpack):
 (`./usr/src/linux-headers-3.2.0-90-virtual/scripts/recordmcount' の処理中に) `/usr/src/linux-headers-3.2.0-90-virtual/scripts/recordmcount.dpkg-new' の作成に失敗しました: デバイスに空き領域がありません
MaxReports にすでに達しているため、レポートは書き込まれません
                                                             dpkg-deb: error: subprocess ペースト was killed by signal (Broken pipe)
以下のパッケージの処理中にエラーが発生しました:
 /var/cache/apt/archives/linux-headers-3.2.0-90_3.2.0-90.128_all.deb
 /var/cache/apt/archives/linux-headers-3.2.0-90-virtual_3.2.0-90.128_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
bitnami@ip-10-132-190-144:~$ 

と実行しても、やはり同じようにディスクに空きがなくてエラーになってしまいます。

dfで確認すると

bitnami@ip-10-132-190-144:~$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda1      10321208 7680236   2116688  79% /
udev              293896       8    293888   1% /dev
tmpfs              60432     168     60264   1% /run
none                5120       0      5120   0% /run/lock
none              302152       0    302152   0% /run/shm
bitnami@ip-10-132-190-144:~$ 

となっており、容量的には約2G近く空いてます。

なんか妙だなとおもって、ひょっとしてiノードが足りなかったりして、まさかねと思って調べてみると

bitnami@ip-10-132-190-144:~$ df -i
Filesystem     Inodes  IUsed IFree IUse% Mounted on
/dev/xvda1     655360 648599  6761   99% /
udev            73474    377 73097    1% /dev
tmpfs           75538    254 75284    1% /run
none            75538      3 75535    1% /run/lock
none            75538      1 75537    1% /run/shm
bitnami@ip-10-132-190-144:~$ 

あぁ・・・。どうもあたりだったようです。話としては、iノードが不足するとファイルを作れなくなると聞いてましたが、まさか本当に起きるなんてびっくりです。

ということで、先に不要なパッケージを削除してみます。

bitnami@ip-10-132-190-144:~$ sudo apt-get autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
これらを直すためには 'apt-get -f install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 linux-headers-virtual : 依存: linux-headers-3.2.0-89-virtual しかし、インストールされていません
E: 未解決の依存関係があります。-f オプションを試してください。
bitnami@ip-10-132-190-144:~$ 

ところが、現時点ではカーネルヘッダのインストールに失敗した状態なので、依存性エラーになってしまってます。

仕方ないので、まずは手作業で不要なカーネルヘッダのパッケージを削除します。古いlinux-headers-3.2.0-xx および linux-headers-3.2.0-xx-virtual あたりをいくつか消します。

bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-3.2.0-60-virtual linux-headers-3.2.0-60 
(データベースを読み込んでいます ... 現在 567894 個のファイルとディレクトリがインストールされています。)
linux-headers-3.2.0-60-virtual を削除しています ...
linux-headers-3.2.0-60 を削除しています ...
bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-3.2.0-61-virtual linux-headers-3.2.0-61 
(データベースを読み込んでいます ... 現在 545865 個のファイルとディレクトリがインストールされています。)
linux-headers-3.2.0-61-virtual を削除しています ...
linux-headers-3.2.0-61 を削除しています ...
bitnami@ip-10-132-190-144:~$ 

若干ですが、iノードの空きも増えました。

これで、修復をしてみます。

bitnami@ip-10-132-190-144:~$ sudo apt-get -f install
(略)
linux-image-virtual (3.2.0.89.103) を設定しています ...
linux-headers-3.2.0-90 (3.2.0-90.128) を設定しています ...
linux-headers-3.2.0-90-virtual (3.2.0-90.128) を設定しています ...
dpkg: 依存関係の問題により linux-headers-virtual の設定ができません:
 linux-headers-virtual は以下に依存 (depends) します: linux-headers-3.2.0-89-virtual ...しかし:
  パッケージ linux-headers-3.2.0-89-virtual はまだインストールされていません。
dpkg: linux-headers-virtual の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
エラーメッセージは前の失敗から続くエラーであることを示しているので、レポートは書き込まれません。
                                                                                                dpkg: 依存関係の問題により linux-virtual の設定ができません:
 linux-virtual は以下に依存 (depends) します: linux-headers-virtual (= 3.2.0.89.103) ...しかし:
  パッケージ linux-headers-virtual はまだ設定されていません。
dpkg: linux-virtual の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
エラーメッセージは前の失敗から続くエラーであることを示しているので、レポートは書き込まれません。
                                                                                                linux-libc-dev (3.2.0-89.127) を設定しています ...
以下のパッケージの処理中にエラーが発生しました:
 linux-headers-virtual
 linux-virtual
E: Sub-process /usr/bin/dpkg returned an error code (1)
bitnami@ip-10-132-190-144:~$ 

あれ?やはりエラーになりました。

どうも、最初にセキュリティアップデートでインストールに失敗したバージョンの linux-Headers が正しく設定されていないようです。

なので、それぞれのパッケージをインストールしようとしたのですが、

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89-virtual 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 linux-headers-3.2.0-89-virtual : 依存: linux-headers-3.2.0-89 しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。
bitnami@ip-10-132-190-144:~$ 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 linux-headers-virtual : 依存: linux-headers-3.2.0-89-virtual しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。
bitnami@ip-10-132-190-144:~$ 

だめでした。

で、途方にくれて、ネットを調べていると、似たようなカーネル関係でトラブッてる話題がありました。

12.04-server update failure after full /boot, apt not working, unmet dependencies to non exiting linux-image kernel

一旦、先に linux-virtual や linux-headers-virtual を削除すればいいようです。

やってみます。

bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-headers-virtual 
(データベースを読み込んでいます ... 現在 545884 個のファイルとディレクトリがインストールされています。)
linux-headers-virtual を削除しています ...
bitnami@ip-10-132-190-144:~$ sudo dpkg --purge linux-virtual 
(データベースを読み込んでいます ... 現在 545881 個のファイルとディレクトリがインストールされています。)
linux-virtual を削除しています ...
bitnami@ip-10-132-190-144:~$ 

次に、足りないパッケージをインストールします。

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-3.2.0-89-virtual 

問題なくインストールできました。

再度インストールします。

bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-headers-virtual 
bitnami@ip-10-132-190-144:~$ sudo apt-get install linux-virtual 

これで、正しくインストールできたはずです。念のため、修復も試しておきます。

bitnami@ip-10-132-190-144:~$ sudo apt-get -f install 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  linux-image-3.2.0-76-virtual
(略)
  linux-headers-3.2.0-65-virtual
これらを削除するには 'apt-get autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 177 個。
bitnami@ip-10-132-190-144:~$ 

特に変更作業も発生しないので、問題なさそうです。

一旦ここで、再起動してみます。

bitnami@ip-10-132-190-144:~$ uname -r
3.2.0-90-virtual
bitnami@ip-10-132-190-144:~$ 

無事カーネルもアップデートされたようです。

最後に、今後のために不要なパッケージを削除しておきます。

bitnami@ip-10-132-190-144:~$ sudo apt-get autoremove --purge

めでたしめでたし。

 

ちなみに、autoremove を呼び出す際に、 --purge をつけないと設定ファイルが残ってしまいます。この場合、dpkg --list で見ると、先頭2文字が rc になってます。この状態を解消するには、 dpkg --purge パッケージ名 などを使って削除してください。

dpkg -lの[rc]について