feature image

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

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

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

こんにちは、yasuです。
クリスマスまでちょうど週間ですね。
クリスマス楽しみ〜
それはさておき、最近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 icon
この記事を書いた人
yasu

traP17

この記事をシェア

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

関連する記事

ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】 feature image
2018年11月3日
ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】
Azon icon Azon
2018年12月23日
LogicProXでのサラウンド設定,オーケストラ用テンプレ作成,その他の小ネタ
SolunaEureka icon SolunaEureka
2018年12月16日
ICPCアジア地区横浜大会参加記【アドベントカレンダー2018 52日目】
eiya icon eiya
2018年11月30日
Flutterでスマホアプリを作ってみ(た | よう)【アドベントカレンダー2018 37日目】
Fourmsushi icon Fourmsushi
2018年12月23日
線形解読法
nari icon nari
2018年12月3日
ハル研究所プログラミングコンテスト 2018に参加しました[アドベントカレンダー2018 40日目]
ninja icon ninja
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記