現象
Cobblerを使用してPXEブートでCentOS 6.6(64-bit)をインストールしようとしたが、インストール途中で次のようなメッセージが出力され、インストールに失敗した。
A fatal error occurred when installing the <rpm.hdr object at 0x(16進数のアドレス)> package. This could indicate errors when reading the installation media. Installation cannot continue.
本件はバグ報告も行われている。
http://bugs.centos.org/view.php?id=8171
今のところわかっていることは以下の通り。
- この現象を引き起こす原因はCentOS 6.6のupdatesリポジトリにあるglibcパッケージである。
- この現象は公式ミラーのupdatesリポジトリを使っても、ローカルにupdatesリポジトリのミラーを作って使っても発生する。ローカルに作ったミラーからglibcパッケージを削除してcreaterepoし直すと発生しなくなる。
- Web上ではCobblerを使ってる人だけが報告しているように見えるのでCobblerが原因の一端を握っている気はする。ただし、私が管理しているCobblerは4台あるが、そのうちこの現象が起こっているのは1台だけである。
- 問題が発生している1台と、発生しない残りとの違いは不明である。
- 問題が発生している1台では、上記の通りローカルに作ったミラーからglibcパッケージを削除したり、あるいはupdatesリポジトリをCobblerプロファイルから外したりしない限り、CentOS 6.6インストール時に必ずこの問題が発生する。
ワークアラウンド
どうやら同じ名前のrepo行がkickstartファイル内にあると上にある方が有効になるようなので、今のところ以下のようなワークアラウンドで対応している。
Cobblerの/var/lib/cobbler/kickstarts/sample.ksなどのkickstartテンプレートファイルに、リポジトリ追加を行ってくれる「$yum_repo_stanza」という部分がある。
この部分はcurl http://(Cobbler機のホスト名)/cblr/svc/op/ks/profile/(Cobblerプロファイル名)
、あるいはCobbler機上でならcobbler profile getks --name (Cobblerプロファイル名)
を実行すれば数行の次のようなrepo行として展開されていることがわかる。
(この例はリポジトリでMirror locallyが有効になっている場合だが、無効であったとしてもこの後やることは変わらない)
repo --name=(リポジトリ名) --baseurl=http://(Cobbler機のホスト名)/cobbler/repo_mirror/(リポジトリ名)
このうちupdatesリポジトリの行をコピーし、オプションとして「–excludepkgs=glibc」を付加したものを、kickstartテンプレートファイルの「$yum_repo_stanza」の前に追加してやる。
よってkickstartテンプレートファイルには次のような箇所ができる。
repo --name=(リポジトリ名) --baseurl=http://(Cobbler機のホスト名)/cobbler/repo_mirror/(リポジトリ名) --excludepkgs=glibc
$yum_repo_stanza
これでglibcはupdatesリポジトリからではなくbaseリポジトリからインストールされる。
しかしGHOST脆弱性もあるのでglibcは最新にしておきたい。
なのでkickstartテンプレートファイルの%postの「$yum_config_stanza」(これは/etc/yum.repos.d内にcobblerに設定されたリポジトリが書かれたファイルを配置する)以降に以下を追加する。
yum update glibc -y
これでとりあえずは問題ない。
この対応で得た知識
- 同じ名前のrepo行がkickstartファイル内にあると、上にある方が有効になる。
- RHELのドキュメントには書かれていないが、kickstartのrepo行にはexcludepkgsオプションが使用できる。こちらのドキュメントで見つけた。
- OSに近い部分での怪しい挙動についてはCentOSのバグ報告を先に参照しておくべきだった。参照しなかったばっかりにupdatesリポジトリ内を手動二分探索でどのパッケージが原因かを探す羽目になった。