プログラマーのメモ書き

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

ディスク使用量を監視する

もともと、redmineを運用していたサーバーのディスク空き容量が厳しかったので、ディスク使用量を監視しようと思ってました(まあ、その設定をしようとサーバーをみたら、『[Ubuntu] unattended-upgrade 実行失敗と復旧』で書いたように痛い目にあってしまいましたので、なおさら必然性がでてしまったのですが・・・)。

で、『[Ubuntu] unattended-upgrade の通知設定』で書いたように既にメール設定を導入したので、自分でディスク使用量の監視スクリプトとcronを書けば事足りるのですが、CloudWatch を使いたいというのがあったので、今回はこちらで実現しました。

EC2だと、CloudWatch を使えば、いくつかの指標(メトリックス)に関しては、デフォルトかつ無料(5分単位の監視の場合)で利用可能なのですが、デフォルトで提供されているものには、ディスク使用量は含まれていません。

ちょっと調べてみると、Amazon CloudWatch Monitoring Scripts for Linux を使えば簡単にディスク使用量の監視をカスタムメトリックスとして CloudWatch に追加できるようです。

以下の作業はこちらの記事を参考にさせていただきました。

CloudWatchでEC2のディスク容量のチェックをおこなう

準備

説明ページあるように、必要なパッケージをインストールしておきます。

bitnami@ip-10-132-190-144:~$ sudo apt-get install libwww-perl libdatetime-perl

 問題なくインストールできれば、準備完了です。

CloudWatchの設定

インストールはスクリプトファイルをダウンロードして、設置すれば終わりです。

bitnami@ip-10-132-190-144:~$ wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
bitnami@ip-10-132-190-144:~$ cd /usr/local/bin
bitnami@ip-10-132-190-144:/usr/local/bin$ sudo unzip /home/bitnami/CloudWatchMonitoringScripts-1.2.1.zip 
bitnami@ip-10-132-190-144:/usr/local/bin$ 

試してみます。ここで、認証情報は、AWS_ACCESS_KEYとAWS_SECRET_KEYに入っているとしています。

--verifyオプションをつけると、実際にメトリックスを送信することなく、認証を含めて指定の値がとれるか確認します。これで、問題なければ、下記のように表示がされます。

