User Mode Linux

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側に制御を戻します。

参考情報



公式ウェブサイト
コンパイル済みカーネル
* コンパイル済みルートファイルシステム

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。