blog.monophile.net

コンピュータのこととかのメモ。

山本 一彰 | Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を2016年に受賞。 現在はインフラエンジニアとして生計をたててている。

技術

Configuration Management Ansible, Terraform, Cloud-Init
Cloud Platform GCP, AWS, Azure, OpenStack
Virtualization, Container QEMU+KVM, Xen, LXD/LXC, Docker
OS Ubuntu, Debian GNU/Linux, CentOS, FreeBSD, ...
Storage Ceph, GlusterFS, ZFS, btrfs, ...
Router Linux+Netfilter, Quagga, VyOS, Cisco IOS, YAMAHA RTX, ...
Switch Dell FTOS, AlaxalA, NETGEAR, ...
DB MySQL, MariaDB(Galera Cluster), MongoDB
Mail postfix, dovecot, RainLoop
WebApps WordPress, GitLab, MatterMost, Redmine, ...
Monitoring Nagios, Munin, Zabbix, Prometheus, Grafana
Misc Kubernetes/Istio, certbot, dnsmasq, ...

習得中

OS CoreOS(Container Linux), Windows on QEMU, ...
SQL PostgreSQL, BigQuery, ...
NoSQL CouchDB, ArangoDB, Neo4J, ...
Misc Proxmox, oVirt, MAAS, NFV, ...

投稿

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をインストールしておく。

$ sudo apt install qemu-kvm udhcpd

ホストネットワークの準備

まずsysctlでパケットを転送できるように設定しておく。

$ sudo sysctl -w net.ipv4.ip_forward=1  

次に仮想ブリッジインターフェース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のプライベートアドレスはマスカレードするように設定する。

$ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE

↑を実行した結果は↓のようになる。

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側が↓のように呼び出すことを想定されている。

$ /etc/qemu-ifup tap0

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を用いずに手動で起動する。

$ udhcpd -f

-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アドレスをランダムに生成して、仮想マシンを起動する。

$ sudo kvm -smp 1 -m 1024 -drive if=virtio,file=FreeBSD-11.1-RELEASE-amd64.qcow2 -netdev tap,id=net0 -device e1000,netdev=net0,mac="$(printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)))" -curses

↑を実行すると↓のように起動画面が拝めた。

時間が経つと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経由でコンソール画面を見ることも可能。

$ sudo kvm -smp 1 -m 1024 -drive if=virtio,file=FreeBSD-11.1-RELEASE-amd64.qcow2 -netdev tap,id=net0 -device e1000,netdev=net0,mac="$(printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)))" -vga std -nographic -vnc :0

↑を実行すると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番ポートがバインドされたので、↓のようにして仮想マシンの画面に接続することができる。

$ gvncview ${host-machine-ip}:0

参考