BSD界隈四方山話

第18回使ってみようハイパーバイザbhyve

ハイパーバイザbhyve

FreeBSD 10.0-RELEASEからFreeBSDにはbhyve(ビハイブ)と呼ばれるハイパーバイザが導入されました。この機能を使うとFreeBSDホスト上で複数のゲストオペレーティングシステムを実行することができます。Jailと異なり、異なるカーネルを同時に実行することが可能です。

今回はFreeBSDホストでFreeBSDゲストをインストールして使う方法を紹介します。同一、または異なるバージョンのFreeBSDを同時に実行する必要がある場合や、特定のカーネルオプションを有効にしたカーネルが必要になる場合などに便利です。

bhyveが動作する環境をセットアップ

bhyveが動作するにはvmmカーネルモジュールが必要です。kldload(8)コマンドを使ってvmmカーネルモジュールを読み込みます。

図1 vmmカーネルモジュールの読み込み
# kldload vmm
# kldstat
Id Refs Address            Size     Name
 1    9 0xffffffff80200000 179ddb0  kernel
 2    1 0xffffffff81a11000 56aa     fdescfs.ko
 3    1 0xffffffff81a17000 2baa     uhid.ko
 4    1 0xffffffff81a1a000 1b1baf   vmm.ko
#

システム起動時に自動的に読み込まれるようにするには、/boot/loader.confファイルに次の設定を追加します。

リスト1 /boot/loader.confに追加する設定
vmm_load="YES"

次に、ゲストオペレーティングシステムが使用するネットワークインターフェースを作成します。まず、次のようにifconfig(8)コマンドを使ってtapインターフェースを作成します。

図2 tapインターフェースを作成
# ifconfig tap0 create
# ifconfig tap0
tap0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether 00:bd:06:ae:69:00
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: no carrier
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# 

このtapインターフェース経由でネットワークにアクセスできるように、次のようにブリッジを作成して、そこに実際に利用できるネットワークインターフェースと、先ほど作成したtapインターフェースの双方を追加します。次の例ですと、bge0がホストに物理的に存在しているネットワークインターフェースです。

図3 ブリッジの作成
# ifconfig bridge0 create
# ifconfig bridge0 addm bge0 addm tap0 up
# ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 02:2f:69:94:60:00
        nd6 options=9<PERFORMNUD,IFDISABLED>
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        member: bge0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 20000
#

bridgeはソフトウェア的に作成されたスイッチングハブ、tap0はソフトウェア的に作成されたスイッチングハブのポートだとイメージしてみてください。ゲストオペレーティングシステム側にtap0を割り当てることで、ゲストオペレーティングシステムからネットワークが利用できるようになります。

システム起動時に自動的にこれら作業を行うには/etc/rc.confに次の設定を追加します。

リスト2 /etc/rc.confに追加する設定
cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm em0 addm tap0"

複数のゲストオペレーティングシステムを動作させる場合、tap0のところをtap0 tap1 tap2のように増やすとともに、addm tap0 addm tap1 addm tap2のようにそれぞれ追加してください。

あとは、/etc/sysctl.confに次の設定を追加します。

リスト3 /etc/sysctl.confに追加する設定
net.link.tap.up_on_open=1

これでbhyveを使うための設定完了です。

FreeBSDゲストをインストール

ここではFreeBSD 10.2-RELEASEホストに、FreeBSD 10.2-RELEASEゲストをインストールします。まず、ゲストオペレーティングシステムをインストールすることになる仮想ディスクファイルをtruncate(1)コマンドを使って次のように作成します。ここでは32GBのファイルを作成しています。

図4 仮想ディスクを作成
# truncate -s 32G freebsd-10.2.img

インストールに使うISOイメージをダウンロードしてきて展開します。

図5 インストールイメージのダウンロードと展開
# fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.2/FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz
FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz       100% of  413 MB 5844 kBps 01m13s
# unxz FreeBSD-10.2-RELEASE-amd64-disc1.iso.xz

次のようにスクリプトを実行してインストールイメージから仮想環境を起動してインストール作業を行います。

