2016年11月24日

ブロードバンドタワーで Scality RING を担当しているポールです。

今回のブログは RING そのものではなく小ネタなのですが、お付き合いください。

弊社の RING 検証環境(PoC環境)では、物理サーバに Linux (CentOS) ではなく、ESXi をインストールすることがあります。ESXi の用途としては Supervisor の仮想化や、作業用の Windows 仮想マシンの動作がメインですが、RING に負荷をかけるアプリケーションサーバを用意する際にも使用しています。

そのような検証が複数同時期に走りますので、スケジュールに応じて物理サーバを割り当てる必要があり、サーバが動作する OS を固定してはいません。そのため Linux か ESXi を都度 kickstart を使って再インストールしています。この kickstart インストールの際に問題が発生しました。

Linux で動いていたサーバに Linux もしくは ESXi をインストールするのは問題ないのですが、ESXi で動いていたサーバに Linux をインストールしようとすると、エラーでインストールが止まってしまうというものです。

エラーのスクリーンショットを取り損ねていて申し訳ないのですが、CentOS6 インストーラ画面には次の文字列が出ていました。

specified unpartitioned disk sda in partition command

パーティション作成に関わる部分で失敗しているのはわかりますので、念のため問題の切り分けで、ESXi が動作していたサーバへ Linux を対話式でインストールしてみました(このことが後に災いになるとは気がつかずに)。対話式ならば問題なくインストールできて、再起動後も普通に Linux が起動してきます。ということは、Linux インストーラの機能には不足はなく、使用していた Linux 用の kickstart スクリプトの記述に何か原因がある、ということになります。

判明した kickstart スクリプトの原因箇所は、この部分です。

clearpart --linux --drives=sda

次のように修正する必要がありました。

clearpart --all --drives=sda

元の記述では、Linux で使用していたパーティションだけを削除するので、Linuxが動いていたサーバに Linux を上書きインストールする分には問題ないのですが、ESXi で使用していたパーティションは削除してくれません。その結果、Linux インストーラは sda 上にパーティションを作成することができず、インストールが終了します。

では、なぜ元の記述はそのようになっていたのでしょうか?

理由を紐解くと実に単純なことでした。kickstart スクリプトを仮想マシンで開発していたからです。

通常、仮想マシンには ESXi や Windows を Linux に対して上書きでインストールすることはありません。別の OS を用意するときは別の仮想マシンを新規で作りますから、Linux が動いていた仮想マシンに Linux を上書きインストールする状況しか発生しないのです。ということで、仮想マシンで開発した kickstart を物理サーバで使ったため、仮想サーバでは発生しない不都合が出てきたのでした。

めでたしめでたし。。。となればよいのですが、実はこの切り分け時に、もう1つのはまりポイントを踏み抜いていました。

Linux の対話式インストールを試していたときに、物理サーバの仮想メディア機能を使って ISO ファイルをマウントしていたのですが、仮想メディア機能を有効にしたまま kickstart によるインストールを行うと、CentOS インストーラが次のエラーをだす場合があります。一度このエラーを出すようになってしまうと、極めて再現性が高いため何度インストールを試しても遭遇します。
partitioning_error

インターネット検索にヒットさせるため、文字列を一部抜き出しておきます。

anaconda 13.21.254 exception report
Traceback (most recent call first):
  File "/usr/lib/anaconda/storage/partitioning.py", line 1069, in allocatePartitions
      disklabel = disklabels[_disk.path]
  File "/usr/lib/anaconda/storage/partitioning.py", line 980, in doPartitioning
      allocatePartitions(storage, disks, partitions, free)

想像力のあるかたはもう答えに辿り着いているかもしれませんね。どういうわけか、HDD ではなく、仮想メディアで接続していた CentOS の ISO ファイルを sda として認識してしまい、sda にパーティションを作成できないためにエラーになったと考えられます。とはいえ、私も最初は上記の clearpart 問題と混同してしまい、clearpart –all に変更してもダメなのか? こうなったら対話式インストールをするしかないのか?とあきらめかけたのですが、画像に出てくる文字列でインターネット検索すると、同じ問題にぶつかったかたがいて、仮想メディア機能が原因であることがわかりました。仮想メディアを無効にすると、問題なくインストールできます。(この場合、インストール媒体は TFTP を使用してネットワーク越しに接続しています)

そこそこの文量になってきたので無理矢理まとめますが、本件は、仮想マシンで開発したものを物理サーバに反映させると未知の現象が起こる、という1つの例だと思います。両者は全く同じようで、完全に同じではないのですね。そしてよくある話として、切り分け中に別の問題を踏み抜くと問題がより複雑になります。

上記が皆様の参考になれば幸いです。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: ポール

ブロードバンドタワーで Scality RING を担当。ストレージ業界の知り合いからはポールと呼ばれているが、本人も由来はよくわからない。得意領域はデータベースとストレージ。