Monthly Archives: 5月 2019

FreeBSD 12のbhyveにWindows10をインストールする:その2(vm-bhyve使用)

Pocket

前回までで仮想マシンをインストールする準備が整った。
さっそくWindows10のインストールに取り掛かるが、準備すべきものがある。

  1. Windows10インストールイメージ
  2. TigerVNC(Viewer)

一つ目は言わずもがな。
https://www.microsoft.com/ja-jp/software-download/windows10

二つ目は、GUI操作のため。
Windowsのような、GUI操作が必須のOSをbhyve上の仮想マシンとして動かす場合には、VNCでその画面を見ることになる。
ただ、bhyveのVNCは癖があるようで、VNC viewerによっては途中で切れてしまうんである。
WindowsでもProであればリモートデスクトップという手もあるが、それにしたってインストールの時にはVNCで繋ぐほかない。
TigerVNCなら問題なく接続できるのでこれを準備しておくこと。
https://tigervnc.org/
https://github.com/TigerVNC/tigervnc/releases

2019/5/12時点では1.9.0が最新だからしてバイナリはこちら。Viewerでよい。
https://bintray.com/tigervnc/stable/tigervnc/1.9.0

初回には少し混乱したので記しておくが、VNCで接続する先のIPアドレスは、bhyveホストのIPアドレスである。
仮想マシンが自立して起動すると、そっちはそっちで独自のIPアドレスを取得する。

VNCはbhyveが用意する仮想マシンへのGUIアクセスなのでbhyveホストに接続する必要があるわけ。
一方で、仮想マシンそのものでリモートデスクトップやら、VNC Serverを用意すれば、そのときは当然、仮想マシンのIPアドレスを接続先として指定することになる。

ではISOの準備から。

仮想マシンインストール準備(インストーラ = ISO)

インストーラの準備。
ISOイメージを登録する。VirtualBoxでもそういう操作あるよね。

ISOイメージがあるなら$vm_dir/.isoに移す
sudo vmとして確認する
sudo vm とすれば、ダウンロードしてそこに置いてくれる。ちょっと驚き。

仮想マシンインストール準備(仮想マシン設定)

前提。
仮想マシンは$vm_dir/(仮想マシン名)/に置かれる。
設定ファイルは$vm_dir/(仮想マシン名)/(仮想マシン名).confである。
なお仮想マシンのログは$vm_dir/(仮想マシン名)/vm-bhyve.log。

仮想マシン置き場が/vmで、仮想マシン名がwin10だと、
/vm/win10/win10.confなどとなる。

で、vm createでまず仮想マシンの枠を作る。
このとき、-tでテンプレートを指定し、-sでディスクイメージのサイズを指定できる。
デフォルトだと20Gなので余程のことがない限り指定は必須。
作った仮想マシンはvm listで確認。

vm configureで設定(win10.conf)を変更。
vi操作で書き換える。
以下のように。

WindowsなのでBIOSはuefi。

graphicsをYesにするとVNCで接続できる。
デフォルトではbhyveホストのIPアドレス:5900で待ち受け。
変更したければそれぞれgraphics_listen、graphics_portで指定する。
また、解像度は800×600。graphics_res=”WxH”で変更できる。
graphics_waitを設定しておくと、VNC接続するまでゲストの起動を待ってくれる。
設定しなくても、仮想マシンをインストールモードで立ち上げたときには待ってくれるが、それは初回だけ。
Windowsのようにインストール時に複数回再起動するものはwaitしてもらったほうがいいだろうと。

Windows10homeの場合はcpuを1。(後述)

network0_typeにはe1000を指定。
インストールが無事に済んだらvirtioに変更するが、まずはe1000で。

network0_switchで本仮想マシンを繋ぐ仮想スイッチを指定する。
vm-bhyveのデフォルト、publicにしておく。
なお、起動した暁には、仮想マシンにはtapX(Xは数字)インタフェースが割り当てられ、publicに接続される。

disk0_type=”ahci-hd”としていて、本来ならディスクイメージをzfsのボリュームにしてvirtio-blkと指定したいが、以下の通りahci-hdしかダメ。
https://github.com/churchers/vm-bhyve/wiki/Supported-Guest-Examples
“the disk emulation needs to be ahci-hd.”

