FirecrackerでmicroVMを動かして次にやることのまとめ

Fireceackerを動かしてみてわかった、次にやるべきことをご紹介ます。
2018.12.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
みなさーん、Firecrackerはもう試しましたか?試せるマシンがまだ無い方はこちらのブログを参考にしてまずはmicroVMを動かしてみましょう。

で、いざ動かしてみると、アプリケーションを動作させるためにいくつかやらないとなぁという事柄が浮かんで見えてきます。そこで本ブログでは私が思いついた、次にやることをご紹介したいと思います。

1. microVMの終了と再実行

microVMの実行を試した後「で、このVMどうするの?」となるので、まずはVMの止め方から。APIドキュメントにはPUT /acrtionsInstanceHaltというのがありますがバージョンv0.12現在はまだ未実装のようなので、microVMのシェルからrebootコマンドでVMを止めるのが良いようです。

localhost:~# reboot
PID1: Received "reboot" from FIFO...
localhost:~# Starting reboot runlevel
 * Unmounting loop devices
 * Unmounting filesystems
Sending the final term signal
Sending the final kill signal
[ 7554.757415] Unregister pv shared memory for cpu 0
[ 7554.763726] reboot: Restarting system
[ 7554.767853] reboot: machine restart
takipone@instance-1:~$

Firecrackerのプロセスも終了するので、再度microVMを実行するにはFirecrackerも再実行します。現時点ではmicroVM終了時にソケットファイルが削除されないので、そのままFirecrackerを再実行するとエラーになります。以下のようにソケットファイル削除とFirecracker実行をセットにすると良いでしょう。

rm -f /tmp/firecracker.sock && ./firecracker --api-sock /tmp/firecracker.sock

2. ディスクの拡張

ドキュメントにあるサンプルのディスクイメージファイルのサイズが30MBしかないので、apk(Alpine Linuxのパッケージマネージャ)でパッケージを入れるとすぐにディスクフルになってしまいます。あらかじめディスクイメージファイルを大きくし、合わせてファイルシステムを拡張しておきましょう。ホスト側で以下のコマンドを実行し、10GB追加しておきます。

$ truncate -s +10G hello-rootfs.ext4  # 10GB追加
$ e2fsck -f hello-rootfs.ext4         # ファイルシステム拡張のために一度fsck
e2fsck 1.44.1 (24-Mar-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
hello-rootfs.ext4: 3246/7680 files (0.4% non-contiguous), 23557/30720 blocks
$ resize2fs hello-rootfs.ext4         # ファイルシステムを拡張
resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on hello-rootfs.ext4 to 10516480 (1k) blocks.
The filesystem on hello-rootfs.ext4 is now 10516480 (1k) blocks long.
$

microVMを実行してシェルで確認すると...

localhost:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 9.7G     21.9M      9.2G   0% /
devtmpfs                 10.0M         0     10.0M   0% /dev
tmpfs                    11.2M     84.0K     11.1M   1% /run
shm                      56.1M         0     56.1M   0% /dev/shm

ルートファイルシステムが大きくなっていますね。これでOKです。

3. ネットワーク周りの設定

ホスト側ではKVMのネットワーク構成と同様ブリッジインターフェースなど、ゲストNICをホストNIC経由で外部と通信させるための事前構成が必要です。今回はUbuntuのlibvirtパッケージ周りの初期設定に任せて、NAT構成にしました。

sudo apt install libvirt libvirt-clients libvirt-daemon libvirt-daemon-system
sudo service libvirtd start

これでブリッジインターフェースvirbr0が作成され、なにかと便利なdnsmasqもlibvirt組み込みのものが起動します。

mictoVMは、起動(InstanceStart)前にゲストNICを明示的に追加します。追加時にゲストNICが自動で作成されるのですが、作成のためにroot権限が必要なので、あらかじめFirecrackerをsudoで実行し、ソケットファイルにアクセスするために以後のcurlコマンドもsudoで実行します(あまりスマートでセキュアではないやり方なので、あらかじめゲストNIC(TAPデバイス)を作成しておきそれをアタッチする方法の方が本当は良さそうです)。

sudo curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT 'http://localhost/network-interfaces/eth0' \
  -H 'Accept: application/json' -H 'Content-Type: applicaion/json' \
  -d '{
    "iface_id":            "eth0",
    "host_dev_name":       "veth0",
    "allow_mmds_requests": true
  }'

ゲストNICのホスト側での活性化とブリッジへの追加も実行します。

sudo brctl addif virbr0 veth0
sudo ifconfig veth0 up

そして、microVMを起動します。ゲスト側のApline Linuxの/etc/network/interfacesファイルでは各NICとも手動設定になっているので、rootユーザーでログインし、以下のコマンドで仮想NICにIPアドレスを割り当てます。

ifconfig eth0 192.168.122.101 netmask 255.255.255.0
route add default gw 192.168.122.1
echo nameserver 192.168.122.1 > /etc/resolv.conf

これで外部へのネットワーク通信が通ります。起動時にネットワーク設定を有効化したいところですが、/etc/network/if-up.d/firecracker-tapによってネットワークの起動処理/etc/init.d/networking startが常時エラーになるようなので、私は当該ファイルを削除し以下のように設定して起動することを確認しました。

/etc/network/interfaces

auto eth0
iface eth0 inet static
    address 192.168.122.101
    netmask 255.255.255.0
    gateway 192.168.122.1
auto eth1
iface eth1 inet manual
auto eth2
iface eth2 inet manual

まとめ

FirecrackerでmicroVMを動かして次にやることとして、再実行、ディスク拡張、ネットワーク周りをご紹介しました。いずれ公式ドキュメントにも同様の説明が追加されると思いますので、それまでの繋ぎとして活用いただければと思います。

参考URL