2015/10/28

bhyveで仮想マシン作成

Filed under: FreeBSD,構築メモ — てらき at 21:22


●今回の目的

FreeBSDでは,旧来からLinuxエミュレーション機能がある.でもエミュレーションなので動かないものもある…
最近のFreeBSDは,bhyveというハイパーバイザーが実装されており,仮想マシンを作ることができる.ならば,エミュレーションよりも,Linux仮想マシンを作った方が確実に動くっちゅーことで,FreeBSD上に,CentOSの仮想マシンを作ることにしました.


●導入開始
0. 前提条件

bhyveは10.0-RELEASEで正式リリースとなりました.
モノとしてはLinuxのKVMのFreeBSD版と言った感じ.
ただ,CUI/GUI共にコマンドサポートはKVMには程遠く,とりあえずVMが作れて,動かすことができるといった感じ.
CPUにはVMとしての必須要件があり,Intel CPU:VT-x,EPT/AMD CPU:AMD-V,Nested Page Tables が必要.
うちのFreeBSDマシンは,10.2-REL,Intel Core i5なんで上記要件はクリア.
仮想化用に1TBのHDD追加し,そこにディスクイメージを作成してVMを動かすことにしました.

OS FreeBSD 10.2-RELEASE
CPU Intel Core i5
HDD sATA 1TB


1. 追加ディスクの組込み

GPTフォーマットして,新たなzpoolを作成する.
VMは新たなzpool上にストレージイメージを配置する.

# gpart create -s gpt ada5
# gpart add -t freebsd-zfs -l vmdisk0 ada5
# gpart show ada5
=>        34  1953525101  ada5  GPT  (932G)
          34          94        - free -  (47K)
         128  1953525000     1  freebsd-zfs  (932G)
  1953525128           7        - free -  (3.5K)
# zpool create vmdisk gpt/vmdisk0
# zpool status vmdisk
  pool: vmdisk
 state: ONLINE
  scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        vmdisk         ONLINE       0     0     0
          gpt/vmdisk0  ONLINE       0     0     0

errors: No known data errors


2. OS設定変更

まずはカーネルモジュールの設定.
bhyveが動作するにはvmmカーネルモジュールが必要.また,VM起動時にバックグラウンド起動し,コンソール接続を出来る様にしたいので,nmdmカーネルモジュールもロードする.

# kldload vmm
# kldload nmdm


次はネットワークの設定.
VMが使用する仮想インタフェイス(tap)を作成し,それと物理インタフェイスを接続するためのブリッジ(bridge)を作成してVMがネットワーク接続できるようにする.イメージはこんな感じ.

      ┌────────────────────┐
      |PM                                      |
      |  ┌─────┐      ┌─────┐    |
      |  |VM#0      |      |VM#1      |    |
      |  |          |      |          |    |
      |  └──□──┘      └──□──┘    |
      |        |vNIC(tap0)        |vNIC(tap1)|
      |        |                  |          |
      |    ┌─■─────────■─┐      |
      |    |vSwitch(bridge0)          |      |
      |    └──────■──────┘      |
      |                  |                    |
      |                  |                    |
      └─────────□──────────┘

# ifconfig tap0 create
# ifconfig tap1 create
# sysctl net.link.tap.up_on_open=1
# ifconfig bridge0 create
# ifconfig bridge0 addm fxp0 addm tap0 addm tap1 up
# ifconfig bridge0
bridge0: flags=8843 metric 0 mtu 1500
        ether 02:3f:fb:54:e2:00
        nd6 options=1
        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: tap1 flags=143
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        member: tap0 flags=143
                ifmaxaddr 0 port 3 priority 128 path cost 2000000
        member: fxp0 flags=143
                ifmaxaddr 0 port 1 priority 128 path cost 200000
※fxp0がVMへのNWを通す物理NIC


上記設定をOS起動時に自動設定できる様に設定ファイルを更新しておく.

・/boot/loader.conf
vmm_load="YES"
nmdm_load="YES"
・/etc/rc.conf
cloned_interfaces="bridge0 tap0 tap1"
ifconfig_bridge0="addm fxp0 addm tap0 addm tap1"
・/etc/sysctl.conf
net.link.tap.up_on_open=1

これでbhyveを使用する環境が整いました~.


3. CentOSのVMインストール

今回はCentOS7.1(build:1503)をインストール.
ISOファイルはここから取得し,あらかじめFreeBSD上に配置しておきます.
VMのストレージサイズは一先ず100GB.これだけあれば全然余裕でしょ.
イメージは,zfs上にある方がパフォーマンスが出るらしいのでそちらで構築する(一応,UFS使用時の方法も記載)
なお,VMを操作する為のファイルたちは”/vmdisk/files”配下に配置することに.

・VMストレージイメージの作成
# mkdir -p /vmdisk/files/ISO
# cd /vmdisk/files

# zfs create -V100G -o volmode=dev vmdisk/centos_0
# vi centos_0-device.map
-----
(hd0) /dev/zvol/vmdisk/centos_0
(cd0) ./ISO/CentOS-7-x86_64-DVD-1503-01.iso
-----
・VMカーネル起動
# grub-bhyve -m centos_0-device.map -r cd0 -M 1G centos_0
grub> linux /isolinux/vmlinuz
grub> initrd /isolinux/initrd.img
grub> boot
・VM起動
# bhyve -c 2 -m 1G -H -P -A -l com1,stdio \
  -s 0:0,hostbridge -s 1:0,lpc \
  -s 2:0,virtio-net,tap0 \
  -s 3:0,virtio-blk,/dev/zvol/vmdisk/centos_0 \
  -s 4:0,ahci-cd,./ISO/CentOS-7-x86_64-DVD-1503-01.iso \
  centos_0

上記,bhyveコマンドを実行すると,ISOイメージからブートし,CentOSのInstallerが起動する.

※UFS使用時には…
・VMストレージイメージは truncate で作成する.
ZFS:# zfs create -V100G -o volmode=dev vmdisk/centos_0
      ↓
UFS:# truncate -s 100G centos_0.img
・以降,設定ファイル,コマンド実行時のイメージ指定を変更する.
ZFS:/dev/zvol/vmdisk/centos_0
      ↓
UFS:./centos_0.img


4. CentOSのVM起動

CentOSのインストールが完了すると,VMがシャットダウンされ,FreeBSDのプロンプトが返ってきます.
しかし,bhyveのリソースは残ったままで,次回のVM起動が出来なくなるので一旦削除する必要があります.これは仕様なのか,通常シャットダウン時にも同様に残っているので,起動前には一度リソースを削除する癖をつけた方が良いかもしれません.

・VMカーネル起動
# bhyvectl --vm=centos_0 --destroy
# grub-bhyve -m centos_0-device.map -r hd0,msdos1 -M 1G centos_0
grub> ls (hd0,msdos1)/
※ここで表示されるvmlinuz,initramfsを使用してカーネルロードする.
grub> linux (hd0,msdos1)/vmlinuz-3.10.0-229.el7.x86_64 root=/dev/mapper/centos_centos-root
grub> initrd (hd0,msdos1)/initramfs-3.10.0-229.el7.x86_64.img
grub> boot
・VM起動
# bhyve -c 2 -m 1G -H -P -A -l com1,stdio \
  -s 0:0,hostbridge -s 1:0,lpc \
  -s 2:0,virtio-net,tap0 \
  -s 3:0,virtio-blk,/dev/zvol/vmdisk/centos_0 \
  centos_0

単なるVM起動時は,インストールDVDをマウントしなくても良いので外している.
必要なら,インストール時の設定と同様にスロットオプションを足せば良い.


しかし,このままだとターミナルを占領し,バックグラウンドで動けないので,一旦VMをシャットダウンし,起動スクリプトを作成してバックグラウンドで実行できるようにします.


5. CentOSのVM起動スクリプト

前項にあるように,VMを起動するには結構なコマンドを打つ必要があり,正直面倒ですw.
これをスクリプトにし,簡単に起動できるようにしておきましょう.
また,COM1の出力をnullmodemにしておき,必要な時にコンソールアクセスできるようにしておく.

・grub定義ファイル
# vi /vmdisk/files/centos_0-grub.ini
-----
linux (hd0,msdos1)/vmlinuz-3.10.0-229.el7.x86_64 root=/dev/mapper/centos_centos-root
initrd (hd0,msdos1)/initramfs-3.10.0-229.el7.x86_64.img
boot
-----
※VMカーネル起動時に指定したgrubコマンドを記載しておく.
・VM起動スクリプト
# vi /vmdisk/files/centos_0-start.sh
-----
HOME="/vmdisk/files/"

cd ${HOME}

bhyvectl --vm=centos_0 --destroy

grub-bhyve -m centos_0-device.map \
 -r hd0,msdos1 -M 1G centos_0 \
 < centos_0-grub.ini > /dev/null

bhyve -c 2 -m 1G -H -P -A -l com1,/dev/nmdm0A \
  -s 0:0,hostbridge -s 1:0,lpc \
  -s 2:0,virtio-net,tap0 \
  -s 3:0,virtio-blk,/dev/zvol/vmdisk/centos_0 \
  centos_0 &
-----
# chmod 500 /vmdisk/files/centos_0-start.sh

これで,上記スクリプトを実行するとCentOSがバックグラウンドで起動します.

・コンソールアクセス方法
# cu -l /dev/nmdm0B -s 9600

※終了時は"~."で通信終了

あとはCentOSを使い倒せばいいでしょう!


●改版履歴

2015.10.28初版

TrackBack URL : http://blog.prism-r.com/wp-trackback.php?p=1529

コメントはまだありません »

No comments yet.

RSS feed for comments on this post.
TrackBack URI : http://blog.prism-r.com/wp-trackback.php?p=1529

Leave a comment