OpenVZの実行ガイド

Linux向け仮想化ソフトウェアの数ある選択肢の1つに、SWsoftが提供するVirtuozzoのフリーソフトウェア・コンポーネントOpenVZがある。OpenVZとVirtuozzoはOSレベルの仮想化ソリューションであり、サーバを複数の仮想プライベートサーバ(VPS)に分割することができる。OpenVZのマニュアルを最初から読むのは大変だろうから、ここではDebian Etchシステム上でOpenVZを使い始める簡単な方法を紹介しよう。

Virtuozzoについては、昨年Linux用のVirtuozzo 3.0のレビューを行い、それ以前のバージョンについてもデンバーにあるホスティング企業との仕事で実際に触れた経験があったのだが、私の懐具合ではVirtuozzoのライセンス購入は厳しい。その点OpenVZなら何の問題もない。

では、VMwareやXenよりもOpenVZを使うべきなのはどんなときだろうか。それは状況次第なのだが、複数のOSを実行する必要がなく単純に複数のゲスト環境を必要とするタスク群が存在する場合、最小限のオーバーヘッドで大部分のハードウェアをサービス間で分割(たとえば、Webサーバをファイルサーバ兼プリンタサーバから分離)するには、OpenVZが好ましいと言える。しかし、Linuxのホスト上でLinux以外のオペレーティングシステム(FreeBSDやWindows Serverなど)を実行したい場合は、OpenVZ(およびその商用版でプロプライエタリな拡張版であるVirtuozzo)ではなくVMwareを使う必要があるだろう。OpenVZでは複数のOSを実行できないためだ。

OpenVZは、その他の仮想化ソフトウェアよりも多くのプラットフォームをサポートしている。VMware ServerとXenが利用できるのはx86とAMD64だけだが、OpenVZのほうはx86、AMD64、Itanium(IA64)、PowerPC、UltraSPARCで利用できる。なお、今のところDebian用のビルド済みPowerPCカーネルは用意されていないが、PowerPCではOpenVZがサポートされている。

OpenVZのインストール

OpenVZのゲストシステムは、任意のホストシステム上で実行することができる。私はゲストシステムをDebian上で実行しているが、Ubuntu、Fedora Core、Gentooなど、OSテンプレートが用意されている任意のディストリビューションが利用できる。OSテンプレートは、VPSの設置に使われるパッケージの集合である。なお、OpenVZの用語ではVPSを仮想環境(VE)と呼んでいる。

OpenVZのゲストシステム用DebianカーネルはOpenVZのリポジトリから入手できるが、現状ではEtchのものしか存在ない。この登場したばかりのカーネルとlinux-headersパッケージをOpenVZのリポジトリから取得したら、dpkg -i linux-image-2.6.18-openvz-686_02_i386.deb dpkg -i linux-headers-2.6.18-openvz-686_02_i386.deb の実行によってインストールを行う。ただし当然のことだが、パッケージ名の部分はダウンロードしたファイルの名前で置き換える必要がある。パッケージのインストール時に「2つのシンボリックリンクが、存在しないディレクトリを参照しています」といったメッセージが現れるが、その後OpenVZの使用中に問題は起こっていないので、私が思うにその点は気にしなくてよさそうだ。

先ほどのカーネルとヘッダのインストールが終わったら、システムにOpenVZを実行させる準備として/etc/sysctl.confにいくつかのパラメータ(OpenVZのWikiに記載)を追加する必要がある。たとえば、VPSでもネットワーク構築が行えるようにシステム側でのIPフォワーディングの有効化が必要になる。そのためにはsysct.confに以下の行と同じものがあるかどうかを確認し、もしなければ追記すればよい。

net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0

カーネルのインストールと上記の変更が済んだら、システムをリブートする。これはGRUBメニューでOpenVZをデフォルトカーネルに設定する必要があるためで、リブートによってこの設定が行われる。

続いてapt-get install vzctlを実行してOpenVZの各種ユーティリティを取得する必要がある。この実行により、vzctlとvzquotaの両パッケージがインストールされる。これらのパッケージには(vzctlのような)OpenVZの管理に必要なユーティリティが含まれる。

こうしたユーティリティをインストールするとOpenVZがブート時に起動されるように設定されるが、今すぐにOpenVZを実行したければ、この時点でOpenVZを手動で立ち上げる(またはリブートを行う)必要がある。OpenVZを起動するには、次のinitスクリプトを実行すればよい。

/etc/init.d/vz start

ゲストシステムの設定

ここまでは順調だ。そろそろ、いくつかのテンプレート入手してゲストOSの設定に移るとしよう。OpenVZのダウンロードサイトには、Fedora Coreのいくつかのバージョン、Debian Sarge、Debian Etch、CentOS、Gentoo、Mandriva、OpenSUSEなど、あらかじめ作成されたOSテンプレートが存在する。ただし、テンプレートはプロセッサごとに異なるので、x86システム上で実行するのにAMD64やUltraSPARC用のテンプレートをダウンロードしたりしないように注意すること。

