libvirtを利用してFreeBSD環境を作成する
触れるFreeBSD環境を構築したい
自分の昔話になるが、20年ほど前ネット上で友達になった人の影響でFreeBSDをデスクトップ用途に使っていた時期があった。
FreeBSD環境をしばらく触れなくなって時間が経ち、何かしらの形で、触れられる環境を構築したいと考え始めた。 今自宅サーバを運用しているが、Ubuntuを利用して運用している。KVMを使って自宅サーバ上でFreeBSD環境を構築できないか試してみたくなったので、やってみることにした。
現代の環境
一昔前(10年弱前)は、QEMUを利用して立ち上げるものだ、という認識があったのだが、今はlibvirtを活用してKVM向けに作成されたイメージを管理、運用をすることになっているらしい。
あまり知らないことなので、LLMに聞きながら調査を進めることにした。
FreeBSDで公式に配られているVMイメージ
QEMUおよびKVMで運用するにあたり、VMイメージを作成しなければならないかな、と考えていたが、FreeBSDの公式サイトにて、VMイメージが配布されている。これは便利、ということで利用することにした
CLOUDINITというVMイメージを利用しよう
FreeBSD公式が配布しているVMイメージ一覧には、複数の形式のものがある。その中でも、KVM上で運用を考えるのであれば、CLOUDINIT対応のVMイメージを落として利用することになる

