UML (User Mode Linux) 構築
2013年3月7日(木) - 【Linux, エミュレータ】: 【RSS 2.0 feed】 コメント終了【トラックバック】仮想化 - UML (User Mode Linux)
 過去の Software Design を読み返していたら UMLを紹介する記事がありました
 最近の自己課題となっている仮想化環境実現の選択肢になるかと考え
 最新の Linuxカーネルで試してみたらちゃんと動作したので その紹介をします
 
 
 UMLとは User Mode Linuxの略でつまり
 既に動いている Linuxシステム上で 別の Linuxカーネルを動かせます
 いわゆる JAIL環境です ゲストとしての Linuxは割り当てられたリソース範囲内で動作します
| CPU | AMD PhenomII X4 905e (2.5GHz 4コア) | 
|---|---|
| メモリ | 16GB | 
| OS | Gentoo-1.12.14 Linux-3.7.8 x86_64 UTF-8 | 
| コンパイラ | gcc-4.5.2 | 
| Cライブラリ | glibc-2.13 | 
 ゲストシステムとしても 同じ最新のカーネル Linux-3.7.8 を使いました
構築 UML utilities
 ゲスト用 Linuxカーネルと OSディスクイメージ を別途作成する必要ありますが
 その前に ゲストLinuxを制御するツールをインストールします
 
 まず制御ツールは UML Utilities というパッケージです
 パッケージシステムを使っている Linuxならすぐインストールできると思います
 ここでは 手動ビルドによるインストールを行います
 
 
 UMLのダウンロードページから ソースファイルを拾ってきて
 以下のようにビルドします 
$ tar -xjf uml_utilities_20070815.tar.bz2
$ cd tools-20070815
 
$ tar -xjf uml_utilities_20070815.tar.bz2 $ cd tools-20070815
 configureがないので Makefileを直接修正して必要な設定を行います
 デフォルトでは 必要な tunctlツールがビルドされないのでこれを対象に加えます
 Makefile の SUBDIR に tunctl エントリを追加します
TUNCTL = $(shell [ -e /usr/include/linux/if_tun.h ] && echo tunctl)
SUBDIRS = lib jail jailtest humfsify mconsole moo port-helper $(TUNCTL) 
        uml_net uml_switch watchdog umlfs tunctl
UMLVER = $(shell date +%Y%m%d)
TARBALL = uml_utilities_$(UMLVER).tar.bz2
BIN_DIR = /usr/bin
ifeq ($(shell uname -m),x86_64)
LIB_DIR = /usr/lib64/uml
else
LIB_DIR = /usr/lib/uml
endif
CFLAGS = -g -Wall
#CFLAGS = -g -O2 -Wall
export BIN_DIR LIB_DIR CFLAGS
 なお インストール先のディレクトリを修正するなら
 Makefile の BIN_DIR や LIB_DIR も修正してください
 jail/Makefile の SBIN_DIR も修正が必要です
$ CC=gcc make 〜 make[1]: ディレクトリ `/home/admin/tools-20070815/mconsole’ に入ります gcc -g -Wall -c -o uml_mconsole.o uml_mconsole.c gcc -g -Wall -o uml_mconsole uml_mconsole.o ../lib/libuml.a -lreadline -lncurses /usr/binutils/2.21/x86_64/bin/x86_64-gnu-linux-ld: cannot find -lncurses collect2: ld はステータス 1 で終了しました make[1]: *** [uml_mconsole] エラー 1 make[1]: ディレクトリ `/home/admin/tools-20070815/mconsole’ から出ます make: *** [all] エラー 2
 ホスト環境では libncurses がないためエラーとなっていますが
 libncursestw が代わりにあるためそれをリンクするように指示します
 mconsole/Makefile の LIBS を修正します
BIN = uml_mconsole
OBJS = $(BIN).o
CFLAGS ?= -g -Wall
LIBS = ../lib/libuml.a -lreadline -lncursestw
BIN_DIR ?= /usr/bin
all : $(BIN)
$(BIN) : $(OBJS)
        $(CC) $(CFLAGS) -o $(BIN) $(OBJS) $(LIBS)
clean :
        rm -f $(BIN) $(OBJS) *~