また、OpenVZコミュニティによるOSテンプレートが収められたcontribというディレクトリの存在にも気が付くだろう。これらは「公式な」テンプレートではないが、Ubuntu、Slackware、AltLinuxといったOpenVZによるテンプレートが見当たらないディストリビューションを実行する場合は、そちらを参照してほしい。

また、テンプレートが1つも存在しないディストリビューションを実行したければ、OpenVZ WikiでOSテンプレートの作成に関するドキュメントを参照するとよい。このあたりは、OpenVZがVMwareやその他一部の仮想化テクノロジに比べて劣っている点である。通常、VMware ServerまたはVMware WorkstationへのLinuxディストリビューションのインストールは、そのディストリビューションのインストール手順を実行するのと同じくらい簡単に行える。だがOpenVZの場合はより複雑で、ゲストOSを2つ実行したいだけでもOpenVZについて非常に多くのことを学ばなければならないのだ。

ダウンロードしたOSテンプレートは、/var/lib/vz/template/cacheに格納する必要がある。OSテンプレートはダウンロードした時点でgzip化されたtarファイルになっているが、展開する必要はなく、そのままにしておけばよい。

システムのセットアップにはvzctlユーティリティを用いる。だが残念なことに、vzctlユーティリティはVirtuozzoに付属のGUIツールに比べて格段に使いにくい。それでもvzctlを使うのがそれほど苦にならないのは、スクリプト化できるからであり、その点での自由度は非常に高い。多くのOpenVZシステムを管理していればすぐにvzctlの構文に慣れるだろうし、それほど頻繁にOpenVZのゲストシステムの作成や対処を行わないのならvzctlユーティリティのmanページから該当ページを探し出して必要なオプションを理解するのに法外な時間がかかるということもないだろう。では、非常によく使われるコマンドのなかでvzctlを見ていくとしよう。

ゲストシステムを作成する構文は、vzctl create vpsid --ostemplate ostemplatename のようになる。vpsidは新しいゲストシステムに割り当てる番号だが、100未満のID番号はOpenVZが内部使用のために確保しているので、私はIDをたいてい1001から割り振るようにしている。たとえば、x86用のDebian SargeのOSテンプレートをダウンロードした場合は、次のコマンドを実行する。

vzctl create 1001 --ostemplate debian-3.1-i386-minimal

ゲストシステムの設定が終わると、--rootまたは--privateオプションを使ってデフォルトの設定を変えていない限り、ゲスト側のファイルシステムが/var/lib/vz/root/vpsidとプライベート領域である/var/lib/vz/private/vpsidにできているはずだ。プライベートディレクトリのほうには、この仮想環境(VE)に固有のファイル群が含まれている。

したがって、ID番号1001としてゲスト環境を作成すると、そのルートファイルシステムの場所は/var/lib/vz/root/1001になる。これは、何らかの理由でファイルへの直接アクセスが必要な場合に便利なことがある。たとえば、ゲスト環境の管理者により、通常はゲスト環境をブートしないように設定されている場合や、バックアップを行う場合などである。

今度はネットワークの設定を行う。これもそれほど難しくはなく、次のように実行すればよい。

vzctl set --ipadd ipaddr --nameserver nameserverIP --hostname hostname --save

--ipaddパラメータによってゲストOSの最優先venetインタフェースのIPアドレスが、–hostnameパラメータによってVPSのホスト名が、–nameserverパラメータによってプライマリネームサーバ名が、それぞれ割り当てられる。OpenVZのゲストシステムにデフォルトで用意されるvenetインタフェースはMACアドレスを持たないが、これは(何よりも)インタフェースのアドレスをDHCP経由で取得できないことを意味している。

ところが、OpenVZコミュニティの人々が生み出したvethという新しいインタフェースには、MACアドレスを持たせることができる。このvethデバイスを使えば、ユーザによるゲストOS内でのDHCPサーバの設置が可能になり、ユーザは独自のネットワーク設定を行うことができる。こうしたことはvenetデバイスでは不可能だ。これが望ましいことかどうかはまた別の問題だが、venetインタフェースではなくvethインタフェースを利用したければ、OpenVZ Wikiに記載されている設定手順を参照してもらいたい。

OpenVZの管理

VPSの設定が終わったら、続いてvzctl start vpsid の実行によってゲストシステムを起動する。vpsidにはゲストシステム作成時に割り当てたIDを指定する。

VPSの起動に関するいくつかのメッセージがコンソールに現れ、最後に「VPSを起動中…(VPS start in progress…)」と表示されるはずだ。vzlistコマンドを使えば、実行中のVPSを確認することができる。vzlistを実行すると、次のような出力が得られる。

VPSID      NPROC STATUS  IP_ADDR         HOSTNAME
 1002          4 running 10.0.1.34       vroomfondle

