User Mode Linux (UML) について
User Mode
Linux(UML)は、
Linux環境を仮想的に作り出すための仕組みです。具体的には、
Linuxカーネルをユーザーモードのプログラムとしてコンパイルし、実行します。これにより、ホストOSの
Linuxカーネルと、ユーザーモードプロセスとして動作するUML
カーネルが連携し、
Linuxゲスト環境が提供されます。
基本構造
UMLの
カーネルは、UML向けにコンパイルされた
カーネルに、プログラムローダーを組み込んだ構造をしています。
Linux上で実行することで、プロセス内で独立した
Linuxが動作します。ホストOSも
Linuxである必要があり、サポートする
CPUアーキテクチャはx86-32とx86-64です。
UML上で動作するゲストプロセスは、
デバッガなどで使用される`ptrace`
システムコールを利用し、
システムコールやシグナルを横取りします。横取りされた
システムコールやシグナルは、ホスト側に転送され、処理されます。ゲストプロセスの
システムコールは、`ptrace`で横取りする際に、EAXレジスタを`getpid()`に置き換えて無害化した上でUML内で実行され、戻り値がEAXレジスタに設定されて、ゲストプロセスが再開されます。本来1往復の
システムコールが、UML環境下では4往復になります。
Linuxは`mmap`で`MAP_FIXED`を指定することで、ユーザーモードからでも固定アドレスにメモリを確保できます。UMLはこの仕組みを利用し、特定のアドレスにメモリを割り当てています。UML自体は、
CPUの特権命令を使用していません。
UML
カーネルは、ディスク、メモリ、ネットワークなどのリソースをホストから借用します。UML用のデバイスドライバが用意されており、特にディスクはイメージファイルをディスクとしてエミュレートし、差分ファイルを組み合わせることで、イメージファイルへの書き込みをせずに利用できます。これにより、単一のイメージを複数のUMLで共有できます。
UMLの
[カーネル]]は、通常のLinuxカーネルにビルド時に`ARCH=um`を指定することで作成できます。この操作で、[[カーネル]とモジュールが生成されます。生成された`linux`ファイルを実行することでUMLが起動します。
skas (Separated Kernel Address Space)
初期のUMLは、ttモード(tracing thread mode)で動作し、ゲストの全プロセスが単一のメモリアドレス空間を共有していました。2002年に、プロセスごとに独立したメモリアドレス空間を持つskas3モードが開発されましたが、ホスト側の
Linuxカーネルへのパッチが必要であり、メインライン
カーネルへの統合は拒否されました。
その後、2005年の
Linux 2.6.13以降では、ホスト側の
Linuxカーネルにパッチを適用せずに、プロセスごとにメモリ空間を分離するskas0が開発されました。現在はskas0のみがUMLでサポートされています。
skas0では、各プロセスのアドレス0x100000に8KBのメモリ領域を確保し、そこにプログラムとデータを配置します。ここから各プロセスの権限で
Linuxシステムコールを呼び出します。
skas0で0x100000に配置したプログラムを実行する際、`ptrace`を使用してゲストプロセスを一時停止させ、呼び出す
システムコールの情報をセットし、EIPレジスタを含むすべてのレジスタを書き換えます。その後、0x100000に配置したプログラムからゲストプロセスを再開し、
システムコールなどの処理を行い、プログラムの最後に`int3`命令を置いて、`ptrace`のブレークポイントとして`SIGTRAP`を発生させ、UML側に制御を戻します。
参考情報
公式ウェブサイト
コンパイル済みカーネル
*
コンパイル済みルートファイルシステム