install : $(BIN)
        install -d $(DESTDIR)$(BIN_DIR)
        install -s $(BIN) $(DESTDIR)$(BIN_DIR)
 
$ CC=gcc make set -e ; for dir in lib jail jailtest humfsify mconsole moo port-helper uml_net uml_switch watchdog umlfs; do make -C $dir all; done make[1]: ディレクトリ `/home/admin/tools-20070815/lib’ に入ります 〜 gcc -g -Wall -D_FILE_OFFSET_BITS=64 -I/usr/local/include -o uml_mount uml_mount.o -lfuse make[1]: ディレクトリ `/home/admin/tools-20070815/umlfs’ から出ます make[1]: ディレクトリ `/home/admin/tools-20070815/tunctl’ に入ります gcc -g -Wall -c -o tunctl.o tunctl.c gcc -g -Wall -o tunctl tunctl.o make[1]: ディレクトリ `/home/admin/tools-20070815/tunctl’ から出ます $
 なお ビルドにあたって fuse が必要になるので
 fuse関連のエラーが出た場合はそこを疑ってください
 
 次にインストールですが インストール先を変更するには
 先に Makefile の BINDIR や jail/Makefile の SBINDIR を手修正します
 デフォルト /usr/bin /usr/sbin /usr/libか/usr/lib64 のままでほぼ問題ないです
$ su # make install set -e ; for dir in lib jail jailtest humfsify mconsole moo port-helper uml_net uml_switch watchdog umlfs; do make -C $dir install; done make[1]: ディレクトリ `/home/admin/tools-20070815/lib’ に入ります make[1]: `install’ に対して行うべき事はありません. 〜 install -s uml_mount /usr/bin make[1]: ディレクトリ `/home/admin/tools-20070815/umlfs’ から出ます make[1]: ディレクトリ `/home/admin/tools-20070815/tunctl’ に入ります install -d /usr/bin install -s tunctl /usr/bin make[1]: ディレクトリ `/home/admin/tools-20070815/tunctl’ から出ます #
bin/ 以下 sbin/ 以下には下記プログラムがインストールされます
bin/: humfsify tunctl uml_mkcow uml_mount uml_switch jailtest uml_mconsole uml_moo uml_net uml_watchdog sbin/: jail_uml
構築 ディスクイメージ
 ゲストLinuxの動作用として Gentoo stage3 ベースのシステムを準備します
 
 UMLはエミュレータではありませんので
 ホストシステムと同じアーキテクチャの システムイメージが必要です
 ここでは 検証環境と同じ amd64 の tarball をダウンロードしました
 
 下記のように 1GB の EXT3ディスクイメージを作って tarballを展開します
$ dd if=/dev/zero of=uml_gentoo_st3_20120605 bs=1048576 count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 1.25505 秒、 856 MB/秒
$ mke2fs -j uml_gentoo_st3_20120605
mke2fs 1.41.12 (17-May-2010)
uml_gentoo_st3_20120605 is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
$ su
Password:
# mount -t ext3 -o loop uml_gentoo_st3_20120605 /mnt/target
# cd /mnt/target
# tar -xjpf ~admin/stage3-amd64-20130130.tar.bz2
# ls
bin   dev  home  lib32  lost+found  mnt  proc  run   sys  usr
boot  etc  lib   lib64  media       opt  root  sbin  tmp  var
#
 
$ dd if=/dev/zero of=uml_gentoo_st3_20120605 bs=1048576 count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 1.25505 秒、 856 MB/秒
$ mke2fs -j uml_gentoo_st3_20120605
mke2fs 1.41.12 (17-May-2010)
uml_gentoo_st3_20120605 is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
$ su
Password:
# mount -t ext3 -o loop uml_gentoo_st3_20120605 /mnt/target
# cd /mnt/target
# tar -xjpf ~admin/stage3-amd64-20130130.tar.bz2
# ls
bin   dev  home  lib32  lost+found  mnt  proc  run   sys  usr
boot  etc  lib   lib64  media       opt  root  sbin  tmp  var
#
 
 ファイルシステムへの書き込みのために root権限を使いましたが
 Gentooのシステムは書き込めました
 
 ゲストファイルシステムの設定を続けます etc/fstab をカスタマイズします
