Linux実行可能ファイルをコンパイルしてブートする
Debianパッケージuser-mode-linuxをインストールするだけで、コンパイル済みのUMLカーネルをユーザー空間でブートする準備ができました(UMLの概念の理解を深めるため、カーネルはご自身でコンパイルすることをお勧めします)。しかし、UMLの管理と構成用のuml-utilitiesパッケージをインストールしなければなりませんでした。標準ユーザーのhomeディレクトリ下で、次のように最新のカーネルを取得しました。
wget ?c http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.2.tar.bz2 tar ?xvjf linux-2.6.24.2.tar.bz2
Linuxカーネルのコンパイルをよくご存じであれば、これ以降のコマンドは説明するまでもありません。ただし、変数の設定ARCH=umは例外です。これは、コンパイラに特別なユーザーモードアーキテクチャ向けのカーネルのビルド方法を指示する重要な設定です。今回は、x86やARM CPUアーキテクチャ向けのカーネルをコンパイルするのではなく、このコマンドを使ってユーザーモードの仮想アーキテクチャ向けのカーネルを取得しました(UMLの作成者であるJeff DikeはLinuxへのLinuxのポートとして定義しています)。
make ARCH=um defconfig
次に、次のコマンドを使って少しだけ変更したUMLの標準構成を作成しました。
make ARCH=um menuconfig
この時点で、Linux実行可能ファイルを作成するために完了したステップは次のとおりです。
- モジュールを持たないようにする(モジュールがあると、UMLのルートファイルシステム下にコンパイル済みのモジュールをインストールしなければなりません)。
[ ] Enable loadable module support --->
- 適切なプロセッサを設定する。
Host processor type and features --->
- TUN/TAP以外のネットワークサポートを含めない。
UML Network Devices ---> [*] Virtual network device [ ] Ethertap transport [*] TUN/TAP transport [ ] SLIP transport [ ] Daemon transport [ ] VDE transport [ ] Multicast transport [ ] pcap transport [ ] SLiRP transport
- PPPのサポートを無効にする。
[*] Network device support ---> [ ] PPP (point-to-point protocol) support
- セクション下のオプションをすべてチェックする。
Kernel hacking --->
- 最後に、次を実行する。
make ARCH=um linux
コンパイルの終了後、linuxというファイルができました。これが、実行する実行可能ファイルです。
すでに説明したように、コマンドラインで、UMLの実行環境であるハードウェアプラットフォームを構成できます。1つ目のUMLでは、次のスイッチ変数を設定しました。
ubd0=/path/to/file/uml1-root― ルートファイルシステムのマウント元のブロックデバイスを設定します。con=pty con0=null,fd:2 con1=fd:0,fd:1― コンソール端末の構成を処理します。eth0=tuntap,the_uml_conn1― UML eth0のネットワークインターフェイスとホストのTAPネットワークインターフェイスとの関連付けです。eth0には、ランダムな架空のMACアドレスが割り当てられます。mem=512M― この変数では、ホストマシン上の実際の既存のメモリに関係なく、UMLが使う物理RMAメモリを設定できます。umid=uml1-umid― ホストのUMLユーティリティだけでなくデバッガでも使われる1つ目のUMLマシンの一意のIDラベルです。
設定する変数は他にもたくさんあります。詳細については、manページを参照してください。
これで、ブートしてコマンドを実行する準備が整いました。
linux-2.6.24.2/linux \
ubd0=/path/to/file/uml1-root \
con=pty con0=null,fd:2 \
con1=fd:0,fd:1 \
eth0=tuntap,the_uml_conn1 \
mem=512M \
umid=uml1-umid
1つ目のUMLの完全なブートログについては、リスト1を参照してください。
Ubuntuをフル活用する
この時点でビルドを完成したのは、Ubuntu 7.10の基本的なルートファイルシステムだけです。一般的なUbuntuのデスクトップを体験するには、そのデスクトップをインストールする必要がありました。すでにLANに接続していたのでこれ以上簡単なことはなく、単にコマンドを実行するだけでした。
apt-get install ubuntu-desktop
多くのパッケージをインストールする必要があったため、この操作には時間がかかりました。また、メモリを大量消費するプロセスでもあり、ホストシステムはtmpfsの抽象化を使うため、このtmpfsを1GB以上の大きさにする必要もありました。このために、ホストファイルに次の行を挿入しました。
tmpfs /tmp tmpfs size=5000M 0 2
さらに、ホスト上に完全なリモートXセッションが必要なので、XnestのXサーバーもインストールする必要がありました。
apt-get install xnest
また、ホスト上のリモートXセッションを許可することも必要でした。
xhost +
最後に、UMLで、次の2つのコマンドを実行しました。
Xnest :1 & gnome-session --display=:1 &
これで、DebianホストのウィンドウにUbuntuのデスクトップが表示されました(図2を参照)。

