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