#/dev/BOOT /boot ext2 noauto,noatime 1 2 #/dev/ROOT / ext3 noatime 0 1 /dev/ubda / ext3 noatime,defaults 0 1 proc /proc proc defaults 0 1 #/dev/SWAP none swap sw 0 0 #/dev/cdrom /mnt/cdrom auto noauto,ro 0 0 #/dev/fd0 /mnt/floppy auto noauto 0 0
 SWAPも無効化してます ルートディレクトリの /dev/ubda は仮想ファイルシステムで
 UBD(UML Block Device)です ホスト側のシステムイメージを UMLで扱えます
 /dev/udba を作成しておく必要があります 下記の通りです
# mknod /mnt/target/dev/udba c 98 0 #
 UBDは メジャー番号 98 です
 複数のシステムイメージを扱うなら MAKEDEVスクリプトでまとめて作る方法もあります
 
 次は ネットワークを設定です SSHでログインできるようにします
 まず ネットワークの設定です ゲスト側 etc/conf.d/net に設定するだけです
config_lo0="127.0.0.1 netmask 255.0.0.0 brd 127.255.255.255" config_eth0="192.168.255.254 netmask 255.255.255.0" routes_eth0="default via 192.168.255.1"
 今回の UML構築にあたっては TUN/TAP仮想ネットワークを利用した
 下記のネットワークで構築します
 
 ゲスト側の eth0インターフェース と ホスト側の tap0インターフェース が通信します
 その通信ネットワークとして動作するのが TUN仮想ネットワークです
 
 ホストLinux側で IPv4のルーティングを有効化すれば
 家庭内LANとの通信も可能になるので UMLサーバを外部と通信させることも可能です
 (ホスト側で  echo 1 > /proc/sys/net/ipv4/ip_forward  を実行する)
 
 TUN/TAPを使わない別の方法としては uml_switch を使った仮想ネットワークが考えられますが
 家庭内LANとの通信はできない 閉じたネットワークとなります
 
 また start/stopスクリプトの net.eth0 がゲスト起動時にサービス開始され
 eth0 を初期化するようにします
# ln -s /etc/init.d/net.lo /mnt/target/etc/init.d/net.eth0 #
 続いて SSHログインできるようにするための設定ですが
 まず ログイン用アカウントを作成するところから必要です
 chrootを使って ゲスト側のイメージにルートディレクトリを変更して作業します
# chroot /mnt/target /bin/bash # useradd admin -m -g users -G wheel -s /bin/bash # passwd admin 新しいパスワード: よくないパスワード: 短かすぎます よくないパスワード: 簡単すぎます 新しいパスワードを再入力してください: passwd: パスワードは正しく更新されました # passwd root 新しいパスワード: よくないパスワード: 短かすぎます よくないパスワード: 簡単すぎます 新しいパスワードを再入力してください: passwd: パスワードは正しく更新されました # id admin uid=1000(admin) gid=100(users) groups=100(users),10(wheel) #
 ゲスト側のイメージに adminアカウントが作成されました
 admin権限にスイッチして SSHの設定作業します
# su admin $ mkdir ~/.ssh $ cd !!:1 $ ssh-keygen -t rsa -f uml_admin Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in uml_admin. Your public key has been saved in uml_admin.pub. The key fingerprint is: eb:57:3a:**:**:**:**:**:**:**:**:**:e2:ff:fb:67 admin@phenom The key’s randomart image is: +–[ RSA 2048]—-+ | | | o.*o+.o + E | | . .=Xo.+=.+ | +—————–+ $ ls uml_admin uml_admin.pub $ cat uml_admin.pub > authorized_keys $ chmod 600 authorized_keys $
 SSHの RSAログイン用のキーを作って設定しました
 最後に ゲストシステムの起動時に sshdが起動する設定をいれます
$ exit # ln -s /etc/init.d/sshd /etc/runlevels/default/sshd #
 ゲストファイルシステムのマウントまで解除して完成です
 なお SSHのプライベートキー uml_admin ファイルは SSHログインに必要なので
 ホストシステム側に退避しておきます
# exit # cp /mnt/target/home/admin/.ssh/uml_admin ~admin/ # umount -d /mnt/target #
 これで ゲストシステムが起動したとき SSHログインできるはずです
