Xenとほぼ同時期の2002年頃から筑波大学にてユーザレベルOSという独自のアーキテクチャが本格研究されてきました(準仮想化技術の一種)。
本手法はカーネルコンパイル時に静的にカーネルコードの特権命令(及び特権命令に関連深い非特権命令)を機械的にサブルーチンで置き換えて、
ゲストOS側からのシステムコールを仮想マシン側で処理するというシンプルなものです。
このアーキテクチャを実装したソフトウェアとしてLilyVMがオープンソースとして公開されています(通称「軽量VM」)。
※ホストOS/ゲストOS共に32ビットOS限定となります。
LilyVMの最初の発表ではLinuxだけを実装対象にしていました。
しかしLilyVM 2003ではNetBSD/FreeBSDもサポート対象にして、更にネットワーク機能も本格サポートされています。
※LilyVMをMac OS Xに移植したという報告もあります(スクリーンキャプチャ付きで)。
LilyVMでのゲストOSは完全なユーザプロセスとして実行されます。
LilyVMに近い概念をもつ仮想化ソフトとしてUML(User Mode Linux)というものがあります。
しかしLilyVMではホスト/ゲスト共にLinuxに限定しないところがUMLと大きく異なります。
またLilyVMは仮想マシン環境ではないためVGAカードなどのエミュレート機能はありませんがネットワーク環境を簡単に構築できるのも大きな特徴です。
LilyVMは研究目的のプロトタイプ的傾向が強く以下の制限があり実用レベルに仕上げるにはコミュニティの力が必要のようです。
(1)ソフトウェアとしてのLilyVMの仕様が不明確で仕様に関するドキュメントが未整備です。
(2)ユーザマニュアルやオンラインヘルプ(lilyvm --help)もありません。
※LilyVM起動オプションはlilyvm.cソースを眺めればおよそのことは分かります(オプションチェックは大雑把です)。
(3)ゲストOSのネットワーク設定方法についての詳細が明確化されていません(DHCP使用不可)。
※実際には仮想ネットワークデバイス(tun)を使用したレイヤ3の単純なPoint-to-Pointをエミュレートします(低速通信です)。
(4)ゲストOSの実行に重点が置かれており使い勝手やチューニングについてはあまり考慮されていないようです(例:メモリ割当て等)。
(5)ホストOSとゲストOSの協調に関する信頼性確保やハードウェアの仮想化支援技術の利用も課題となっています。
(6)LilyVMのソースはCVSでの公開となっていますが新しいOS(ディストリビューション)には追従していません。
しかしながらLilyVMの導入は他の仮想化ソフトに比べて極めて単純でかつ持ち運びにも便利なようになっています。
※LilyVM自体の導入はシステム全体の他の設定ファイルに全く影響を与えません。
更にLilyVMのゲストOS用サンプル仮想ディスクも公開されており手軽に試行できるようになっています。
ここではCentOS 4.4をLilyVM環境のホストOSとして利用し、
そのゲストOSとしてDebian GNU/Linux 3.0/3.1やVine Linux 3.1(GUI操作)を使用する手順を紹介します。
(今回は公開版Debian用仮想パーティションイメージファイルをそのまま利用する方法に重点を置いています)
尚、ゲストOSをホストOSの物理ネットワークに参加させるネットワーク接続設定手順についても説明しています。
※ホストOSとしてVine Linux 4.0, Fdora Core 5, Debian GNU/Linux 4.0を使用する方法も補足しています。
1.ホストOS側でのLilyVM環境の構築
LilyVMにはバイナリパッケージというものはありません。
このため手作業にてLilyVM環境をソースから構築する必要があります。
【ソースチェックアウト実行結果】 cvs checkout: Updating lilyvm U lilyvm/COPYING U lilyvm/Makefile U lilyvm/Makefile.freebsd U lilyvm/as-guest U lilyvm/code.lds U lilyvm/code_asm.S U lilyvm/code_c.c U lilyvm/code_c.h U lilyvm/constants.h U lilyvm/lilyvm-common.h U lilyvm/lilyvm.c U lilyvm/loadkernel.c U lilyvm/loadkernel.h U lilyvm/memaccess.c U lilyvm/memaccess.h U lilyvm/network.c U lilyvm/network.h U lilyvm/parseargs.c U lilyvm/parseargs.h U lilyvm/start-freebsd U lilyvm/start-linux U lilyvm/start-netbsd U lilyvm/sysdep.h U lilyvm/sysdep_freebsd.c U lilyvm/sysdep_freebsd.h U lilyvm/sysdep_linux.c U lilyvm/sysdep_linux.h U lilyvm/sysdep_netbsd.c U lilyvm/sysdep_netbsd.h U lilyvm/timer.c U lilyvm/timer.h cvs checkout: Updating lilyvm/vmlib |
startkernel Linux version 2.4.27 (aaa@bbb.ccc.ddd.ac.jp) ※便宜上、伏字/改行しました (gcc version 2.96 20000731 (Red Hat Linux 7.2 2.96-112.7.1)) #2 Tue Nov 16 16:15:58 JST 2004 BIOS-provided physical RAM map: BIOS-e801: 0000000000000000 - 000000000009f000 (usable) BIOS-e801: 0000000000100000 - 0000000004000000 (usable) 64MB LOWMEM available. - 部分省略 - Memory: 60440k/65536k available (896k kernel code, 4708k reserved, 204k data, 52k init, 0k highmem) - 部分省略 - Checking 'hlt' instruction... OK. POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket - 部分省略 - Setting kernel variables. Mounting local filesystems... mount: fs type hostfs not supported by kernel Running 0dns-down to make sure resolv.conf is ok...done. Cleaning: /etc/network/ifstate. Setting up IP spoofing protection: rp_filter. Configuring network interfaces: done. - 部分省略 - INIT: Entering runlevel: 2 Starting system log daemon: syslogd. Starting kernel log daemon: klogd. Starting internet superserver: inetd. Starting printer spooler: lprng. Starting deferred execution scheduler: atd. Starting periodic command scheduler: cron. Debian GNU/Linux 3.0 user-level-linux serial/0 user-level-linux login: |
auto lo iface lo inet loopback auto vmn0 iface vmn0 inet static address 10.0.0.1 network 10.0.0.0 netmask 255.0.0.0 broadcast 10.255.255.255 gateway 10.0.0.254 |
【変更例】 address 192.168.0.30 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 |
Give root password for maintenance (or type Control-D to continue): rootパスワード指定 |
auto lo iface lo inet loopback auto vmn0 iface vmn0 inet static address 192.168.0.31 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 |
Configure the network interface tun0 here. After that, press any key to continue. Example: LAN: 192.168.0.0/24 guest: 192.168.0.101 host: 192.168.0.100 # ifconfig tun0 192.168.0.100 pointopoint 192.168.0.101 # arp -Ds 192.168.0.101 eth0 pub # echo 1 > /proc/sys/net/ipv4/ip_forward |
(a)rootログインを許可します。 (b)Xサーバ部分をXvfbに変更します。 (c)XDMCP接続を許可します。 (d)通常のXサーバの自動起動を抑止します(#0=Standardにします)。 (e)DefaultLocale=ja_JP.EUC-JPの追加。 (f)KillInitClients=trueの有効化。(2)/etc/services
Give root password for maintenance (or type Control-D to continue): rootパスワード指定 |
/dev/vmdisk0 / ext3 defaults 0 1 proc /proc proc defaults 0 0 |
Configure the network interface tun0 here. After that, press any key to continue. Example: LAN: 192.168.0.0/24 guest: 192.168.0.101 host: 192.168.0.100 # ifconfig tun0 192.168.0.100 pointopoint 192.168.0.101 # arp -Ds 192.168.0.101 eth0 pub # echo 1 > /proc/sys/net/ipv4/ip_forward |