CLOUDINITという名前がついたイメージは、ちょっとややこしい事実があって
- CLOUDINITという名前が使われているけど、Linuxディストリビューションで利用できるcloud-initが使われているわけではない。nuageinitという、cloud-initに似ている、FreeBSDで利用されているcloud-init互換スクリプトが入ったイメージである。
- CLOUDINITのイメージを利用しない場合、rootパスワードや、シリアルコンソールなど、ホストから通信を行うために必要な最低限の設定が入っていない。そのため、KVM上でCLOUDINITイメージではないVMイメージをダウンロードして利用すると、起動はできるが、起動したVMイメージに対して通信をするのにとても苦労することになる
CLOUDINITイメージでは、設定用のISOイメージも必要
VMイメージを立ち上げる時、ホスト側からSSHを使った通信に利用する公開鍵の情報や、シリアルコンソールの設定、VMイメージを使った仮想マシン立ち上げ時に実行したいコマンドの設定をnuageinitを介して行うことが可能。nuageinitは設定を行う際、cidataというラベルが付けられたCD-ROMが刺さっているか、確認を行う。そのため、ISOイメージを作成する必要がある。
VMの設定用ISOイメージを作成する
VM設定用ISOイメージを作成する。作成環境はUbuntu 26.04。
仮想マシンの通信で利用をするためのSSH鍵を作成
$ ssh-keygen -t ed25519
$ cat ~/.ssh/id_ed25519.pub # 公開鍵ファイルがあることを確認しておく
Volume Label cidata を持つISOファイルを作成する
CLOUDINIT対応のVM Imageは、前述の通り、VM Image起動時にcidata というVolume Labelを持つISOファイルを読み取る。
ISOファイル生成
meta-dataとuser-dataをISOファイルに含める必要がある。生成例を以下に示す。メタデータの詳細については、nuageinitのman pageを見ると良い。
mkdir -p /tmp/cidata
cat > /tmp/cidata/meta-data <<'EOF'
instance-id: freebsd15
local-hostname: freebsd15
EOF
PUBKEY=$(cat ~/.ssh/id_ed25519.pub)
cat > /tmp/cidata/user-data <<EOF
#cloud-config
hostname: freebsd15
ssh_pwauth: true
users:
- name: user
groups: wheel
shell: /bin/sh
lock_passwd: false
ssh_authorized_keys:
- ${PUBKEY}
chpasswd:
expire: false
users:
- name: user
password: changepasswd
type: text
- name: root
password: changepasswd
type: text
packages:
- sudo
network:
ethernets:
vtnet0:
dhcp4: true
write_files:
- path: /boot/loader.conf.d/serial.conf
content: |
boot_multicons="YES"
boot_serial="YES"
comconsole_speed="115200"
console="comconsole,vidconsole"
- path: /etc/rc.conf.d/sshd
content: |
sshd_enable="YES"
runcmd:
- echo '-S115200 -Dh' > /boot.config
- service sshd enable
- service sshd start
EOF
作成したメタデータを、ISOファイルに変換する Ubuntu 26.04上のホストで実行をするので、必要なパッケージをインストールして進める形をとる。
cidata という名前のVolume Labelを持つISOファイルを作成する。
sudo apt install -y genisoimage
genisoimage -output /tmp/seed.iso -volid cidata -joliet -rock \
/tmp/cidata/user-data /tmp/cidata/meta-data
sudo cp /tmp/seed.iso /var/lib/libvirt/images/seed.iso
libvirtを利用し、VMを起動する
libvirt を利用してVMを起動する。
virt-install コマンドを利用してVM Image、そして先ほど作成したISOイメージを利用し、VMを起動する
sudo virt-install \
--name freebsd15 \
--memory 2048 --vcpus 2 \
--disk path=/var/lib/libvirt/images/FreeBSD-15.1-RELEASE-amd64-BASIC-CLOUDINIT-zfs.qcow2,bus=virtio \
--disk path=/var/lib/libvirt/images/seed.iso,device=cdrom \
--import \
--os-variant freebsd14.0 \
--network network=default,model=virtio \
--graphics none \
--serial pty \
--noautoconsole
※os-variant freebsd14.0 の指定をしているが、15系が一覧になければ14.0で代用可、チューニングヒント用途なので実害なし
起動を待ち、virsh コマンドを利用し、VMに割り当てられたローカルIPアドレスを調べる
$ sudo virsh domifaddr freebsd15
名前 MAC アドレス プロトコル アドレス
-------------------------------------------------------------------------------
vnet5 52:54:00:f6:e0:8b ipv4 192.168.122.53/24
表示されたローカルIPアドレスに対して、sshコマンドを利用して接続をする
$ ssh [email protected]
Last login: Tue Jul 7 14:29:27 2026 from 192.168.122.1
FreeBSD 15.1-RELEASE (GENERIC) releng/15.1-n283562-96841ea08dcf
Welcome to FreeBSD!
Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories: https://www.FreeBSD.org/security/
FreeBSD Handbook: https://www.FreeBSD.org/handbook/
FreeBSD FAQ: https://www.FreeBSD.org/faq/
Questions List: https://www.FreeBSD.org/lists/questions/
FreeBSD Forums: https://forums.FreeBSD.org/
Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with: pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.
FreeBSDのテスト環境をVMで立ち上げることを試してみたわけだが、簡単にできた。QEMUを使っていたはるか昔に比べて、今はツールも揃っているし、困ったらLLMに聞けば環境構築のために必要な設定に関する知識を検索、問い合わせることはできるので良い時代になった。
せっかくなので、VM環境のテストをする
仮想環境を構築できたので、ZFSを使ったテストしてみよう ZFSのデータセットを作成し、スナップショット機能を使ってロールバックをするテストを実行する。
$ su -
> zfs create zroot/test
> touch /zroot/test/hello
> zfs snapshot zroot/test@has_hello
> touch /zroot/test/world
> zfs rollback zroot/test@has_hello
スナップショットを作成し、rollbackをしてみた。
/zroot/test の状態を確認をする
> ls /zroot/test
hello
worldをtouchした直後にロールバックしたので、worldは消え、スナップショット時点に存在したhelloだけが残る。
スナップショットの一覧を見てみよう。
> zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zroot/test@has_hello 0B - 104K -
作成したスナップショットと、利用している容量が確認できる。 なぜこんな容量が少ない状態でスナップショットが保持できるんだ?という疑問が出てくるが、これは後ほど、ZFSのみを掘り下げた記事を書いて探る。