2018年12月11日 | ブログ記事

firecrackerって日本語に訳すと爆竹らしい

yasu

この記事はtraP Advent Calender 12月11日の記事です。

こんにちは、yasuです。
クリスマスまでちょうど22週間ですね。
クリスマス楽しみ〜
それはさておき、最近AWSでリリースされたfirecrackerがGitHubのトレンドに上がっていたので使ってみました。

firecrackerって

ざっくりいうと、サーバーレスコンピューティングのための仮想化技術です。
microVMと呼ばれる軽量の仮想マシンを数秒で起動することができるとのこと。

現在のAWS LambdaやAWS FargateといったAWSのサーバレスコンピューティング基盤にも持ちられているみたいですね。

詳しいことはここに書いてあるので気になった方は参照してください。

前提要件

現在のユーザーに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

この記事を書いた人
yasu

traP17

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2018年12月25日
コミックマーケット95に参加します!
Yosotsu
2018年12月24日
DubstepDance
Sigma1023
2018年12月24日
冬っぽい曲
e-suke
2018年12月23日
素数のアレコレつめあわせ
youjo_tape
2018年12月23日
LogicProXでのサラウンド設定,オーケストラ用テンプレ作成,その他の小ネタ
SolunaEureka
2018年12月23日
線形解読法
nari

活動の紹介

カテゴリ

タグ