okacl's blog

私的なメモ置き場になるヨカーン

User Mode Linux の設定

Linuxカーネルモジュールの作成や、カーネルデバッグするときによく使うので使い方をメモメモ。

環境: Ubuntu 12.04 32bit on VMware (Windows7 64bit)


本家サイト
The User-mode Linux Kernel Home Page

参考になるサイト(古い)
User Mode Linux HOWTO

仮想OS「User Mode Linux」活用法

User Mode Linux で仮想マシンを作る


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だったような

* カーネルイメージとファイルシステムは上記のサイトから入手できるけど、自作でカスタマイズしたほうが使いやすい。


UMLLinuxカーネルイメージの作成

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