BSD界隈四方山話

第19回bhyveでCentOSを使ってみよう!

CentOS on bhyve!

FreeBSD 10.0-RELEASEから導入されたハイパーバイザbhyveを使用することで複数のゲストオペレーティングシステムをFreeBSDで実行できるようになりました。最初にターゲットになっていたのはFreeBSDゲストオペレーティングシステムでしたが、現在ではLinuxやOpenBSD、NetBSDをゲストオペレーティングシステムとして利用できます。

LinuxディストリビューションではRed Hat Enterprise Linux、CentOS、Debian、Fedora、OpenSUSE、Ubuntuなどが使えますが、今回はCentOS 6.7をインストールする方法を紹介します。

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

bhyveが動作する環境をセットアップします。カーネルモジュールとネットワークの設定に関しては前回の第18回 使ってみようハイパーバイザbhyveで説明しましたので、詳しくはそちらをご覧ください。まず、次のようにハイパーバイザとネットワークを用意します。

図1 bhyveを使用するための環境をセットアップ
# kldload vmm
# ifconfig tap1 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm bge0
# ifconfig bridge0 addm tap1

ネットワークインターフェースにはtap1を使っています。前回、FreeBSDゲストオペレーティングシステムにtap0を割り当てたので、今回はtap1にしてあります。

FreeBSD以外のオペレーティングシステムをゲストオペレーティングシステムとして利用するにはgrub2-bhyveが必要ですので、pkg(8)経由などでインストールしておきます。

図2 Linuxゲストを起動するためにgrub2-bhyveをインストール
# pkg install grub2-bhyve
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    5 MiB   1.1MB/s    00:05
Processing entries: 100%
FreeBSD repository update completed. 24279 packages processed.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        grub2-bhyve: 0.30_1

The process will require 1 MiB more space.
408 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching grub2-bhyve-0.30_1.txz: 100%  408 KiB 417.6kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing grub2-bhyve-0.30_1...
[1/1] Extracting grub2-bhyve-0.30_1: 100%
# 

システムを再起動して自動的にこれら設定が反映されるようにするには、/etc/rc.confおよび/etc/sysctl.confに次の設定を追加します。

リスト1 /etc/rc.confに追加する設定
cloned_interfaces="bridge0 tap0 tap1"
ifconfig_bridge0="addm em0 addm tap0 addm tap1"
リスト2 /etc/sysctl.confに追加する設定
net.link.tap.up_on_open=1

これでホスト側の設定は完了です。

CentOSをインストール

CentOS 6.7のインストールイメージをダウンロードします。

図3 CentOS 6.7のインストールイメージをダウンロード
# fetch http://ftp.iij.ad.jp/pub/linux/centos/6/isos/x86_64/CentOS-6.7-x86_64-minimal.iso
CentOS-6.7-x86_64-minimal.iso                 100% of  395 MB 2748 kBps 02m27s
#

インストール用にディスクイメージファイルを作成します。

図4 ゲスト用のディスクイメージファイルを作成
# truncate -s 32G centos-6.img

grub2-bhyveが使用する次のような設定ファイルを作成します。hd0およびcd0としてどのファイルを使用するのかを説明したマッピングファイルです。

図5 grub2-bhyveが使用する設定ファイルを用意
# cat centos-6-device.map
(hd0) ./centos-6.img
(cd0) ./CentOS-6.7-x86_64-minimal.iso
#

FreeBSD以外のオペレーティングシステムをbhyveで使用する場合には2段階のブートステップを踏みます。まずgrub2-bhyveを使ってカーネルを読み込みます。次にゲストオペレーティングシステムを起動します。

まず、インストーラを起動したいので次のようにgrub2-bhyveからLinuxカーネルを読み込みます。

図6 Linuxカーネルの読み込み
# grub-bhyve -m centos-6-device.map -r cd0 -M 2G centos-6

                                   GNU GRUB  version 2.00

   Minimal BASH-like line editing is supported. For the first word, TAB lists possible
   command completions. Anywhere else TAB lists possible device or file completions.