図6 bhyveで動作注のインストーラ
# sh /usr/share/examples/bhyve/vmrun.sh \
        -c 2 \                          割り当てる仮想CPUの数
        -m 2G \                         割り当てるメモリサイズ
        -t tap0 \                       利用するtapインターフェース
        -d freebsd-10.2.img \           利用する仮想ディスクファイル
        -i \                            指定したCDから起動するための指定
        -I FreeBSD-10.2-RELEASE-amd64-disc1.iso \ 使用するCDの指定
        freebsd-10.2                    仮想マシンの名前を指定

スクリプトを実行すると次のようにインストーラが起動してきます。

図7 インストーラ起動の途中でターミナルの種類を選択。そのままリターンキーを押す
図7 インストーラ起動の途中でターミナルの種類を選択。そのままリターンキーを押す
図8 通常のインストール手順と同じようにインストール
図8 通常のインストール手順と同じようにインストール
図9 インストール中
図9 インストール中

インストール自身は通常のインストールと同じなので、特に困ることはないと思います。

インストールするゲストオペレーティングシステムがFreeBSD 10.1-RELEASEまたはFreeBSD 9.3-RELEASEよりも前の場合には、システムコンソール付きでシステムが起動してくるようにインストールした先の/etc/ttysを編集する必要があります。編集する場合にはまず、インストール終了後にシェルへ移行します。

図10 インストール終了後にシェルへ移行
図10 インストール終了後にシェルへ移行

インストール先の/etc/ttysファイルのttyu0の行を次のように書き換えます。

リスト4 インストール先の/etc/ttysのttyu0の行をこのように書き換える
ttyu0   "/usr/libexec/getty 3wire"   xterm  on secure

システムを再起動すると再びインストーラが起動してきますので、ブートローダのあたりで3を押してローダに移行して一旦処理を止めます。

図11 ブートローダで一旦停止
図11 ブートローダで一旦停止

ほかのターミナルから次のように仮想マシンの名前を指定して仮想マシンを停止させます。

図12 仮想マシンを停止
# bhyvectl --destroy --vm=freebsd-10.2

これでゲストオペレーティングシステムのインストールは完了です。

FreeBSD on FreeBSDを実行!

インストールが完了したらあとは次のようにスクリプトを実行して仮想環境を起動することで使用できるようになります。

図13 FreeBSD on FreeBSDを起動
# sh /usr/share/examples/bhyve/vmrun.sh -c 2 -m 2G -t tap0 -d freebsd-10.2.img freebsd-10.2
図14 FreeBSD 10.2-RELEASE on bhyve/FreeBSD 10.2-RELEASE
図14 FreeBSD 10.2-RELEASE on bhyve/FreeBSD 10.2-RELEASE

ゲストオペレーティングシステム側のネットワークインタフェースは次のようにvtnet0として認識されます。

図15 ゲスト側のネットワークインターフェースはvtnet
root@trybsd:~ # ifconfig
vtnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>
        ether 00:a0:98:bc:5e:c2
        inet 192.168.1.29 netmask 0xffffff00 broadcast 192.168.1.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
root@trybsd:~ #

Jailと違ってホスト側にはtap0にどのIPアドレスが割り当てられているかは表示されません。ただし、ping(1)で叩けば返事が返ってきますし、ネットワークは利用できる状況になっています。

複数のカーネルを混在させる

アプリケーションによっては特定のバージョンのカーネルではないと動作しないといったものがあります(書き換えればよいのですが、もう担当者がいないとか、だれも書き換える気がないとか、状況はさまざまですけれど⁠⁠。bhyveを使うと複数のバージョンのカーネルを混在させることができるので便利です。

同一のカーネルであっても完全に分離した動作環境が欲しいといったケース(もともとはこれが目的なわけですが)でも使えますし、カーネルの開発にも使用できます。ホストでゴリゴリカーネルやカーネルモジュールを開発するとパニック発生時にいろいろ面倒なことがありますが、仮想環境だとそのあたりが手軽で済みます。

bhyveはFreeBSD以外のオペレーティングシステムのいくつか(Red Hat Enterprise Linux、CentOS、Debian、Fedora、OpenSUSE、Ubuntu、OpenBSD、NetBSD)が動作します。将来的にはWindowsを動作させることも視野に入れているようです。次回はゲストオペレーティングシステムとしてLinuxをインストールする方法を紹介します。

参考文献

おすすめ記事

記事・ニュース一覧