vm-bhyveは標準で仮想マシンの時刻をUTCに設定するので、utctime=”no”とする。
xhci_mouse=”yes”にしておかないと、後々VNCで接続したときにまともにマウスが動かない。

仮想マシンインストール

さあインストール。vmにinstallサブコマンドを与えて起動。
状態はvm listで確認。
bhyveホスト側では$vm_dirにあるvm-bhyve.logをtailして状況を確認しつつ進めるがよいだろう。

lockedの通り、VNC待ち。
TigerVNCで接続し、インストールを進める。
繰り返すがこのときの接続先はbhyveホスト。

インストール後(ネットワークドライバの変更他)

無事にインストールが済んだら、ネットワークドライバを変更する。
ネットワークドライバの変更なのでVNCから接続しておく。
ドライバの配布先には、仮想マシンから直接、行ってしまってよい。

場所はここだが、「virtio-win fedora」あたりで検索すれば辿り着けるはず。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/

5/12時点では0.1.164が最新。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.164-2/virtio-win-0.1.164.iso

Dにマウントしたら、以下のパスがドライバの場所。パスの通りWindows10, 64bitね。
こちらに強制的に変更する。ネットワークが切断されるがお構いなしで。
D:\NetKVM\w10\amd64

シャットダウンしたら、bhyve側の設定ファイルでネットワークタイプをe1000からvirtio-netに変更する。
graphics_waitも忘れずに削除。

ゲストWindowsに与えるCPU数

Windows10の場合、割り当てられるCPUは、Homeだと1つ、Proだと2つまで。
コア/スレッドはHomeだと32、Proだと256。

コアを二つ以上与えようとしても、vm-bhyveでの指定はCPU数でのみ可能。
1.3からはより細かい設定ができるようになるそうだが、pkgからインストールするvm-bhyveは1.2なので1のままにしておく。

https://github.com/churchers/vm-bhyve/wiki/Guest-Example:-Windows

なお/boot/loader.confに以下の設定をすることで、CPU一つあたりのコア数を指定できるが、手元ではうまく動かないので特に説明はしない。

上記パラメータの詳しい説明はこちら。
https://forums.freebsd.org/threads/bhyve-cpu-vcpu-cores-nad-threads.60169/

ホスト起動時に仮想マシンも起動させるには。

/etc/rc.confに以下の行を追加。
複数ある場合にはスペースを置いて起動させたい順に記載。
vm_delayは、複数の仮想マシンを起動する場合のインターバルを秒で指定。

No tags for this post.

FreeBSD 12のbhyveにWindows10をインストールする:その1(vm-bhyve使用)

Pocket

bhyveはFreeBSDで動く、つまりType 2のハイパーバイザ。

FreeBSDにはjailがある。
jailのいいところは、カーネルを共有しつつユーザランドだけ分けることで、オーバーヘッドを抑えられるところ。
悪いところはOSに制限が発生するところ。要するにLinuxやWindows、FreeBSDでも他のバージョンを動かせないところ。

仮想化は何かの目的、たとえばアプリケーションを動かすためのもので、いまどきOS依存のアプリケーションは少ない。
とはいうものの、FreeBSDは年々、本体はともかく裾野のリソースが先細りで、ports/packageがなくなったり、あったとしても情報は少なくて、まるっとLinuxごと動かしたいなと感じることがある。
もちろんWindowsについては当然FreeBSDでは動かないアプリなんて山ほどある。

そういった点では、用途に合わせて最適なOS(とアプリケーション)を使い慣れたFreeBSD上で動かせるのはかなりのメリット。
というのも、バックアップが簡単にできるからである。
ZFS上にイメージを作れば、スナップショットにロールバックはお手の物である。
壊し放題である。
ESXiなどのType 1ハイパーバイザでは、これができない。できるかもしれないけど知らない。

