UML (User Mode Linux) 構築

仮想化 – UML (User Mode Linux)

過去の Software Design を読み返していたら UMLを紹介する記事がありました
最近の自己課題となっている仮想化環境実現の選択肢になるかと考え
最新の Linuxカーネルで試してみたらちゃんと動作したので その紹介をします

Software Design 2002-02
UMLとは User Mode Linuxの略でつまり
既に動いている Linuxシステム上で 別の Linuxカーネルを動かせます
いわゆる JAIL環境です ゲストとしての Linuxは割り当てられたリソース範囲内で動作します

ホストシステム構成K/caption>

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 Downloads Page
UMLのダウンロードページから ソースファイルを拾ってきて
以下のようにビルドします

$ 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 ベースのシステムを準備します
Gentoo amd64 Downloads Page
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
#
 

ファイルシステムへの書き込みのために 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仮想ネットワークを利用した
下記のネットワークで構築します
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
 

UML専用のメニュー項目がいくつか見えます
UML Linux Kernel Config 1
ほとんどの選択肢は 初期状態のままで大丈夫です
ポイントとなる箇所を 下記画面キャプチャで紹介します
UML Linux Kernel Config 2
UML-specific options の Host filesystem はここでは無効化しています
Host filesystemとは ゲストシステム側からホスト側のディレクトリをマウントする便利機能です

ゲストシステムを他人に渡して使ってもらうような サーバレンタル用途を考えているなら
ホストシステムファイルの参照権限を渡さないほうがよいでしょう
UML Linux Kernel Config 3
UML Charcter Devices で ゲスト側の起動コンソールを設定できます

ゲスト側ブートコンソールとなるのが Default main console channel initialization の部分で
fd:0,fd:1 という指定は 標準出力と標準入力を使ってください という意味です

その下の xterm という指定は コンソールログイン端末の指定です
ブート完了時に xtermが開いてログインプロンプトが表示されます
ただし検証環境は Xサーバを動かしてないモニタレスサーバなので xtermは立ち上がりません
UML Linux Kernel Config 4
Block devices では Virtual block device というのが重要です
これにより 先ほどのOSイメージを扱う ubd仮想デバイスが使えるようになります
UML Linux Kernel Config 5
UML Network Devices でネットワークデバイス関連の設定が可能です
TUN/TAP経由でホスト側と仮想ネットワーク接続するので TUN/TAPの設定が必要です
また複数のゲストLinuxを仮想ネットワーク接続する場合 Daemon transportが必要です
UML Linux Kernel Config 6
最後 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)

#
 

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

最後に

UMLを使うことで 仮想マシンに近い環境を構築できることを確認しました

ただし User Mode と冠がついているのとは実際は異なり
(カーネルは 一般ユーザ権限でビルドできますが)
ファイルシステムの作成 や TUN/TAPインターフェースの生成に root権限が必要です
(ファイルシステムについては UML用のイメージを探すなどの代替策は考えられます)