構築 Linuxカーネル
 Linuxのカーネルは ゲストLinux用 に構築する必要があります
 構築についても単純で makeオプションに ARCH=um を指定するだけです
 
 ただし ビルド用のディレクトリは ホスト側カーネル構築用ディレクトリと
 別に作る必要はあります
 
 早速 実施してみます Linuxカーネルのソースを展開したディレクトリで
$ make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um mrproper
$ make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um menuconfig
 
$ make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um mrproper $ make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um menuconfig
 UML専用のメニュー項目がいくつか見えます
 
 ほとんどの選択肢は 初期状態のままで大丈夫です
 ポイントとなる箇所を 下記画面キャプチャで紹介します
 
 UML-specific options の Host filesystem はここでは無効化しています
 Host filesystemとは ゲストシステム側からホスト側のディレクトリをマウントする便利機能です
 
 ゲストシステムを他人に渡して使ってもらうような サーバレンタル用途を考えているなら
 ホストシステムファイルの参照権限を渡さないほうがよいでしょう
 
 UML Charcter Devices で ゲスト側の起動コンソールを設定できます
 
 ゲスト側ブートコンソールとなるのが Default main console channel initialization の部分で
 fd:0,fd:1 という指定は 標準出力と標準入力を使ってください という意味です
 
 その下の xterm という指定は コンソールログイン端末の指定です
 ブート完了時に xtermが開いてログインプロンプトが表示されます
 ただし検証環境は Xサーバを動かしてないモニタレスサーバなので xtermは立ち上がりません
 
 Block devices では Virtual block device というのが重要です
 これにより 先ほどのOSイメージを扱う ubd仮想デバイスが使えるようになります
 
 UML Network Devices でネットワークデバイス関連の設定が可能です
 TUN/TAP経由でホスト側と仮想ネットワーク接続するので TUN/TAPの設定が必要です
 また複数のゲストLinuxを仮想ネットワーク接続する場合 Daemon transportが必要です
 
 最後 File systemsですが
 デフォルトでは ext2 と ext3 が無効化されていたので 有効化しました
 OSイメージのファイルシステムや 必要性に応じて判断してください
 
 以上でカーネルのコンフィグを終了して ビルド開始します
scripts/kconfig/mconf arch/x86/um/Kconfig # # configuration written to .config # *** End of the configuration. *** Execute 'make' to start the build or try 'make help'. $ make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um HOSTLD scripts/kconfig/conf scripts/kconfig/conf –silentoldconfig arch/x86/um/Kconfig 〜 LD [M] drivers/net/slip/slhc.ko CC drivers/net/slip/slip.mod.o LD [M] drivers/net/slip/slip.ko CC drivers/net/tun.mod.o LD [M] drivers/net/tun.ko CC fs/autofs4/autofs4.mod.o LD [M] fs/autofs4/autofs4.ko CC fs/binfmt_misc.mod.o LD [M] fs/binfmt_misc.ko CC fs/isofs/isofs.mod.o LD [M] fs/isofs/isofs.ko CC sound/soundcore.mod.o LD [M] sound/soundcore.ko $ ls -l linux -rwxr-xr-x 2 deer wheel 43645642 Mar 5 23:08 linux $
 linux という実行形式ファイルができています
 これが UMLで動作する Linuxカーネル本体です
 
 この linuxコマンド自体は ホストシステム側から起動しますが
 それ以外 System.map カーネルモジュール はゲストシステムへ転送する必要があります
$ su Password: # mount -t ext3 ~admin/uml_gentoo_st3_20120605 /mnt/target # cp System.map /mnt/target/boot/ # make CC=gcc NM=nm AR=ar LD=ld OBJCOPY=objcopy ARCH=um INSTALL_MOD_PATH=/mnt/target modules_install INSTALL arch/um/drivers/hostaudio.ko INSTALL block/cfq-iosched.ko INSTALL crypto/ansi_cprng.ko INSTALL crypto/krng.ko INSTALL crypto/rng.ko INSTALL drivers/block/loop.ko INSTALL drivers/block/nbd.ko INSTALL drivers/net/dummy.ko INSTALL drivers/net/ppp/ppp_generic.ko INSTALL drivers/net/slip/slhc.ko INSTALL drivers/net/slip/slip.ko INSTALL drivers/net/tun.ko INSTALL fs/autofs4/autofs4.ko INSTALL fs/binfmt_misc.ko INSTALL fs/isofs/isofs.ko INSTALL sound/soundcore.ko DEPMOD 3.7.8 # umount -d /mnt/target # exit $
 これで INSTALL_MOD_PATH配下の lib/modules/ にカーネルモジュールが入りました
 ちなみにゲストファイルシステム側に linux カーネル本体を入れる必要はありません
