QEMU+KVM と仮想ブリッジとtapデバイスで FreeBSD の環境を用意してみる
概要
実験用の FreeBSD の環境が欲しかったため、QEMU+KVM の仮想環境で用意したときのメモ。 FreeBSD を立ち上げるためのメモだが、起動イメージを変えるだけで Linux も起動できるはず。 (最近、LXD のコンテナで Linux の環境は事足りてしまうから QEMU をあんまり必要にならなくなってしまった。)
仮想ホスト環境
- OS: Ubuntu 16.04
- CPU: Intel Core i5-4300M
- 仮想環境: QEMU+KVM
- 仮想ブリッジqbr: 10.0.0.254/24
仮想ゲスト環境
- OS: FreeBSD11.1
- CPU: 1コア
- Mem: 1GB
- NIC: 1つ (DHCPでアドレス(10.0.0.1-10.0.0.250)を配布1)
ツールののインストール
↓で QEMU と udhcpd をインストールしておく。
ホストネットワークの準備
まず sysctl
でパケットを転送できるように設定しておく。
次に仮想ブリッジインターフェース qbr
を作成する。
$ sudo ip link add name qbr type bridge
$ sudo ip address add 10.0.0.254/24 dev qbr
$ sudo ip link set dev qbr up
↑の結果↓のように qbr
が設定されていることを確認できる。
$ ip link show dev qbr
7: qbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff
$ ip address show dev qbr
7: qbr: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff
inet 10.0.0.254/24 scope global qbr
valid_lft forever preferred_lft forever
iptablesでマスカレードの設定をする
↓のように iptables
で 10.0.0.0/24
のプライベートアドレスはマスカレードするように設定する。
↑を実行した結果は↓のようになる。
iptables -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.0.0.0/24 !10.0.0.0/24
qemu-ifup
QEMU で仮想ゲストを立ち上げる際にホスト側のネットワークインターフェースを調整するためのシェルスクリプト /etc/qemu-ifup
を設定しておく。
#!/bin/bash
if [ -n "$1" ]
then
/sbin/ip tuntap add $1 mode tap user `whoami`
/sbin/ip link set $1 up
sleep 0.5s
/sbin/ip link set $1 master qbr
exit 0
else
echo "Error: no interface specified"
exit 1
fi
↑はQEMU側が↓のように呼び出すことを想定されている。
DHCPサーバの設定
/etc/udhcpd.conf
に↓を記述し、udhcpd
を設定する。
interface qbr
start 10.0.0.1
end 10.0.0.250
opt dns 8.8.8.8
opt dns 8.8.4.4
opt subnet 255.255.255.0
opt router 10.0.0.254
opt domain local
今回は udhcpd
を systemd
を用いずに手動で起動する。
-fをつけることでフォアグラウンドでの動作になる。
仮想ゲストFreeBSD11.1の起動イメージのダウンロード
上記ページから AMD64(X86_64) の QCOW2 形式のイメージを選び、ダウンロードして unxz
で伸長する。
$ curl -O https://download.freebsd.org/ftp/releases/VM-IMAGES/11.1-RELEASE/amd64/Latest/FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ ls -l FreeBSD-11.1-RELEASE-amd64.qcow2.xz
-rw-r--r-- 1 root root 279978716 Dec 12 19:35 FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ unxz FreeBSD-11.1-RELEASE-amd64.qcow2.xz
$ ls -l FreeBSD-11.1-RELEASE-amd64.qcow2
-rw-r--r-- 1 root root 1533345792 Dec 12 19:35 FreeBSD-11.1-RELEASE-amd64.qcow2
仮想ゲスト FreeBSD11.1 の起動
tap デバイスの MAC アドレスをランダムに生成して、仮想マシンを起動する。
↑を実行すると↓のように起動画面が拝めた。
時間が経つと udhcpd がアドレスを配布したことがわかり、ログイン画面になる。 ちなみに、初期状態では root ユーザのパスワードは空の状態だった。
qemu-ifup で設定したとおり、起動時に QEMU によって作成された tap0 が qbr に接続されていた。
$ ip link show tap0
13: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master qbr state UNKNOWN mode DEFAULT group default qlen 1000
link/ether b2:d5:df:1c:53:ec brd ff:ff:ff:ff:ff:ff
また、 curses ではなく、↓のようにして VNC 経由でコンソール画面を見ることも可能。
↑を実行すると 5900+ 起動したVNCの数だけポートがバインドされる。
$ sudo lsof -ni :5900
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qemu-syst 21363 root 15u IPv4 1891730 0t0 TCP *:5900 (LISTEN)
5900番ポートがバインドされたので、↓のようにして仮想マシンの画面に接続することができる。