User Mode Linux の設定
Linuxカーネルモジュールの作成や、カーネルデバッグするときによく使うので使い方をメモメモ。
環境: Ubuntu 12.04 32bit on VMware (Windows7 64bit)
本家サイト
・The User-mode Linux Kernel Home Page
参考になるサイト(古い)
・User Mode Linux HOWTO
UML環境の構築
まずは、UMLのパッケージをインストール
HostOS# apt-get install user-mode-linux
以下のサイトから、カーネルイメージとファイルシステムを入手する。
・Linuxカーネルイメージ
http://uml.devloop.org.uk/
・Linuxファイルシステム
http://fs.devloop.org.uk/
カーネルイメージに実行権限を与えて、UMLを起動。
HostOS$ chmod +x kernel32-3.5.3 HostOS$ ./kernel32-3.5.3 ubda=root_fs mem=64M
root_fsがファイルシステム。
memオプションでUMLに割り当てるメモリを指定。(指定なしだと、デフォで28MBだったような
* カーネルイメージとファイルシステムは上記のサイトから入手できるけど、自作でカスタマイズしたほうが使いやすい。
UML用Linuxカーネルイメージの作成
Linuxのソースは本家サイトから入手する。
・The Linux Kernel Archives
linux-3.3.8.tar.bz2をダウンロード。
ファイルを解凍する。
HostOS$ tar lzvf linux-3.3.8.tar.bz2 HostOS$ cd linux-3.3.8
UMLのデフォルトコンフィグファイルを作成する。
HostOS$ make defconfig ARCH=um
必要な機能を設定する。
HostOS$ make menuconfig ARCH=um
* ここで、下記のようなエラーが出る場合は、ncurses-develのライブラリをインストールする。(Ubuntu12.04だとlibncurses5-devが該当する)
*** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** make[1]: *** [scripts/kconfig/dochecklxdialog] エラー 1 make: *** [menuconfig] エラー 2 HostOS# apt-get install libncurses5-dev
カーネルをコンパイルする。(jobを2つ以上にした方が幸せ
HostOS$ make -j2 ARCH=um
コンパイル終了後、カレントディレクトリにあるlinuxファイルが実行ファイルとなる。
この実行ファイルをパスに登録する。
HostOS# ln -s `pwd`/linux /usr/bin/linux-3.3.8
上記のように、バージョン名を足してリンクを作っておくと、
複数のカーネルイメージを使う際に便利。
また、カーネルをリビルドしてもそのまま実行できる。
ビルドしたカーネルがUMLで起動するかチェックする。
HostOS$ linux-3.3.8 ubda=root_fs mem=64M
GuestOSで、カーネルのバージョンを確認
GuestOS$ uname -r 3.3.8
UML用のファイルシステムの作成
ファイルシステムの領域を確保する。
HostOS$ dd if=/dev/zero of=fs_new_switch bs=512M count=1
ファイルシステムの構築
HostOS$ mkfs.ext3 fs_host
debianシステムのインストール
HostOS# mount -o loop fs_host /mnt/mkfs/ HostOS# debootstrap squeeze /mnt/mkfs/ http://ftp.jp.debian.org/debian
* 因みに、Ubuntuシステムをインストールする場合は、こんな感じ。
HostOS# debootstrap precise /mnt/mkfs/ http://ftp.ubuntu.com/ubuntu/
でも、Ubuntuだと起動時の設定が面倒なのでDebianにした方が簡単。
ゲストOSの編集
ゲストOSのルートディレクトリに変更する
HostOS# chroot /mnt/mkfs/
/etc/inittabの編集
GuestOS# vi /etc/inittab 1:2345:respawn:/bin/login root tty1
2~6をコメントアウト。(これをしないと、コンソールが大量に出てくる)
bashの設定ファイルの編集
GuestOS# vi /etc/bash.bashrc
以下の行を追加。
# pingの暴走を抑制する alias ping='ping -c 3' # ホストOSのファイルシステムをゲストOSにマウントする mount none /mnt/ -t hostfs -o /home/stia/
/mntがゲストOSのマウントポイント。/home/stiaがホストOSのマウントポイント。
ゲストOSのルートパスワードの設定
GuestOS# passwd root
ゲストOSのアンマウント
HostOS# umount /mnt/mkfs/
ゲストOSのネットワーク接続
tun/tapデバイスを制御できるように設定する。
HostOS# adduser stia uml-net
ゲストOSの起動。ネットワークの設定。
HostOS$ linux-3.3.8 umid=host0 ubda=root_fs mem=64M eth0=tuntap,,,192.168.10.1 HostOS# sysctl -w net.ipv4.ip_forward=1 HostOS# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE GuestOS# ifconfig eth0 192.168.10.2 GuestOS# route add default gw 192.168.10.1
さらに、/etc/resolv.confのnameserverを編集
パッケージのインストール
GuestOS# apt-get update GuestOS# apt-get install bridge-utils vlan tcpdump