xhyveを試してみました
xhyve – Lightweight Virtualization on OS X Based on bhyve | pagetable.comに沿って試してみました。
確認した環境
- MacBook Pro (Retina, Mid 2012)
- OS X Yosemite 10.10.3
ソースからビルド
cd お好みの作業ディレクトリ
git clone https://github.com/mist64/xhyve
cd xhyve
make
Tiny Core Linuxを起動
./xhyverun.sh
起動メッセージが流れた後、画面がクリアされて以下のように表示されたら起動完了です。ここまで3〜4秒です。速い!
(�-
//\ Core is distributed with ABSOLUTELY NO WARRANTY.
v_/_ www.tinycorelinux.com
tc@box:~$ Switched to clocksource tsc
プロンプトにかぶってメッセージが出ていますが、enterを押せばプロンプトが出ます。
tc@box:~$
シャットダウンするには以下のコマンドを実行します。
sudo halt
Ubuntu Server 14.04.2のディスクイメージ作成
Ubuntu ServerのISOイメージをダウンロードして、ディスクイメージを作成するための準備を行います。元記事によると、OS Xがハイブリッドファイルシステムを認識しないので、Linux kernelとinitrdを取り出しているそうです。
mkdir ubuntu
cd ubuntu
curl -O ftp://ftp.kddilabs.jp/Linux/packages/ubuntu/releases-cd/14.04.2/ubuntu-14.04.2-server-amd64.iso
dd if=/dev/zero bs=2k count=1 of=/tmp/tmp.iso
dd if=ubuntu-14.04.2-server-amd64.iso bs=2k skip=1 >> /tmp/tmp.iso
hdiutil attach /tmp/tmp.iso
cp /Volumes/Ubuntu-Server\ 14/install/vmlinuz .
cp /Volumes/Ubuntu-Server\ 14/install/initrd.gz .
以下のコマンドでディスクイメージを作成します。ここでは bs=1g count=8
でディスクサイズを8GBとしていますが、お好みで調整してください。
dd if=/dev/zero of=hdd.img bs=1g count=8
xhyve/ubuntuディレクトリではなくxhyveディレクトリにディスクイメージ作成用のスクリプトを作ります。
cd ..
cat <<'EOF' > xhyverun_ubuntu_install.sh
#!/bin/sh
KERNEL="ubuntu/vmlinuz"
INITRD="ubuntu/initrd.gz"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off"
MEM="-m 1G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_CD="-s 3,ahci-cd,ubuntu/ubuntu-14.04.2-server-amd64.iso"
IMG_HDD="-s 4,virtio-blk,ubuntu/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"
EOF
スクリプトに実行パーミションをつけてsudo付きで実行します。
chmod +x xhyverun_ubuntu_install.sh
sudo ./xhyverun_ubuntu_install.sh
テキストインストーラが起動しますので、以下のように選択してインストールしました。
- Select a language: English
- Select your location: other -> Asia -> Japan
- Configure locales: United Status - en_US.UTF-8
- Hostname: お好みの名前
- Set up users and passwords: お好みのIDとパスワードで作成
- time zone: Asia/Tokyo
- Partition disks: Guided - use entire disk
- HTTP proxy: 無し
- manage upgrades: No automatic updates
- Software selection:
- Basic Ubuntu Server
- OpenSSH server
- Install GRUB to the master boot record: Yes
- Is the system clock set to UTC: No
- Installation complete: Go Back -> Execute a shell
Installation completeのところでContinueではなくGo Backでメニューに戻りExecute a shellを選んで進み、シェルが起動したら以下のコマンドを実行します。
cd /target
sbin/ifconfig
tar c boot | nc -l -p 1234
上記のコマンド実行のうちsbin/ifconfigで表示されたIPアドレスをメモしておきます。
/target # sbin/ifconfig
eth0 Link encap:Ethernet HWaddr e6:0d:f2:6b:cf:32
inet addr:192.168.64.3 Bcast:192.168.64.255 Mask:255.255.255.0
inet6 addr: fe80::e40d:f2ff:fe6b:cf32/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25405 errors:0 dropped:0 overruns:0 frame:85
TX packets:13601 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:38179647 (38.1 MB) TX bytes:931189 (931.1 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Mac側では以下のコマンドを実行します。IPアドレスはifconfigで表示されたものに置き換えて実行してください。
cd ubuntu
nc 192.168.64.3 1234 | tar x
VMのシェルのプロンプトで以下のように入力してシェルを終了します。
exit
メニューに戻ったら Finish the installation
を選びます。
- Is the system clock set to UTC?: No
- Installation complete: Continue
Ubuntu Server 14.04.2の起動
Macでxhyve/ubuntuではなくxhyveのディレクトリで起動用のスクリプトを作成します。
cat <<'EOF' > ./xhyverun_ubuntu.sh
#!/bin/sh
KERNEL="ubuntu/boot/vmlinuz-3.16.0-30-generic"
INITRD="ubuntu/boot/initrd.img-3.16.0-30-generic"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off root=/dev/vda1 ro"
MEM="-m 1G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_HDD="-s 4,virtio-blk,ubuntu/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"
EOF
スクリプトに実行パーミションをつけてsudo付きで実行してUbuntuを起動します。
chmod +x ./xhyverun_ubuntu.sh
sudo ./xhyverun_ubuntu.sh
起動してログインプロンプトが出たらインストール時に作成したユーザでログインします。IPアドレスはDHCPで取得する設定にしたのですが、確認してみると、ディスクイメージ作成時とは違う値になっていました。
$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 62:ca:c1:25:cf:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.64.4/24 brd 192.168.64.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::60ca:c1ff:fe25:cf32/64 scope link
valid_lft forever preferred_lft forever
Macからsshでログインも出来ました。
ssh ubuntu@192.168.64.4
sshでログインすると初回だけ表示が24行に限定され、リターンを押しても24行の範囲でスクロールされるようになってしまいました。Mac側ではiTermで65行にしていました。と、この説明を書くためにiTermのウィンドウで高さを変えて行数を変えて戻してとやっていたら、次のsshログインからはiTermの行数で表示されるようになりました。
Ubuntuを停止するにはVM内で以下のコマンドを実行します。
sudo shutdown -h now
Ubuntuの起動に必要なファイル
ubuntuフォルダにはビルドに使用したファイルも含まれていますが、起動スクリプトで参照されているファイル以外のファイルを別ディレクトリに移動して起動してみたら起動出来ました。ということで、起動には以下の4つのファイルだけあればOKです。
./xhyverun_ubuntu.sh
ubuntu/boot/initrd.img-3.16.0-30-generic
ubuntu/boot/vmlinuz-3.16.0-30-generic
ubuntu/hdd.img
まとめ
xhyveをソースからビルドして、Tiny Core LinuxとUbuntu Server 14.04.2を動かしてみました。TODOによると、まだいろいろ対応予定の項目があるようです。今後が楽しみです!