仮想化 – 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 と入力するとゲストシステムが終了するのを確認できます