OpenVZ & htop

Linux には htop というツールがあります。 これはプロセス監視ツール top の超機能拡張版とでも言うべきおすすめプログラムなのですが、その機能のひとつとして OpenVZ のコンテナ ID (CTID) の表示に対応しており、それがコンテナ管理において非常に便利なため OpenVZ 管理者必携のツールとなっています。

インストールは Debian であれば apt-get install htop とするだけです。うれしいことに squeeze のやや古い htop 0.8.3-1 でもCTID 表示機能が含まれています (Debian の各リリースで利用可能な htop のバージョンは Package Tracking System で確認してください)。

OpenVZ のホスト環境 (CT0) で htop の表示カラムに CTID を追加しておけば、各プロセスが属するコンテナ ID が一目でわかるようになるのでいろいろと捗ります。たとえば、なにか暴走してるプロセスがいるけど誰のコンテナだ? といった局面では特に役に立ちます。この設定は F2 (Setup) キーを押して画面を見ながら操作すれば簡単にできます。

これはちょっとわざとらしい例ですが、なんか暴走して CPU 100% 使ってるプログラム a.out がいて、CTID 140 のコンテナで動いてることがわかります。htop がなければ、このようなプロセスを見つけたら別途コマンドラインで vzpid を実行して調べて対処するといった手間が必要でした。

% vzpid 14391
Pid	CTID	Name
14391	140	a.out
% sudo vzctl enter 140
# ...

また必要な権限さえあれば、あやしいプロセスにカーソルを合わせて lsof (l) や strace (s) や ltrace (L) を実行したり、シグナルを送って止めたり (k) ということも htop の中からできます。htop を使うなら lsof strace ltrace もいっしょに入れておきましょう。

htop で t を入力するとプロセスのツリー表示の有無が切り替えられます。このツリー表示を見れば OpenVZ を使ったことがない人でも OpenVZ コンテナの正体が理解しやすいのではと思います。

この例では CTID 1071 1074 のコンテナのプロセスが見えています。ホスト環境 (CT0) のプロセスの CTID は 0 です。各コンテナにおいて /sbin/init が根っこのプロセスとして動いており、その下にさらに sshd cron rsyslogd といったデーモンプロセスが動いていることがわかります。つまり OpenVZ コンテナとは古典的な chroot 環境とほぼ同じことをしており、その中で init を起動して通常と同じような Linux システムを立ち上げているということです。

ここで Unix に詳しい人なら、通常と同じシステムとして使うなら init の PID は 1 でないとまずいのでは? という疑問が生じると思います。そこで CTID 1071 のコンテナにログインして、同様に htop で見てみましょう。次のようになります。

まず htop の装飾がさらに充実していることが目につきますが、それはこのコンテナでは Debian 次期安定版 wheezy が稼動しており、htop も 1.0.1-1 という新しいバージョンが動いているためです。

注目すべきは init プロセスの PID がコンテナ内部から見るとちゃんと 1 になっていることです。他のプロセスも CT0 環境の htop から見たものとは異なる PID がつけられていることがわかります。そしてもちろん、他のコンテナや CT0 環境のプロセスは一切見えません。

これは Linux の PID ネームスペースという機能によるもので、OpenVZ と IBM によって開発され、Linux 2.6.24 から標準となった機能です。Google Chrome のサンドボックス環境の実現でもこれが使われています。

このように PID や IPC やネットワークスタック、ファイルシステムなどの資源について、プロセスごとにネームスペースを設定する機能が最近の Linux カーネルには追加されており、OpenVZ や LXC といったコンテナ技術や、サンドボックス環境の実現などに利用されています。詳しくは Linux カーネルのマニュアル clone(2) などを参照してください。

2012/04/07 15:10:00 JST