現象

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リポジトリ内を手動二分探索でどのパッケージが原因かを探す羽目になった。
TOP