必要なものは最新のカーネルとビルドツールが必要になる。ゲストのUMLからホストOSのファイルシステムをアクセスできるhostfsを使用すると便利である。

UMLコンパイルは以下のようにするののがお薦めである。

$ make defconfig ARCH=um
$ make gconfig ARCH=um # ここでUML-specific optionのHost Filesystemを有効にする。
$ make ARCH=um

次にUMLが使用するルートファイルシステムを用意する。自前で用意してもいいがhttp://uml.nagafix.co.uk/ここにディストリビューションごとのルートファイルシステムがあるので利用すると便利である。

ここではDebianのルートファイルシステムを使い、UMLの実行の仕方は次の様になる。

$ wget http://uml.nagafix.co.uk/Debian-4.0/Debian-4.0-x86-root_fs.bz2
$ bunzip2 Debian-4.0-x86-root_fs.bz2
$ cp /usr/src/uml/linux-2.6.22.6/vmlinux ./
$ ./vmlinux ubda=Debian-4.0-x86-root_fs mem=512M 

実行するとUMLが利用できるはず、次にgdbを使いゲストOSであるUMLデバッグを行う。
手順は次のように行う。

1. Emacsを立ち上げAlt-x gdbgdbを立ち上げ
2. 立ち上げたgdbのプロセスIDをメモする。

$ ps -C gdb
  PID TTY          TIME CMD
21701 pts/6    00:00:00 gdb

3. UMLの起動時の引数にgdb-pid=gdbのプロセスIDを指定し、UMLを実行する。

$ ./vmlinux ubda=Debian-4.0-x86-root_fs mem=512M gdb-pid=21701

4. UMLのプロセスIDをメモする。たくさん表示されるが最初の一つだけでいい。

$ ps -C vmlinux
  PID TTY          TIME CMD
22610 pts/1    00:00:02 vmlinux
22616 pts/1    00:00:00 vmlinux
22617 pts/1    00:00:00 vmlinux
22618 pts/1    00:00:00 vmlinux
22619 pts/1    00:00:00 vmlinux
23190 pts/1    00:00:00 vmlinux
23200 pts/1    00:00:00 vmlinux
23232 pts/1    00:00:00 vmlinux
23277 pts/1    00:00:00 vmlinux
23281 pts/1    00:00:00 vmlinux

5. Emacsgdbモードでattachの引数にUMLのプロセスIDを指定する。アッタチ後はいつもの様にnext, step実行でプログラムを実行することができる。デバッグを抜けたいならdettachを実行することにより、元の状態に戻る。

(gdb) attach 22610

スクリーンショット

Emacsの画面でソースコードを見ながらデバッグをできるのでカーネルデバッグの効率がとてもいい。