bitnami@ip-10-132-190-144:/usr/local/bin/aws-scripts-mon$ ./mon-put-instance-data.pl --disk-space-avail --disk-path=/ --verify --verbose --aws-access-key=${AWS_ACCESS_KEY} --aws-secret-key=${AWS_SECRET_KEY}   
DiskSpaceAvailable [/]: 4.74913787841797 (Gigabytes)
Endpoint: https://monitoring.ap-northeast-1.amazonaws.com
Payload: {"MetricData":[{"Timestamp":1442134385,"Dimensions":[{"Value":"/dev/xvda1","Name":"Filesystem"},{"Value":"xxxxxxxxxx","Name":"InstanceId"},{"Value":"/","Name":"MountPath"}],"Value":4.74913787841797,"Unit":"Gigabytes","MetricName":"DiskSpaceAvailable"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}

Verification completed successfully. No actual metrics sent to CloudWatch.

bitnami@ip-10-132-190-144:/usr/local/bin/aws-scripts-mon$ 

問題無いようですね。

ちなみに、ここで使用した認証情報に対応する、IAMユーザーは、AmazonEC2FullAccess をポリシーとして持っています。このポリシーの詳細を表示してみると、

f:id:junichim:20160825154800p:plain

のようになっているので、デフォルト状態で、CloudWatchの権限があることがわかります。

それでは、cronから呼び出すようにします。cron から呼び出す場合は、--from-cron オプションを設定してください。

bitnami@ip-10-132-190-144:/etc/cron.d$ cat ec2_monitor_cloudwatch 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

# m h dom mon dow user  command
*/5 * * * * root /etc/ec2/ec2-cloudwatch.sh
bitnami@ip-10-132-190-144:/etc/cron.d$ 

さきほどコマンドラインから実行した内容は、ec2-cloudwatch.sh にまとめています。

bitnami@ip-10-132-190-144:/etc/ec2$ cat ec2-cloudwatch.sh 
#!/bin/bash
#
# monitor some metrics and push to CloudWatch
#
# writen by Junichi MORI, 2015/9/13

EC2_ENV=/etc/ec2/bash_ec2env

. ${EC2_ENV}

MON_DIR=/usr/local/bin/aws-scripts-mon
MON_SCRIPT=mon-put-instance-data.pl

${MON_DIR}/${MON_SCRIPT} --disk-space-avail --disk-path=/ --aws-access-key=${AWS_ACCESS_KEY} --aws-secret-key=${AWS_SECRET_KEY} --from-cron
bitnami@ip-10-132-190-144:/etc/ec2$ 

認証情報は、EC2_ENV で指定しているファイルで設定しています。

確認

しばらくすると(5分以上)待って、AWSコンソールからCloudWatchを開くと、『メトリックス』に『Linuxシステム』というのが追加されています。

アラームの設定

CloudWatchでカスタムメメトリックスを設定したので、せっかくなので、アラームも設定してみましょう。

『AWSコンソール』から『CloudWatch』を開いて、ダッシュボード中の『アラームの作成』ボタンを押します。下記のようなアラームの設定画面が表示されるので、画面に従って、必要事項を入力していきます。

f:id:junichim:20160825154744p:plain

最初はアラームを設定するメトリックスを選択します。メトリックスを選択すると、アラーム定義画面に移ります。

f:id:junichim:20160825154745p:plain

始めに、アラームの名称・説明を入力し、次に、アラームの閾値を設定します。

f:id:junichim:20160825154748p:plain

この例の場合は、ディスクの残り領域が、4.7GB以下が1回連続した場合にアラームを発行するという基準にしています。

次に、アラームの閾値に対して、どのような行動を取るかを指定します。

『アラームが次の時』の意味は、対象となるメトリックスがアラーム閾値の条件を満たし場合が『警告』、満たさない場合が『OK』になります。『不足』はメトリックスが取得できていないなどの状態です。

『警告』を選択すると、アラームが閾値を満たした場合(上記の場合だと、ディスクの残り容量が4.7GBを切ったとき)に通知が飛びます。同じ閾値に対して『OK』を選択すると、ディスクの残り容量が4.7GBより大きい場合に通知が発行されます。

f:id:junichim:20160825154749p:plain

『通知の送信先』には、アラーム基準を満たした場合の通知先を入力します。ただし、この欄は、Amazon SNS のトピックとして入力する必要があります。

まだ、SNSを設定していない場合は、『新しいリスト』を選択します。すると、

f:id:junichim:20160825154751p:plain

のように、『メールリスト』欄が現れます。

この『メールリスト』欄に、送信先のメールアドレスを入力します。さらに、『通知の送信先』にSNSのトピック名を入力します。今回は新規での作成になるため、トピック名としては(使える文字・記号と文字列の長さは守る必要がありますが)任意の文字列を指定すればよいと思います。

メールアドレスだけ指定すればいいと勝手に思い込んでいたもんで、実は、ここで結構はまりました。『通知の送信先』が空欄だと、『アラームの作成』ボタンを押しても、エラーとなり、そのエラーメッセージも文字種別の不正、のような内容のため、メールアドレスが間違っているのかと勘違いしてました。

問題なく入力できていると、入力したメールアドレス宛に、すぐに確認メールが送られます。こんな感じです。

f:id:junichim:20160825154752p:plain

メールに記載されているリンクをクリックすることで、メールアドレスが登録されます。画面もすぐに下記のように変わります。

f:id:junichim:20160825154754p:plain

問題なく設定できると、CloudWatchの画面で

f:id:junichim:20160825154756p:plain

こんな感じで、アラームが設定されたことがわかります。

なお、CloudWatchのアラームの作成については、こちらのリファレンスなどをご参考にしてください。ちゃんと読むとSNS設定のことなども載ってますね。

確認

では、実際にアラームを発生させてみます。

監視対象のサーバーにログインして、適当なファイルをコピーして、ディスクの空き容量を4.7GB以下にします。

すると、そのうち、

f:id:junichim:20160825154758p:plain

のように、設定したアラームがアラーム状態に変化します(紛らわしい・・・)。 メールも送られているはずなので、確認してみると、

You are receiving this email because your Amazon CloudWatch Alarm "LowFreeDiskSpace" in the APAC - Tokyo region has entered the ALARM state, because "Threshold Crossed: 1 datapoint (4.4244499206543) was less than or equal to the threshold (4.7)." at "Sunday 13 September, 2015 10:56:13 UTC".

View this alarm in the AWS Management Console:
https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#s=Alarms&alarm=LowFreeDiskSpace

Alarm Details:
- Name:                       LowFreeDiskSpace
- Description:                Low free disk space
- State Change:               OK -> ALARM
- Reason for State Change:    Threshold Crossed: 1 datapoint (4.4244499206543) was less than or equal to the threshold (4.7).
- Timestamp:                  Sunday 13 September, 2015 10:56:13 UTC
- AWS Account:                xxxxxxxxxxxx

Threshold:
- The alarm is in the ALARM state when the metric is LessThanOrEqualToThreshold 4.7 for 300 seconds. 

Monitored Metric:
- MetricNamespace:            System/Linux
- MetricName:                 DiskSpaceAvailable
- Dimensions:                 [Filesystem = /dev/xvda1] [InstanceId = xxxxxxxxxx] [MountPath = /]
- Period:                     300 seconds
- Statistic:                  Average
- Unit:                       not specified

State Change Actions:
- OK: 
- ALARM: [arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:ec2administrator]
- INSUFFICIENT_DATA: 

こんな感じのメールが送られていました。無事に監視できているようです。

その他

カスタムメトリックを利用するとCloudWatch の料金が発生しますが、CloudWatchの料金の説明を読むと、

新規および既存のお客様は、10 メトリックス(Amazon EC2 インスタンスまたはカスタムメトリックス、または CloudWatch Logs* の詳細モニタリングに適用)、10 アラーム、および 100 万の API リクエストを追加料金なしでご利用いただけます。

とあるので、10メトリックスまでなら無料で使えそうです。

また、SNS も料金の説明を読むと無料利用枠があるので、数個のアラームに使う分には追加料金も不要のようです。ありがたいことです。

あと、CloudWatch を少し触ってみた印象としては、サーバーの状態の中でも数値が刻々と変化していく指標に使うのが良さそうです。グラフィカルに変化を見ることができるので、これを利用しない手はないという印象です。もちろん、エラーの有無などをメトリックスにしてアラームを設定することも可能ですが、わざわざCloudWatchを使わなくても良さそうです。気になる指標が出てきたら、いろいろ追加して使ってみようと思います。

unattended-upgrade の通知設定

[Ubuntu] セキュリティアップデートの自動インストール』 でセキュリティアップデートを自動でインストールするようにしていましたが、こちらの記事『[Ubuntu] unattended-upgrade 実行失敗と復旧』で書いたように、ディスクフルでセキュリティアップデートに失敗することがありました。お恥ずかしい話ですが、ログを見ると一ヶ月ぐらい前に発生していました。

ということで、セキュリティアップデートに関する通知をメールで飛ばすようにしたので、まとめておきます。

 

準備

メールを送れる環境にしておく必要があります。

今回は、『[s3fs] s3fsが予期せずアンマウントされた場合への対策』で行ったのと同じように、ssmtp と mailutils を使った環境をセットアップしました。詳しい設定方法は、リンク先の記事をご覧ください。

 

設定方法

設定方法は、対して難しくなく、/etc/apt/apt.conf.d/50unattended-upgrades 設定ファイルにメールアドレスを記述するだけです。

unattended-upgrades パッケージインストール直後は、Unattended-Upgrade::Mail がコメントアウトされているので、通知をしたいメールアドレスを書き込むだけです。

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed.
Unattended-Upgrade::Mail "username@my_domain_name";

とりあえずセキュリティアップデートがかかった場合とエラー時にメールを受け取るようにしました。

エラー時のみでよい場合は、 Unattended-Upgrade::MailOnlyOnError をtrueに設定してください。

 

その他

Unattended-Upgrades にはいろいろと設定ができます。たとえば、

  • 適用するパッケージ種別の選択
  • 除外したいパッケージの指定
  • アップデート時の通知
  • エラー発生時のみ通知
  • パッケージのアップデートの自動再起動(デフォルトでは再起動されません)

などです。詳しくは、こちらの記事『Debian and Ubuntu Automatic Security Updates』などを参考にご自分の環境にあったセットアップを行ってみてください。

 

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]について