この記事はtraP Advent Calender 12月11日の記事です。
こんにちは、yasuです。
クリスマスまでちょうど週間ですね。
クリスマス楽しみ〜
それはさておき、最近AWSでリリースされたfirecrackerがGitHubのトレンドに上がっていたので使ってみました。
firecrackerって
ざっくりいうと、サーバーレスコンピューティングのための仮想化技術です。
microVMと呼ばれる軽量の仮想マシンを数秒で起動することができるとのこと。
現在のAWS LambdaやAWS FargateといったAWSのサーバレスコンピューティング基盤にも持ちられているみたいですね。
詳しいことはここに書いてあるので気になった方は参照してください。
前提要件
- Linux 4.14以上
- KVM
- KVMへのアクセス権限(read, write)を持っている
現在のユーザーにKVMへのアクセス権を付与する
sudo setfacl -m u:${USER}:rw /dev/kvm
firecrackerのインストール
以下のコマンドを実行してfirecrackerをビルドします。
おそらくbuild/debug/firecrackerにバイナリがファイルが置かれるはずです。
git clone https://github.com/firecracker-microvm/firecracker
cd firecracker
tools/build
firecrackerの起動
端末1
microVMで使用するためのカーネルとルートファイルシステムをインストールします。
curl -fsSL -o hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
curl -fsSL -o hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4
firecrackerの起動
./firecracker --api-sock /tmp/firecracker.sock
端末2
カーネルの設定
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"kernel_image_path": "./hello-vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
}'
ルートファイルシステムの設定
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"drive_id": "rootfs",
"path_on_host": "./hello-rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'
firecrackerの起動
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'
これで、端末1の方でAlpine Linuxが起動しました。
これらの処理をスクリプト化しておけばでmicroVMが起動に数秒もかからないのは良いですね。
とはいえ、これではOSが起動したのみなので、
次にホストマシンとゲストマシン間で通信ができるようにしてみたいと思います。
firecrackerでネットワークを利用する
ホストマシンでのネットワーク設定
ホストマシンとゲストマシンを接続するためのデバイスの設定をします。
ホストマシン上にTAPを追加。
sudo ip tuntap add dev "fc-tap0" mode tap
sudo sysctl -w net.ipv4.conf.fc-tap0.proxy_arp=1
sudo sysctl -w net.ipv6.conf.fc-tap0.disable_ipv6=1
sudo ip addr add "169.254.0.1/30" dev fc-tap0
sudo ip link set dev "fc-tap0" up
設定できているのを確認できました。
# ifconfig
fc-tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 169.254.0.1 netmask 255.255.255.252 broadcast 0.0.0.0
firecrackerの起動
端末1
./firecracker --api-sock /tmp/firecracker.sock
端末2
カーネルの設定
今回はipの設定が追加されているのがわかるかと思います。
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"kernel_image_path":"./hellovmlinux.bin",
"boot_args":"console=ttyS0 reboot=k panic=1 pci=off nomodules ipv6.disable=1 ip=169.254.0.2::169.254.0.1:255.255.255.252::eth0:off"}'
ルートファイルシステムの設定
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"drive_id": "rootfs",
"path_on_host": "./hello-rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'
ネットワークインターフェースの設定
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/network-interfaces/1'\
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"iface_id":"1",
"guest_mac":"02:FC:00:00:00:00",
"host_dev_name":"fc-tap0",
"state": "Attached"}'
ゲストマシンの起動
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'
端末1
ネットワークインターフェースの設定確認
#ifconfig
eth0 Link encap:Ethernet HWaddr 02:FC:00:00:00:00
inet addr:169.254.0.2 Bcast:169.254.0.3 Mask:255.255.255.252
端末2
ホストマシンからゲストマシンの通信の確認
# ping 169.254.0.2
PING 169.254.0.2 (169.254.0.2) 56(84) bytes of data.
64 bytes from 169.254.0.2: icmp_seq=1 ttl=255 time=1.87 ms
64 bytes from 169.254.0.2: icmp_seq=2 ttl=255 time=1.10 ms
これで通信の確認が出来ました!!
最後に
爆竹は人間に嫌われがちですが、このように人々の役に立つ使い方もあるんだな〜と思いました。
便利な使い方はたくさんありそうなので色々試していきたいです。
明日はSilviaseくんが担当です。お楽しみに〜
参考ページ
firecracker-microvm/firecracker
firecracker-microvm/firecracker-demo