サーバーが壊れたのがもう2週間近く前。
元々仮想マシンを使って故障に耐えられるようにしていたので、とりあえず急場はしのいだ。
でも、新しいマシンを買っておかないと、次の故障に耐えられない。
マシンを選定して、組み始めたのがちょうど1週間前。
悪戦苦闘して、やっと Xen のインストールまで進んだ、と書いたのが4日前。
4日開いたのは、その後予想外の困難にぶつかり、悪戦苦闘していたから。
原因は2つあって、CentOS5 + Xen3 と CentOS6 + Xen4 では、環境設定方法が違っている、というのが1つ。
もう1つは、非常に恥ずかしいケアレスミスだったのだけど、ケアレスミスであるがゆえに原因になかなか気づかず、解決に3日かかってしまった。
#うち1日は仕事の都合でほとんど何もしていないのだけど。
結果として、「土台」となる物理マシンは設定が異なるが、実際に重要である仮想マシンは全くそのままの設定で引っ越しができた。
まず、環境設定方法が違っている、という話を書こう。
Xen は、仮想化ソフトの革命だった。
何がどう革命だったかの説明を書こうとしたのだけど、100行以上かかってしまうので割愛することにした。
興味ある人は自分で調べて。
少しだけ書いておけば、Xen 以前のソフトは、正しく PC をエミュレートしたけど、Xen はそうしない。
正しいエミュレートは非常に重い処理で、わざわざそんな重い処理をしないでも良い、という方法を示したのが Xen の功績の一つだ。
もう一つ、Xen は「正しいエミュレート」をする際に、CPU がどんな機能を持っていれば重くならないで済むかを示した。
これにより、Intel も AMD も仮想化支援技術を実装した。
その結果、Xen はライバルをたくさん生み出すことになった。
KVM をはじめとする多くのソフトは、Xen が「仮想化支援技術」を示したことにより生み出されたものだ。
Xen は PC をエミュレートする技術だけど、PC が単体で置いてあっても、現代ではあまり意味をなさない。
ネットワークにつながなくちゃ。
ここからやっと CentOS5 + Xen3 と CentOS6 + Xen4 の環境の違いの話になる。
CentOS6 + Xen4 をインストールしたら、まず現在動いている仮想サーバーが、新しい環境でそのまま動くか試そうとした。
まず、設定ファイルとディスクイメージを持ってくる。
そして、設定ファイルの「ディスク」などの位置を書き換え。
ディスクの中にある、IP アドレスも書き換え。同じ IP アドレスのマシンを2台起動したらおかしくなるからね。
満を持して、起動!
…xenbr0 がない、と言われる。
これ、仮想的な「ハブ」だ。新しいマシンは xenbr0 に仮想的に接続され、通信可能となる。
設定ファイルを書き換え、通信しないようにすると、xenbr0 がなくても起動できる。
でも、当然通信できない。意味がない。
xenbr0 は、Xen 環境が起動するとき(仮想環境の起動ではなく、実マシンの起動時)に用意されるようだ。
その裏で何をやっているかなどを書いたページが、世の中にはたくさんある。
それらを参考に手動で準備しようとしてもエラーになり、準備できない。
それらを参考に設定ファイルなどを書き換えてもうまくいかない。
何度も試行錯誤し、情報を探しているうちに、CentOS6 + Xen4 では、従来の方法で xenbr0 が用意できない、ということを論理的に書いてあるページを発見。
その人も困って調べたことを書いているのだけど、そのページには「解決策」までは示されていなかった。
そもそも、調査しても多くのページは、CentOS5 + Xen3 環境のことを書いている。
CentOS は RedHat Enterprise Linux (RHEL) というパッケージの「クローン」なのだけど、RHEL 6 では Xen をサポートしないからだ。
CentOS 6 は、クローンなので RHEL 6 と同じパッケージ。標準では Xen は入れられない。
でも、公式サポートしていて、すごく簡単な手順で入れられる。
とはいえ、標準では入らないので「使えない」と考える人、使えたとしても将来性がないと考える人が多く、CentOS6 + Xen4 について書かれたページはわずかしかない。
また、後で書くけど、入るのはソフトウェアのみで、環境設定は自分でやらなくてはならない。
#現実に、CentOS 7 ではまだ Xen がサポートできていない。サポートのための準備は1年以上続けているようだけど。
前回の日記に書いたけど、一度 CentOS 7 を入れてみたうえで、Xen が入らないので CentOS 6 に入れ直した。
CentOS5 + Xen3 の頃は、ネットワーク環境を整えるのが大変だった。
色々と工夫して、仮想的なハブを用意し、仮想的なネットワークカードにつないで動いていた。
具体的にいえば、実マシンのイーサネットポート 0 番 (eth0)は、Xen の起動時に peth0 と名前を変えられる。
(p は Physical …物理的な、という意味)
そして、新たに仮想的な eth0 が用意される。OS から見ると、とにかく通信したいときは eth0 を使えばよいので混乱はない。
eth0 と peth0 の間には、仮想的なハブ(ブリッジ)である、xenbr0 が用意される。
ここまでが「Xen 環境の起動時」に行われる作業だ。
続いて、仮想マシンを起動すると、仮想的なネットワークインターフェイスが作られる。
いわゆる、ネットワークカード、イーサネットポートだな。
Virtial InterFace なので vif と呼ばれる。
そして、vif と xenbr0 が接続される。
現実ならイーサネットケーブルなどで接続するのだけど、仮想環境には仮想ケーブルは存在せず、ただ論理的に接続される。
仮想環境で OS が起動すると、vif を見つけて、eth0 と名前を付ける。
これは、仮想環境の eth0 ね。実マシンの eth0 、peth0 とは違うもの。
ややこしいので確認し直すと、実マシンは仮想的なハブを用意して、実マシンのネットをハブにつなぎかえる。
仮想マシンを起動すると、仮想ハブに接続される。
ともかく、新しいマシンを用意して、ハブにつないだらネットできるようになる。
これを実現するために、ややこしい操作をしているわけだ。
CentOS6 + Xen4 になって、カーネル内部にハブを用意する機能が準備された。
Xen だけでなく KVM などもサポートするために、必要な機能をカーネルが用意したんだ。
このとき、接続方法が CentOS5 + Xen3 とは少し異なる。
Xen3 では、先に書いたネットワークつなぎ変えの仕組みなどを、Xen の設定ファイルに書いた。
でも、Xen4 では、カーネルの機能になったので、システムの起動設定に書く。
具体的には、CentOS6 の公式ページを見るといいだろう。
この方法だと、eth0 に IP アドレスが付かない。
実マシンの IP アドレスは xenbr0 につけられる。
eth0 がマシンのアドレスだ、と思っていたので、ちょっと気持ち悪い。
route コマンドでルーティングの設定を見ると、すべてのパケットが xenbr0 に向いているはずだ。
普通なら、すべてが eth0 に向く。
そして xenbr0 は eth0 にもつながっているし、ハブなのだから接続している他の仮想マシンにも通信できる。
何の問題もない。eth0 がマシンのアドレス、という先入観は忘れ去ろう。
Xen4 のやり方だと、peth0 などは出てこない。ややこしさがずっと少ない。
でも、この設定方法にたどり着くのに(公式ページに書かれているにもかかわらず)1日かかった。
単純に移行したいだけだから、つい Xen3 と同じ設定でやってしまおうとしたんだ。
でも、Xen4 では、Xen3 と全く同じ方法でネットワーク環境を整えることはできない。
環境設定スクリプトなどの動作が変わって、公式に「できない」ようになっているんだ。
#でも、同じスクリプトファイルは残っている。使おうとするとエラーになるだけだ。
これが余計に混乱に拍車をかけ、解決に1日かかる結果となった。
Xen4 の名誉のために書いておけば、これは意地悪で残してあるのではなく、CentOS6 以外の環境では使う場合もあるのだ。
さて、これで xenbr0 を用意できた。
再び仮想サーバーを起動。
今度こそ、ネットワークにつながった。
…が、様子がおかしい。つながってはいるのだけど、動きが…なんというか、こう、「ぎくしゃくと」している。
ping を打つと、5秒間何も表示されず、その後連続して成功ステータスが帰ってきたり。
かと思えば、ほぼ同じ状態で 100% loss だったり。
ssh で別マシンから入って作業していることもあり、操作不能になることもある。
最悪の場合、一番近くにある物理ハブがおかしくなってしまい、そこに接続しているマシンすべてが通信不能になった。
何かおかしい。通信経路がループしているような感じだ。
でも、調べてもループしてはいない。
これで悩み続けた。
xenbr0 の作り方は、CentOS6 標準の方法以外にもいくつかある。
それを試してみたり、vif の作り方がほかにないか調べてみたり。
新たな仮想マシンを作ってみると、正しく動く。
ただ、これは CentOS6 + Xen4 の中に CentOS6 を入れたものだった。
CentOS5 だとダメだったりするのかな、と思って入れてみると、これも大丈夫。
世の中にはあまり記事がないのだけど、CentOS5 + Xen3 から CentOS6 + Xen4 に引っ越しできた、という記事も読み漁った。
ディスクイメージのコピーの際におかしくなったかもしれない、と再コピーも試みた。
yum update もしてみた。定期的にやっているので、特に新しいファイルはなかった。
都合2日くらい悩んだ。
で、先ほど、急に気づいた。
IP アドレスは付け替えたけど、MAC アドレスそのままじゃん…
仮想サーバーの起動設定ファイルの vif 項目に、仮想の MAC アドレスを書く必要がある。
MAC アドレスというのは、インターフェイスカードごとに違う一意の ID ね。
IP アドレスは付け替えられるけど、MAC アドレスはハードウェアごとに決まっている、というのが前提。
これで、ネットワーク上の「住所」が一意に決まることを保証している。
だから、すでに起動しているサーバーの設定をコピーして IP アドレスを付け替えるのであれば、MAC アドレスも一緒に変えないといけなかった。
#一意に決まらないといけない MAC アドレスを自由に書き換えてしまえていいのか、とは思うのだけど、
一応 Xen では「未知のカードとぶつからないように」工夫はされている。
仮想サーバー同士は「未知」ではなく、設定者にとって「既知」のはずなので、設定者が責任を持たないといけない。
言い訳すると、vif 設定はいろいろ変えてみていた。
設定の中身が空っぽでも動くはずなので、それも試した。
空っぽなら xenbr0 に接続し、MAC アドレスはランダムに発行されるはず…なのだけど、このときはネットワーク接続に失敗した。
失敗したから「元の設定のままじゃないとダメだな」と戻してしまい、さらに「ここは手を付けちゃだめだ」と考えてしまった。
vif 設定の MAC アドレスを変更し、仮想サーバーのディスク上でも、eth0 が使用する MAC アドレスを同じものに変更する。
これで起動すると、何の問題もなく起動できた。
長かったけど、これでやっと新サーバーが準備できた。
実際の仮想サーバーの移行は、またタイミングを見て行う。
特に、公開サーバーはメールなどにも使っているからね。
追記:翌日19日の朝、新サーバーに入れ替えました。
用意周到にやったのでダウンタイムは1分以内。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |