freebsd vm-bhyveメモ

FreeBSD bhyveを使用したvm-bhyve+ZFSを使ったxenserverからの移行に関するメモ、ということでメモベースで。VMware ESXiやxenserverなどでも同様のことができますが、あちら様は営利企業なのでどうしてもお金を稼がないといけないところがあり必要であれば技術は隠します。とはいえ、さすがにxenserver 7.0マシンを放っておくわけには行かなくなったのでFreeBSD vm-bhyve+ZFSにマイグレします。Linuxでは同様の技術にKVMがありますが、これを使わないのは情報は多く出回るにしろ頻繁に使用技術・ソフトが流行り廃りに影響されて年単位で移りゆく恐れがあるからです。そのたびに覚え直すのはめんどい。
FreeBSD bhyveの弱点はBIOSを持たないことなので、ほぼamd64/EFIで起動できるOS決め打ちです。たとえば2001年に発売されたWindows XPはMBRで整理されたパーティションを利用することが前提であり、EFI環境下では使用することはできません。※2021年04月現在では一部OSでのi386環境の起動が可能なようです。公式サイトを確認しましょう。

使用にあたってのイニシャライズ(vm init)やめぼしい部分(/etc/rc.conf、vm switch)についてはGoogle検索ができれば解決できると思われるので暇でもない限りずっと書けないかもしれない。


■ホストマシン再起動時に共通switchがうまく立ち上がらない:例えば仮想マシン間はOK、インターネットやホストマシン含めた物理マシンにpingしても応答がない
→bridgeに正しくホストマシンの物理イーサネットデバイスが追加されていない恐れがある。確認項目としては、/path/to/vm/.config/system.confにおける下記の内容について書き換える。(ここではホストマシンの物理インタフェースをem0とする)

# vm switch add bhyve-public em0 実行時の/path/to/vm/.config/system.conf
01: switch_list="bhyve-public"
02: type_bhyve-public="standard"
03: ports_bhyve-public="public em0"

これを書き換える
01: switch_list="bhyve-public"
02: type_bhyve-public="standard"
03: ports_bhyve-public="em0"

お好みの方法で再起動して、ifconfigコマンドで確かめる。
# shutdown -r now
# reboot
# init 6

01: # ifconfig vm-bhyve-public
02: vm-bhyve-public:
03: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
04:    ether ho:ge:ho:ge:ho:ge
05:    id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
06:    maxage 20 holdcnt 6 proto stp-rstp maxaddr 2000 timeout 1200
07:    root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
08:    member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
09:            ifmaxaddr 0 port 4 priority 128 path cost 2000000
10:    member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
11:            ifmaxaddr 0 port 1 priority 128 path cost 55
12:    groups: bridge vm-switch viid-e1093@
13:    nd6 options=9<PERFORMNUD,IFDISABLED>


08行目から11行目までみたいに起動しているゲストマシンとホストマシンの物理イーサネットデバイスが表示されていれば成功。ゲストマシンから物理ネットワークのマシンにpingして確かめるのもあり。

上記を見る限り、switch_listにおけるパラメータ:bhyve-publicは02行目および03行目のtype_{switch_name}やports_{switch_name}となるので、そもそも論publicパラメータが入ってくるのは何らかおかしいのかもしれない。


■PCIパススルーで関わるコマンド、ファイルとか。
01: pciconf -lvコマンドでパススルーすべきPCIデバイスを調査し
02: /boot/loader.confにパラメータpptdevs="1/0/0 2/0/0"などの形で書く。128バイトを超えるようならpptdevs1="3/0/0"などとする。グラフィックボードの場合、HDMIデバイスも付いてくるはずなので、まとめてパススルーしておく。しないと失敗する。
03: ここでホストマシンを再起動しておく
04: vm-bhyveの各ゲストマシンのコンフィグにpassthru0="1/0/0"、passthru1="2/0/0"などと書く。/boot/loader.confのpptdevsオプションみたいに複数を同時に書くことはできない。グラフィックボードなど複数の機能を持つのPCIデバイス場合は関連する全てを同一ゲストマシンにパススルーする。(12.2R/amd64ではintel GPUのみできそうだ)
05: vm stop guest-machine-name等で対象のゲストマシンを完全に停止させてから、vm start -f guest-machine-nameなどで起動してみて、pciconf -lvで狙いのPCIデバイスがパススルーできたか確認する。
詳細な記法については他のサイトを見れば分かると思うし、時間があればまとめておきたいなー見たいのはある。けどやらない。
参考にしたURL等:
https://wiki.freebsd.org/bhyve/pci_passthru


■一度設定したsparse-zfsボリュームのサイズ変更を行い、vm-bhyve上のFreeBSDに反映させる。

01: 対象となるFreeBSD VMを落とす。その後vm listコマンド等で対象のVMがStoppedになっていることを確認する。
# vm stop fbsd_vm
※ACPIによりStoppedにならない場合はvm poweroff fbsd_vmなどで強制的に落とせるが…
# vm list

02: sparse-zfsボリュームがdevであればgeomに変更する。下記コマンドではvolmodeはdev
# zfs get volmode zroot/vm/fbsd_vm/disk0.img
NAME                           PROPERTY  VALUE    SOURCE
zroot/vm/fbsd_vm/disk0.img  volmode   dev      local
下記コマンドでgeomに変更する。
# zfs set volmode=geom zroot/vm/fbsd_vm/disk0.img
VMがきっちりシャットダウンできていれば、この時点でgpart showコマンドが通るはず。ダメだったらホストマシンを再起動する。
# gpart show /dev/zvol/zroot/vm/fbsd_vm/disk0.img


03: sparse-zfsボリュームのサイズを変更する。
下記のコマンドで現在のサイズを確認する
# zfs get volsize zroot/vm/fbsd_vm/disk0.img
NAME                           PROPERTY  VALUE    SOURCE
zroot/vm/fbsd_vm/disk0.img  volsize   20G      local
下記のコマンドで40Gに増やす
# zfs set volsize=40g zroot/vm/fbsd_vm/disk0.img


04: この時点でzroot/vm/fbsd_vm/disk0.imgが壊れている判定になるので、リカバリーを行う。行わないとこの後のgpartコマンドによる編集が通らない。またここまでにVMがきっちりPowerOffになっていないとこのコマンドも通らない。
# gpart recover /dev/zvol/fbsd_vm/disk0.img

05: gpartコマンドを使用して、sparse-zfsボリュームのパーティション情報を変更する。
ここでは下記のようにパーティションが切られており、freebsd-ufsを36Gへ、その他をfreebsd-swapに割り当てるものとする。
vtbd0p1: freebsd-boot  512k
vtbd0p2: freebsd-ufs  18G
vtbd0p3: freebsd-swap  2G

まず、vtbd0p3のswapパーティションを消す。
# gpart delete -i 3 /dev/zvol/zroot/vm/fbsd_vm/disk0.img

次にvtbd0p2のfreebsd-ufsを36gにリサイズする。
# gpart resize -i 2 -s 36g /dev/zvol/zroot/vm/fbsd_vm/disk0.img

最後に未割り当ての領域をswapパーティションにする。
# gpart add -t freebsd-swap /dev/zvol/zroot/vm/fbsd_vm/disk0.img

06: fbsd_vmをシングルユーザモードで起動する。
デフォルトでは3秒しか待機時間がないので急いで2を押す
# vm start -f fbsd_vm

07: growfs vtbd0p2コマンドを実行し、しばらく待つ。


■passthruにて、vm-bhyveホストのPCIバスナンバーから別のPCIバスナンバーへ変更する。
passthru0="1/0/0=0:8"


■実マシンからbhyveマシンへデータをコピーする
※特定のディスクデバイス、パーティションとしてマウントされている場合は・・・
LiveCDなどでIPネットワークに接続してから・・・
send# dump -0 -a -f - /path/to/disk/partition | nc -l RECV_IPADDR PORT_NUM
recv# nc -l PORT_NUM -w 120 | restore -rvf -

recv側から先に実行し、展開先にcd移動して120秒以内にsend側のコマンドを実行する。

※ZFSであれば・・・
send# zfs send -r pool@snapshot | nc RECV_IPADDR PORT
recv# nc -l PORT_NUM -w 120 | zfs recv POOL-NAME/PATH



※特定のディレクトリのデータを転送する場合は・・・
send # tar cf - ./ | nc RECV_IPADDR PORT_NUM
recv # nc -l PORT_NUM -w 120 | tar xf - ./


この記事は以上、時々更新するかもしれない。

コメント