ゲストLinux起動
 ゲストLinux 起動の前に ホスト側のネットワークインターフェース作成します
$ su
Password:
# tunctl -t tap0 -u 500
Set ‘tap0′ persistent and owned by uid 500
# ifconfig tap0 192.168.255.1 netmask 255.255.255.0 up
# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 36:d1:e7:3d:75:44
          inet addr:192.168.255.1  Bcast:192.168.255.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
#
 
$ su
Password:
# tunctl -t tap0 -u 500
Set ‘tap0′ persistent and owned by uid 500
# ifconfig tap0 192.168.255.1 netmask 255.255.255.0 up
# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 36:d1:e7:3d:75:44
          inet addr:192.168.255.1  Bcast:192.168.255.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
#
 
 tunctl時に -u で ゲストシステムを起動するユーザの UIDを指定する必要がありました
 (そうしないと ゲストLinuxの起動時に eth0 が up状態にできませんでした)
 tap0 は使い終わったら tunctl -d tap0 で削除できます
 
 
 ともかくホスト側に 192.168.255.0/24 のネットワークが構築されました
 ホスト側の準備は以上です
 
 ゲストLinuxを起動してみます
$ ~/linux-3.7.8/linux ubd0=~/uml_gentoo_st3_20120605 eth0=tuntap,tap0 mem=96M
Core dump limits :
        soft - 0
        hard - NONE
Checking that ptrace can change system call numbers…OK
Checking syscall emulation patch for ptrace…OK
Checking advanced syscall emulation patch for ptrace…OK
Checking for tmpfs mount on /dev/shm…OK
Checking PROT_EXEC mmap in /dev/shm/…OK
Checking for the skas3 patch in the host:
〜
 * Initializing random number generator …
 [ ok ]
INIT: Entering runlevel: 3
 * Bringing up interface eth0
 *   192.168.255.254 …
 [ ok ]
 *   Adding routes
 *     default via 192.168.255.1 …
 [ ok ]
 * Mounting network filesystems …
 [ ok ]
 * Generating dsa host key …
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
e2:da:53:06:1e:d5:97:b9:6e:e1:3a:94:4c:4c:9a:48 root@localhost
The key’s randomart image is:
+–[ DSA 1024]—-+
|         .   o   |
|      E . o +    |
|     . o = . .   |
|      + o o o    |
|     ..oSo + .   |
|     …o + +    |
|      .o . o     |
|     o.   o      |
|    . ..   .     |
+—————–+
 [ ok ]
 * Generating rsa host key …
Generating public/private rsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
6e:f1:ea:e7:bc:23:f1:d5:78:f7:4d:88:a5:a9:b3:a1 root@localhost
The key’s randomart image is:
+–[ RSA 2048]—-+
|                 |
|                 |
|                 |
|              .  |
|        S    B . |
|       ..o  * + o|
|        oooo . oo|
|       ..+*.    o|
|       .E+==     |
+—————–+
 [ ok ]
 * Starting sshd …
 [ ok ]
 * Starting local
bash: no job control in this shell
 
 初回起動のため SSHのサンプル鍵ペアが自動作成されてますが 使うことはありません
 既に SSHの鍵ペアは作成済のためです
 
 また ゲストLinux側のコンソールは起動プロセスが完了した後 プロンプトがなくなりました
 Xが動くホストシステムなら xtermが何枚か開いて ログインプロンプトが出るはずです
 
 ホストLinuxから TUN/TAP経由で SSHログインしてみましょう
