この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、ゲストの大瀧です。
みなさーん、Firecrackerはもう試しましたか?試せるマシンがまだ無い方はこちらのブログを参考にしてまずはmicroVMを動かしてみましょう。
で、いざ動かしてみると、アプリケーションを動作させるためにいくつかやらないとなぁという事柄が浮かんで見えてきます。そこで本ブログでは私が思いついた、次にやることをご紹介したいと思います。
1. microVMの終了と再実行
microVMの実行を試した後「で、このVMどうするの?」となるので、まずはVMの止め方から。APIドキュメントにはPUT /acrtions
にInstanceHalt
というのがありますがバージョン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を動かして次にやることとして、再実行、ディスク拡張、ネットワーク周りをご紹介しました。いずれ公式ドキュメントにも同様の説明が追加されると思いますので、それまでの繋ぎとして活用いただければと思います。