grub> ls
(cd0) (cd0,msdos1) (host)
grub> ls (cd0)
Device cd0: Filesystem type iso9660 - Label \`CentOS_6.7_Final' - Last modification time
2015-08-04 21:59:24 Tuesday, UUID 2015-08-04-21-59-24-00 - Total size 808960 sectors
grub> ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.jpg TRANS.TB
L vesamenu.c32 vmlinuz
grub> linux (cd0)/isolinux/vmlinuz
grub> initrd (cd0)/isolinux/initrd.img
grub> boot
# 

次にbhyve(8)でインストーラを実行します。

図7 ゲストの起動
# bhyve -A \                    APCIテーブルを生成
        -H \                    HLTインストラクション検出時に仮想CPUスレッドを生成
        -P \                    PAUSEインストラクション検出時にゲスト仮想CPUを強制終了
        -s 0:0,hostbridge \     ホストブリッジ
        -s 1:0,lpc \            LPC PCI-ISAブリッジ(COM1/COM2 16550シリアルポート付き)
        -s 2:0,virtio-net,tap1 \                Virtioネットワークインターフェース
        -s 3:0,virtio-blk,./centos-6.img \      Virtioブロックストレージインターフェース
        -s 4:0,ahci-cd,./CentOS-6.7-x86_64-minimal.iso \        ATAPI CD/DVD接続済AHCIコントローラ
        -l com1,stdio \         COM1設定
        -c 2 \                  仮想CPU
        -m 2G \                 ゲストに割り当てるメモリサイズ
        centos-6                ゲスト名
図8 CentOS 6.7のインストール
図8 CentOS 6.7のインストール

インストール自体は通常のCentOS 6系のインストールと同じなので特に迷うことはないでしょう。

インストールが完了したら次のように一旦ゲストオペレーティングシステムを終了しておきます。

図9 一旦ゲストを終了
# bhyvectl --destroy --vm=centos-6

CentOS 6.7 on FreeBSD 10.2-RELEASE!

インストールが完了しましたので、2段階ステップを踏んでCentOSを起動してみます。まず、次のようにしてLinuxカーネルを読み込みます。

図10 Linuxカーネルの読み込み
# grub-bhyve -m centos-6-device.map -r hd0,msdos1 -M 2G centos-6

                             GNU GRUB  version 2.00

   Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists possible
   device or file completions.

grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host) (lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)
grub> ls (hd0,msdos1)/
lost+found/ grub/ efi/ System.map-2.6.32-573.el6.x86_64 config-2.6.32-573.el6.x86_64 symvers-2.6.32-573.el6.x86_64.gz vmlinuz-2.6.32-573.el6.x86_64 initramfs-
2.6.32-573.el6.x86_64.img
grub> linux (hd0,msdos1)/vmlinuz-2.6.32-573.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub> initrd (hd0,msdos1)/initramfs-2.6.32-573.el6.x86_64.img
grub> boot
# 

Linuxカーネルを読み込んだら次にゲストオペレーティングシステムを起動します。

図11 ゲストの起動
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,./centos-6.img -l com1,stdio -c 2 -m 2G centos-6
図12 CentOS 6.7起動中
図12 CentOS 6.7起動中
図13 CentOS 6.7ログイン画面
図13 CentOS 6.7ログイン画面
図14 CentOS 6.7使用例
図14 CentOS 6.7使用例
図15 ゲストの終了
# bhyvectl --destroy --vm=centos-6

FreeBSDカーネル以外のゲストオペレーティングシステムを起動するには2段階ステップを践む必要がありますが、つぎのようにコマンドを実行すればワンライナーで起動することができます。

図16 ワンライナーで起動する
# printf "linux (hd0,msdos1)/vmlinuz-2.6.32-573.el6.x86_64 root=/dev/mapper/VolGroup-lv_root\ninitrd (hd0,msdos1)/initramfs-2.6.32-573.el6.x86_64.img\nboot\n" | grub-bhyve -m centos-6-device.map -r hd0,msdos1 -M 2G centos-6 && bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,/d/bhyve/centos-6.img -l com1,stdio -c 2 -m 2G centos-6

aliasを設定するなど個別にスクリプトに書いておくなどすれば、コマンド一発で起動できるようにもなります。

図17 aliasを設定すればもっと簡単に起動できる
# alias bhyve_centos_6='printf "linux (hd0,msdos1)/vmlinuz-2.6.32-573.el6.x86_64 root=/dev/mapper/VolGroup-lv_root\ninitrd (hd0,msdos1)/initramfs-2.6.32-573.el6.x86_64.img\nboot\n" | grub-bhyve -m centos-6-device.map -r hd0,msdos1 -M 2G centos-6 && bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,/d/bhyve/centos-6.img -l com1,stdio -c 2 -m 2G centos-6'

bhyveを使えば検証用に複数のバージョンのLinuxゲストを走らせておくといったことができて便利です。Linuxの検証作業や開発用に別途ハードウェアを用意する必要がなくなるのでその点でも効果が期待できます。

活用方法アレコレ

bhyveはシンプルで扱いやすく、応用が簡単といった特徴があります。検証や開発用の環境を構築して仮想ディスクイメージを共有したり、いろんなことができます。

次回は

前回と今回は仮想ディスクイメージとしてUFS2上のファイルを使いましたが、ZFSのボリュームを使った場合にはもっと優れた性能が期待できます。次回はUFS2上のディスクイメージファイルとZFSボリュームを使った場合にどの程度の違いがでるのかを取り上げたいと思います。

おすすめ記事

記事・ニュース一覧