Amazon Linux で yum.conf に installonlypkgs を正しく設定しないと kernel update で問題が発生する
Amazon Linux 2014.03 の kernel update 時に instance が起動しなくなる問題の対処法 - tkuchikiの日記
の続編です。
この現象を確認したのは、
Amazon Linux 2012.03, 2012.09, 2013.03, 2013.09, 2014.03, 2014.09 です。
2012.03 よりも前のバージョンについては確認しておりません(Community AMIs から探せませんでした)。
問題
yum upgrade kernel したときに、
grubby fatal error: unable to find a suitable template grubby: doing this would leave no kernel entries. Not writing out new config.
という不穏なエラーメッセージがでて /etc/grub.conf が更新されず、
そのまま reboot すると再起動時に boot しないというものです。
解決方法
解決方法としては、yum.conf に
installonlypkgs
を設定しないか、適切に設定する必要があります。
installonlypkgs はデフォルトでは、以下が設定されています。
installonlypkgs=kernel, kernel-bigmem, kernel-enterprise, kernel-smp, kernel-debug, kernel-unsupported, kernel-source, kernel-devel, kernel-PAE, kernel-PAE-debug
ですので、installonlypkgs を設定したい場合は、
デフォルトの kernel-* を記述した上で、更に追記すると良いと思います。
ちなみに、今回の現象を発生させないだけであれば、
installonlypkgs=kernel
だけでも良かったのですが、
それなら最初から書かないほうが良さそうです。
考察
yum のバージョンに問題あるのかと思いましたが、
CentOS 6.4 の yum 3.2.29 と 3.4.3 で試した限りでは現象を再現できませんでした。
ただ、リビジョン?ビルドバージョン?までは揃えていないので、
検証結果としては信憑性が低いと思います
以下が、Amazon Linux のバージョンごとの、yum --version です。
2012.03
$ cat /etc/system-release Amazon Linux AMI release 2012.03 $ yum --version 3.2.29 Installed: rpm-4.11.2-2.58.amzn1.x86_64 at 2014-12-10 07:38 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2014-12-05 18:22 Committed: Ben Cressey <bcressey@amazon.com> at 2014-12-05 Installed: yum-3.2.29-22.21.amzn1.noarch at 2012-06-25 22:51 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2012-01-05 22:44 Committed: Cristian Gafton <gafton@amazon.com> at 2011-12-08 Installed: yum-plugin-fastestmirror-1.1.30-10.12.amzn1.noarch at 2012-06-25 22:51 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2012-01-05 22:47 Committed: Cristian Gafton <gafton@amazon.com> at 2011-12-08
2012.09
$ cat /etc/system-release Amazon Linux AMI release 2012.09 $ yum --version 3.2.29 Installed: rpm-4.11.2-2.58.amzn1.x86_64 at 2014-12-10 07:50 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2014-12-05 18:22 Committed: Ben Cressey <bcressey@amazon.com> at 2014-12-05 Installed: yum-3.2.29-30.24.amzn1.noarch at 2013-02-15 23:51 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2012-10-22 23:34 Committed: Cristian Gafton <gafton@amazon.com> at 2012-10-22
2013.03
$ cat /etc/system-release Amazon Linux AMI release 2013.03 $ yum --version 3.2.29 Installed: rpm-4.8.0-32.40.amzn1.x86_64 at 2013-05-09 20:03 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2013-02-27 21:43 Committed: Cristian Gafton <gafton@amazon.com> at 2013-02-25 Installed: yum-3.2.29-40.25.amzn1.noarch at 2013-05-09 20:03 Built : Amazon.com, Inc. <http://aws.amazon.com> at 2013-02-28 06:14 Committed: Cristian Gafton <gafton@amazon.com> at 2013-02-25
2013.09
$ cat /etc/system-release Amazon Linux AMI release 2013.09 $ yum --version 3.4.3 インストール: rpm-4.11.1-3.49.amzn1.x86_64 (日時: 2013-12-10 23:46) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2013-09-27 14:54) コミット : Ben Cressey <bcressey@amazon.com> (日時: 2013-09-27) インストール: yum-3.4.3-111.46.amzn1.noarch (日時: 2013-12-10 23:47) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2013-10-17 19:02) コミット : Andrew Jorgensen <ajorgens@amazon.com> (日時: 2013-10-11)
2014.03
$ cat /etc/system-release Amazon Linux AMI release 2014.03 $ yum --version 3.4.3 インストール: rpm-4.11.2-2.54.amzn1.x86_64 (日時: 2014-04-10 21:46) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2014-03-19 17:08) コミット : Andrew Jorgensen <ajorgens@amazon.com> (日時: 2014-02-25) インストール: yum-3.4.3-137.51.amzn1.noarch (日時: 2014-04-10 21:46) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2014-03-12 01:47) コミット : Ben Cressey <bcressey@amazon.com> (日時: 2014-03-12)
2014.09
$ cat /etc/system-release Amazon Linux AMI release 2014.09 $ yum --version 3.4.3 インストール: rpm-4.11.2-2.56.amzn1.x86_64 (日時: 2014-10-08 01:25) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2014-07-29 01:13) コミット : Lee Trager <ltrager@amazon.com> (日時: 2014-07-29) インストール: yum-3.4.3-137.51.amzn1.noarch (日時: 2014-10-08 01:25) 構築 : Amazon.com, Inc. <http://aws.amazon.com> (日時: 2014-03-12 01:47) コミット : Ben Cressey <bcressey@amazon.com> (日時: 2014-03-12)
0003813: YUM erase kernel\* removes running kernel, breaks grub, yum install kernel fails to reconfigure grub. - CentOS Bug Tracker
を見ると、kernel-xen で動いている環境で「grubby fatal error: unable to find a suitable template」
がでているようです。
Amazon Linux も Xen で動いているので、関係あるのかもしれないですが、
検証した Amazon Linux は HVM なので、違うような気もします...
まとめ
yum.conf の installonlypkgs は、挙動を正しく理解していない場合は(特に Amazon Linux では)、慎重に設定しなくてはならないということがわかりました。
今回、chef で installpkgsonly を設定する cookbook を書いていて、
installonlypkgs=
という設定で、yum.conf を生成してしまっていたためこのような現象が発生しました。
opscode-cookbooks/yum · GitHub などを使っている場合、
知らずに不適切な設定をしている可能性があるのでご注意ください(この cookbook を使って問題があったわけではありません)。
yum でインストールした rpm がどの repository のものか調べる
インストール済みの rpm がどの repository のものかは、yumdb コマンドで調べられます。
YumDB - yum - Trac に詳しく書いてありますが、
$ yum install -y yum-utils
して、yumdb コマンドを入れたあとに、
$ yum search from_repo REPO_NAME
で以下のような結果を得られます。
$ yumdb search from_repo epel Plugin "replace" can't be imported Loaded plugins: fastestmirror, remove-with-leaves GeoIP-1.4.8-1.el6.x86_64 from_repo = epel GeoIP-devel-1.4.8-1.el6.x86_64 from_repo = epel PyYAML-3.10-3.el6.x86_64 from_repo = epel ...
from_repo 以外にも以下の key が使えるようです。
- checksum_data
- checksum_type
- command_line
- from_repo_revision
- from_repo_timestamp
- reason
- releasever
- installonly
それぞれの key については man を参照してください。
ただし、
Since yum 3.2.26 yum has started storing additional information about installed packages in a location outside of the rpmdatabase.
とあり、
yum の version が 3.2.22 な CentOS 5 では使えないようで、
yum-utils を install しても yumdb コマンドは install されませんでした(確認した CentOS 6 は 3.2.29)。
yum の設定ファイルの行頭に余分なスペースをつけてはいけない
chef で、yum.conf の設定を、していたら
'1h\ninstallonly_limit = 5': invalid value
のようなエラーが出力されて、
一見おかしなところが見当たらなくて、??? となっていた。
設定ファイルをよくみてみると、行頭にスペースが。
これを消したら、エラーも消えた。
yum.conf がなるなら他のもだめかな、と思って試してみたところ案の定ダメだった。
以下のような感じ(CentOS-Base.repo で実験)。
Config Error: File contains parsing errors: file://///etc/yum.repos.d/CentOS-Base.repo
エラーメッセージの系統は違う模様。