OpenVZ(オープンブイジー)は、Linuxカーネルをベースに開発された Red Hat Enterprise Linux (RHEL) 用のオペレーティングシステム (OS) レベルのサーバ仮想化ソフト。
Parallels Virtuozzo Containers for Linuxのオープンソース版であり、1つの物理サーバ上に複数の独立したLinuxインスタンスを作成することができる。ただし、Linuxカーネルをすべてのインスタンスで共有するため、Linux以外の環境(Windowsなど)を動作させることはできない。
ハイパーバイザ型(ハードウェアレベル)の仮想化ソフトであるVMwareやXenに比べてオーバーヘッドが少ないとされ、稼動させる環境数で勝っている。より高密度化できるため、バーチャル・プライベート・サーバ (VPS) での使用において、コストダウンをはかることができる。
チェックポイントとライブマイグレーションにも対応している。ゲストOS(コンテナ)が稼働中のまま、別のマシンに移すことができる。simfsを利用した場合、メモリの内容などのみが保存され、ファイルシステムの内容は保存されないが、ファイルシステムにploopを使った場合はスナップショットを取ることができ、その場合、ファイルシステムの内容を復元したり、変更差分だけを管理したりできる。
RHEL 5版では、仮想メモリ単位でしかメモリの制限をかけられなかったが、RHEL 6でLinux カーネル 2.6.32になり、cgroupsの開発が進み、VSwap[1] が使えるようになり、物理メモリやスワップメモリでも制限をかけられるようになった。コンテナ内で物理メモリが枯渇し、スワップメモリを使い始めても、ホストの物理メモリが余っている場合は、実際にはすぐにディスクへの書き出しが始まるわけではなく、人工的にコンテナの速度を遅くしスワップアウトをエミュレートし、本当にホストの物理メモリが枯渇したときに初めてディスクへの書き出しが始まる。
公式にはRed Hat Enterprise Linux (RHEL) にのみ対応している。RHELクローンのCentOSでも動作し、Parallels Virtuozzo Containersの方ではCentOSも公式にサポートしている。Linuxカーネルを改造しているため、ディストリビューションおよびそのバージョンに強く依存している。
Ubuntu 10.04またはDebian 6.0にインストールするには、RPMファイルをdebに変換することで可能[2][3]。
元々のDebian 5.0、6.0ではパッケージに含まれているが、サポートが技術的に困難であるという理由から、Debian 7.0 ではパッケージを廃止予定[4]。Debianから派生しているUbuntuでは8.04は含まれているが、10.04ではパッケージに含まれていない[5]。
ゲストOSの方は、主要なLinuxディストリビューションに一通り対応している。
OpenVZのカーネルはLinuxカーネルをOpenVZコンテナをサポートするように修正を加えたものである。修正されたカーネルは仮想化、コンテナ同士の隔離、リソース管理、チェックポイントの機能を持つ。
それぞれのコンテナは別々に分離されていて、大旨、隔離された物理サーバのように動く。以下の物をそれぞれ隔離して所有している。
- ファイル
- システムライブラリ、アプリケーション、仮想化された/procや/sys、仮想化されたロックなど。
- ユーザーとグループ
- それぞれのコンテナは独自のrootユーザーを持ち、ユーザーやグループは独立している。
- プロセスツリー
- それぞれのコンテナは独立したプロセスを持ち、プロセスはinitの子プロセスとなっている。プロセスID (PID) は仮想化されており、init PIDはちゃんと1になっている。
- ネットワーク
- ネットワークデバイスは仮想化されていて、固有のIPアドレスを持っていて、iptables やルーティングは独自のものを持てる。
- デバイス
- 必要ならば、コンテナはネットワークインタフェース、シリアルポート、ディスクパーティションなどリアルデバイスにアクセスすることが出来る。
- IPCオブジェクト
- 共有メモリ、セマフォ、メッセージパッシングなども独立している。
OpenVZのリソース管理は、ディスククォータ、CPUスケジューラー、I/Oスケジューラー、ユーザービーンカウンタからなる。これらのリソースはコンテナが実行中に再起動することなしに変更することが可能。
各コンテナは個別のディスククォータを持ち、ディスクブロック数とinode数(大旨、ファイル数になる)で管理される。コンテナ内では、標準的なツールでユーザーごとやグループごとにディスククォータをかけることも出来る。
OpenVZのCPU スケジューラーは公平なスケジューリング戦略を2段階で実装している。
第1段階では、コンテナごとのcpuunit値に基づいて、スケジューラはCPUタイムスライスをどのコンテナに割り振るか決める。第2段階では、標準のLinuxのスケジューラがコンテナ内のどのプロセスを実行するか、Linuxのプロセス優先順位に基づいて決める。
コンテナごとに異なるcpuunit値を割り振ることが出来る。CPU利用時間はcpuunit値に比例して分配される。
全CPU 時間の10% など、厳密に限界値を設定することも出来る。
上記のCPUスケジューラー同様、OpenVZではI/O スケジューラーも同様に2段階で行っている。ジェンス・アクスボーのCFQ(英語版)I/Oスケジューラ(英語版)を利用している。
それぞれのコンテナはI/Oの優先順位を持っていて、利用可能なI/O帯域をその優先順位に基づいて分配する。それ故、一つのコンテナがI/Oを使い果たすということは出来なくなっている。ただし、simfsを使用した場合、ホスト側のext4などのジャーナリングがボトルネックとなって公平に分配できない場合がある。
ユーザービーンカウンタはコンテナごとに設定され、最低値と上限値を設定する。21項目ある。あらゆる側面で設定可能であり、コンテナがシステムリソースを使い果たすことを制限することが出来る。
以下は項目一覧。
- 主要なパラメータ
- numproc - プロセス数
- numtcpsock - TCPソケット数
- numothersock - TCP以外のソケット数
- vmguarpages
- 二次的なパラメータ
- kmemsize - カーネル内のスワップ不可能メモリサイズ
- tcpsndbuf - TCP送信バッファ
- tcprcvbuf - TCP受信バッファ
- othersockbuf - 他のソケットのバッファ
- dgramrcvbuf - データグラム (UDP) 受信バッファ
- oomguarpages
- privvmpages
- 補助的なパラメータ
- lockedpages - スワップされないメモリ
- shmpages - 共有メモリ
- physpages - 物理メモリサイズ
- numfile - オープンファイル数
- numflock - ファイルロック数
- numpty - pty数
- numsiginfo - siginfo数
- dcachesize
- numiptent - NETFILTER (IPパケットフィルタリング)数
- swappages - スワップメモリサイズ
OpenVZは、GPLバージョン2に基づいて配布されている。同技術を使用した商用ソフトとしてパラレルスが販売するParallels Virtuozzo Containers for Linuxがある。
- ^ VSwap - OpenVZ Linux Containers Wiki
- ^ Install kernel from RPM on Ubuntu 10.04 - OpenVZ Linux Containers Wiki
- ^ Install kernel from RPM on Debian 6.0 - OpenVZ Linux Containers Wiki
- ^ Bug#642380: Cannot chkpnt (live migrate) VEs - linux.debian.kernel
- ^ OpenVZ - Community Ubuntu Documentation