Windowsを物理PC上で使っていて、壊れたとする。バックアップがあったとしても、復旧が面倒。
Linuxについてはバックアップからの復旧は比較的簡単だが、俺様なんか滅多にLinuxを使わなくて操作をすぐ忘れるという点でやはり復旧が面倒。

以上のような背景があったところに、このたび宅鯖をハードウェア仮想化対応のCPUに変えたので、遅まきながらbhyveを導入する。
以下ではWindows10をインストールする。

まずはvm-bhyveを

bhyveの導入には、まず公式のFreeBSD handbookを参照するが、いろいろと面倒くさそうである。
https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html

遅れて導入すると、いろいろと環境が整っているものである。
bhyveの場合には、vm-bhyveというツールがあればこのへんは一挙解決。
virtualboxを使ったことがあれば、それをイメージしながら進めると理解しやすい。

ただ後述するが、Windowsのイメージそのものにはzfsボリュームを使えない。(ZFS上にイメージを置くことはできる)
https://github.com/churchers/vm-bhyve
https://github.com/churchers/vm-bhyve/wiki/Running-Windows

大きな流れ

  1. vm-bhyveのインストール
  2. 初期設定
  3. 初期設定(ネットワーク)
  4. 仮想マシンインストール準備(インストーラ = ISO)
  5. 仮想マシンインストール準備(仮想マシン設定)【次回】
  6. 仮想マシンインストール【次回】

vm-bhyveのインストール

pkgでインストールできる。
vm-bhyveのほか、仮想OS用のfirmwareもインストールしておく。

どんなファイルがインストールされたかは、pkg listで確認できる。
コマンドとしては/usr/local/sbin/vmを使う。
実行にはroot権限が必要。
service -lで表示されるサービス名もvm。

仮想マシン他置き場を作る。

もちろんZFSで作るよな。
ここで作った置き場には、仮想マシンのほか、ISOイメージ、テンプレート、すべての仮想マシンに共通の設定ファイルが置かれる。
ルート直下に/vmを作った。
なお本記事で”$vm_dir”と記載をする場合にはこの仮想マシン置き場を指す。

vm-bhyveの初期設定

まず/etc/rc.confへの書き込み。
ホスト起動時にvm-bhyveも起動するように。
また、先に作った仮想マシン置き場をvm-bhyveに知らせるために。

次にvm init。仮想マシン置き場にいろいろとファイル/ディレクトリが作られるとともに、必要なカーネルモジュールがロードされる。
vm initはホストが起動する都度、実行される必要がある。
この場合、vm initはカーネルモジュールのロードと、ネットワーク設定(tap)を行う。
/etc/rc.confにvm_enableをしてあれば、気にする必要なない。

仮想マシン置き場に、OSごとのテンプレートファイルもコピーする。
/usr/local/share/examples/vm-bhyve/にあるやつね。(さきほどpkg infoでも出てきた)

以上で初期設定終わり。
つぎは初期設定(ネットワーク)

初期設定(ネットワーク)

仮想マシン用ネットワークの結線を行う。
まず、仮想マシンの繋がる仮想スイッチを作り、仮想スイッチとホストマシンのネットワークインタフェースを繋ぐ。

外界 <–> ホストのインタフェース <–> 仮想スイッチ
というネットワークを作る。

先々、仮想マシンを作ると
外界 <–> ホストのインタフェース <–> 仮想スイッチ <–> 仮想マシン
というネットワークになる。
仕組み的なことをいうと、仮想スイッチはbridgeで、仮想マシンのインタフェースはtapになる。

以下の例では、publicという名前の仮想スイッチ(オプションなしでのcreateなのでbridgeインタフェース)を作成している。
名前は、vm-bhyveのテンプレートで仮想スイッチを”public”にしているからで、気に入らなければ別の名前でもよい。
# その場合は$vm_dir/.templatesにあるファイルを書き換えておくとよい。
addで仮想スイッチに物理インタフェースを追加。
物理インタフェースは、もちろんのことホストマシンのインタフェースに合わせること。

これで以下のようなネットワーク構成になった。
外界 <–> ホストのインタフェース(re0) <–> 仮想スイッチ(vm-public)

これですべての初期設定が完了。

No tags for this post.