-aオプションを指定すると、実行中でないものも含めてすべてのVPSが表示される。VPSによるリソースの消費量を確認したいこともあるだろう。あるVPSが使っているメモリ容量を確認するには、vzcalc -v vpsid を実行する。すると、次のような出力が得られるはずだ。

Resource     Current(%)  Promised(%)  Max(%)
Low Mem          0.13       1.20       1.20
Total RAM        0.55        n/a        n/a
Mem + Swap       0.36       1.83        n/a
Alloc. Mem       0.67       1.83      13.82
Num. Proc        0.06        n/a       0.40
--------------------------------------------
Memory           0.67       1.83      13.82

指定したVPSによるメモリの現在の使用量および割り当て量、割り当て可能な最大量が示されている。

VPS関連のその他のパラメータは-oオプションを指定することで確認できる。詳細についてはvzcalcのmanページを参照してほしい。

デフォルトでは、システムのブート時にVPSは起動されないようになっている。ほとんどの状況では、システムの再起動後にVPSのロードを行いたいと思うだろう。vzctlを使って次のように実行すれば、この設定を変えることができる。

vzctl set vpsid --onboot yes --save

vzctlユーティリティは、メモリの総容量、各種CPUリソース、iptablesモジュールへのアクセスなど、システムパラメータの設定にも使える。いくつか例をお見せしよう。

OpenVZで不満に思うのは、「あるVPSに256MBを割り当てる」といった直接的な指定ができず、2つのパラメータを調整しなければならないことと、OpenVZによるメモリの処理方法を理解しようとするにはきわめて技術的な内容のドキュメントをいくつか読まなければならないことだ。

説明を簡単にするために、メモリ容量が最低256MB、最大1GBとなるVPSの設定方法を考えよう。この場合には、vmguarpages(VPSに対して割り当てが保証されるメモリ)およびprivvmpages (認められるメモリの最大容量)の各パラメータを設定すればよい。

vzctl set vpsid --vmguarpages 65536 --save
vzctl set vpsid --privvmpages 262144 --save

メモリの容量をわざわざ計算するのではなくもっと直観的に「ページ」単位でこの設定を行う別の方法がSWsoftのフォーラムに記されていた。設定したいメモリ容量(MB)に256をかけるだけで正しい値が得られるというものだ。

vzctl set vpsid --vmguarpages $((256 * 256)) --save
vzctl set vpsid --privvmpages $((256 * 1024)) --save

詳細については、vzctlのmanページやOpenVZ Wikiをはじめとするドキュメントを参照してほしい。

各VPSに対してパラメータを設定すると、その内容が/etc/vz/conf/vpsid.confに格納される。このファイルに手作業で変更を加えるなら、vzcfgvalidateユーティリティを使うことで設定内容の誤りを防ぐことができる。

多くの場合、ホスティング環境では管理者によってrootパスワードが変更されたシステムに入る必要がある。物理的なシステムであれば、リブートを行ってからシングルユーザモードでrootアクセス権を得て管理タスクを処理する必要があるが、OpenVZであれば、該当するハードウェアノード(ホストシステム)にログインし、次のようにログイン用のvzctlを実行するだけで済む。

vzctl enter vpid

これでVPSにrootとしてログインできるのだ。何であれ実行が必要な管理タスクを終えた後は、exitと入力するだけでホストシステムのセッションに戻れる。また、あるユーザのパスワードをリセットしたければ、--userpasswdオプションを使って次のように実行するだけでよい。

vzctl set vpsid --userpasswd user:passwd

指定したユーザが存在しない場合は、新たに作成される。

実際にVPSに入らずにVPSのコマンドを実行したい場合は、vzctlexecパラメータを使えばrootとしてコマンドを実行できる。たとえば、DebianのVPS内で手早くアップグレードを実行するには次のように実行する。

vzctl exec vpsid apt-get upgrade

こうするとVPSそのものの内部でapt-get upgradeが実行されるのだ。

またVPSをシャットダウンする場合は、vzctl stop vpsid と実行すればVPS内でクリーンシャットダウンが行われる。vzctl restart vpsid の実行によってVPSを再起動することも可能だ。なお、VPSのシャットダウンや再起動はVPS内で普通に実行することもできる。

VPSの終了方法

以上でゲストシステムの操作は十分に行えたので、そろそろ終わりにするとしよう。理由は何であれVPSから抜け出るには、次のようにvzctldestroyコマンドを用いる。

vzctl destroy veid

ここで1つ注意すべき点がある。vzctlユーティリティはVPSを破棄する前に確認を一切行わないのだ。Enterキーを押すとすぐにVPSは削除され、プライベートデータのディレクトリも削除される。バックアップをとっていなければ、そのデータを復旧させようにも手の施しようがない。

OpenVZにはもっと多くの機能があるが、最初に膨大な時間をかけてWikiを読破することなくOpenVZを始められるだけの情報はお伝えしたつもりだ。VPSをうまく実行できたら、その後はWikiやmanページを参照しながらOpenVZで他にどんなことができるのかを自らの目で確かめてもらいたい。

NewsForge.com 原文