$ ssh -i uml_admin admin@192.168.255.254 The authenticity of host ‘192.168.255.254 (192.168.255.254)’ can’t be established. RSA key fingerprint is 6e:f1:ea:**:**:**:**:**:**:**:**:**:**:a9:b3:a1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ‘192.168.255.254′ (RSA) to the list of known hosts. Password: admin@localhost ~ $
 ゲストシステムに SSHログインすることができました
 ここまでできれば 残りのシステム構築は SSH経由で可能です
admin@localhost ~ $ uname -a Linux localhost 3.7.8 #1 Tue Mar 5 23:08:40 JST 2013 x86_64 UML User Mode Linux GNU/Linux admin@localhost ~ $ ifconfig -a eth0: flags=4163mtu 1500 inet 192.168.255.254 netmask 255.255.255.0 broadcast 192.168.255.255 ether 0a:ea:b7:27:57:6f txqueuelen 1000 (Ethernet) RX packets 75 bytes 7145 (6.9 KiB) RX errors 0 dropped 6 overruns 0 frame 0 TX packets 44 bytes 6456 (6.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 5 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 344 (344.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 344 (344.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 admin@localhost ~ $ cat /proc/cpuinfo processor : 0 vendor_id : User Mode Linux model name : UML mode : skas host : Linux phenom 3.7.8 #9 SMP Tue Feb 26 19:37:43 JST 2013 x86_64 bogomips : 2505.11 admin@localhost ~ $ cat /proc/meminfo MemTotal: 90912 kB MemFree: 68276 kB Buffers: 1248 kB Cached: 11476 kB SwapCached: 0 kB Active: 9484 kB Inactive: 7116 kB Active(anon): 3908 kB Inactive(anon): 20 kB Active(file): 5576 kB Inactive(file): 7096 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 3892 kB Mapped: 3820 kB Shmem: 52 kB Slab: 4412 kB SReclaimable: 2448 kB SUnreclaim: 1964 kB KernelStack: 240 kB PageTables: 884 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 45456 kB Committed_AS: 10880 kB VmallocTotal: 534134768 kB VmallocUsed: 0 kB VmallocChunk: 534134768 kB admin@localhost ~ $ 
 ゲストシステムには 1CPUしか割り当てられないので
 シングルCPUマシンのように表示されます
 
 メモリは ゲスト起動時に mem=96M と割り当てられた通りです
 
 次に ネットワークの接続性です
admin@localhost ~ $ ping 192.168.0.254 PING 192.168.0.254 (192.168.0.254) 56(84) bytes of data. 64 bytes from 192.168.0.254: icmp_seq=1 ttl=64 time=0.042 ms 64 bytes from 192.168.0.254: icmp_seq=2 ttl=64 time=0.041 ms ^C — 192.168.0.254 ping statistics — 2 packets transmitted, 2 received, 0% packet loss, time 1007ms rtt min/avg/max/mdev = 0.041/0.041/0.042/0.006 ms admin@localhost ~ $ ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. ^C — 192.168.0.1 ping statistics — 2 packets transmitted, 0 received, 100% packet loss, time 1007ms admin@localhost ~ $
 ホストLinuxとは疎通しますが ホームゲートウェイとはつながりません
 なぜでしょうか?
 ホームゲートウェイに 192.168.255.0/24 へのルーティング設定が必要です
 ゲストファイルシステムの設定のところで説明した ネットワーク図を見ればわかりますが
 
 インターネットと接続するためには 上記ルーティングの追加と
 ゲストシステムへの DNS設定が必要となります
 また レンタルサーバとして他人に提供する場合にセキュリティ考慮が必要です
 家庭内LAN 192.168.0.0/24 が覗けないように DMZ化する検討が必要です
 ホストシステム側 tap0 に対するファイアウォール設定で実現できます
 
 最後に ゲストシステムのシャットダウンですが
 ゲストシステムがフリーズした場合など ホストシステムから制御する方法があります
 uml_mconsole コマンドが使えます ホストシステム側から下記のように操作します
$ cd ~/.uml $ ls yJ4qJG $ uml_mconsole yJ4qJG (yJ4qJG) int (yJ4qJG) quit $
 yJ4qJG と見えているのは UNIXドメインソケットです
 このソケットを通じてゲストシステムを制御できます
 int と入力するとゲストシステムが終了するのを確認できます