Firecrackerとは
AWS re:invent 2018で発表された新サービス?というかOSSです。
概要を見たときは前にまとめたKata Conteinersに似ていると思いましたがFirecrackerはVMMみたいなので完全に別物ですね。
そういう認識があるのかGithub上にもKataContainersとの違いが書いてあったりします。
Firecracker Github
What is the difference between Firecracker and Kata Containers and QEMU?
- FirecrackerはVMM
- KVMベースでQEMUの代わりに動作するプロセス
- LambdaやFargate用基盤で使われているらしい
- Firecracker はユーザー空間で動作する
- Linuxカーネルベースの仮想マシン(KVM)を使用して microVM を作成する
- Firecracker は QEMU に代わる幅広い機能を備えた VMM(仮想マシンモニター)
- 様々なゲストOS をホストする
- Firecracker プロセスはvCPUの数の設定やマシンの起動などの一般的な操作を RESTful API 経由で制御できる
- Firecracker プロセスは同じマシン上の何千ものマイクロVMによって使用されるネットワークとストレージのリソースを細かく制御できるように、レートリミッタを内蔵している
- Firecracker はホストとゲストOS 間で構成情報を安全に共有するメタデータサービスも提供する
- Firecracker API を使用してメタデータサービス構成および設定ができる
RESTful APIで制御可能な、最適化されたVMMであるというところが魅力ですね。
触ってみる
まあ、Githubのインストールページを参考にしているだけですが。
FirecrackerはAWSだとベアメタルインスタンス(i3.metal)で実行する必要がありそうです。
今回はGCEのネストインスタンスを使ってみます。
ネストインスタンスとは入れ子の意味でVM内で更にVMを動かす時の仕組みです。
Google Compute Engine、仮想マシンの入れ子(Nested Virtualization)を可能に。KVM対応
事前準備
OS
-
Linux 4.14+
- Firecracker currently supports physical Linux x86_64 hosts, with kernel version 4.14 or later.
- KVM
you have KVM enabled in your Linux kernel
you have read/write access to /dev/kvm
Docker Install
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo yum install docker
$ sudo systemctl start docker
$ sudo usermod -aG docker $USER
ダウンロード
モジュールをダウンロードすればそのまま使えます。
ソースコードを自分でビルドもできます。
$ curl -fsSL -o firecracker https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
$ chmod +x firecracker
$ ls -l
total 6008
-rwxr-xr-x 1 root root 6151112 Nov 29 13:40 firecracker
$ ./firecracker -V
firecracker 0.11.0
プロセス実行
$ rm -f /tmp/firecracker.sock
$ firecracker --api-sock /tmp/firecracker.sock
これを実行するとフォアグラウンドでターミナルを占有してしまうので別ターミナルでアクセスします。
ここで作ったunix domain socketに対してRESTful APIでアクセスできます。
/をGETすると応答があります。
$ sudo curl --unix-socket /tmp/firecracker.sock -i http://localhost/
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 29 Nov 2018 09:53:21 GMT
{"id":"anonymous-instance","state":"Uninitialized"}
テストVM実行
AWS公式のS3上にテストイメージがあるのでダウンロードします。
$ 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
$ ls -l
total 57496
-rwxr-xr-x 1 root root 6151112 Nov 29 13:40 firecracker
-rw-r--r-- 1 root root 31457280 Nov 29 13:56 hello-rootfs.ext4
-rw-r--r-- 1 root root 21266136 Nov 29 13:54 hello-vmlinux.bin
バイナリアップロード
$ 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": "/usr/firecracker/hello-vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
}'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 13:58:52 GMT
rootファイルシステムアップロード
$ 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": "/usr/firecracker/hello-rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 14:00:13 GMT
なんとなーくlsofで見てみると/dev/kvmやら関連ファイルが開かれています。
$ lsof /tmp/firecracker.sock
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firecrack 21848 root 8u unix 0xffffa0553bca6000 0t0 84467 /tmp/firecracker.sock type=STREAM
$ lsof -p 21848
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firecrack 21848 root cwd DIR 8,1 4096 2 /
firecrack 21848 root rtd DIR 8,1 4096 2 /
firecrack 21848 root txt REG 8,1 6151112 519615 /usr/firecracker/firecracker
firecrack 21848 root 0u CHR 136,0 0t0 3 /dev/pts/0
firecrack 21848 root 1u CHR 136,0 0t0 3 /dev/pts/0
firecrack 21848 root 2u CHR 136,0 0t0 3 /dev/pts/0
firecrack 21848 root 3u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 4u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 5u a_inode 0,13 0 10602 [eventpoll]
firecrack 21848 root 6r FIFO 0,12 0t0 84466 pipe
firecrack 21848 root 7w FIFO 0,12 0t0 84466 pipe
firecrack 21848 root 8u unix 0xffffa0553bca6000 0t0 84467 /tmp/firecracker.sock type=STREAM
firecrack 21848 root 9u a_inode 0,13 0 10602 [eventpoll]
firecrack 21848 root 10u a_inode 0,13 0 10602 [timerfd]
firecrack 21848 root 11u CHR 10,232 0t0 384 /dev/kvm
firecrack 21848 root 12u a_inode 0,13 0 10602 kvm-vm
firecrack 21848 root 13u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 14u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 15u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 16u a_inode 0,13 0 10602 [eventfd]
firecrack 21848 root 18r REG 8,1 21266136 519617 /usr/firecracker/hello-vmlinux.bin
VM起動
$ 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"
}'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 14:09:20 GMT
VMを起動させるとfirecrackerプロセスを実行したターミナル側にバーッと起動メッセージが出力され、その後にカーネルが起動してきます。
[ 0.000000] Linux version 4.14.55-84.37.amzn2.x86_64 (mockbuild@ip-10-0-1-79) (gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)) #1 SMP Wed Jul 25 18:47:15 UTC 2018
[ 0.000000] Command line: console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda virtio_mmio.device=4K@0xd0000000:5
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000007ffffff] usable
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] DMI not present or invalid.
[ 0.000000] Hypervisor detected: KVM
・
・
<中略>
・
・
2018-11-29T14:09:22.416078504 [:WARN:vmm/src/lib.rs:903] Guest-boot-time = 1490307 us 1490 ms, 1485027 CPU us 1485 CPU ms
OpenRC init version 0.35.5.87b1ff59c1 starting
Starting sysinit runlevel
OpenRC 0.35.5.87b1ff59c1 is starting up Linux 4.14.55-84.37.amzn2.x86_64 (x86_64)
・
・
<中略>
・
・
Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)
localhost
最後にログインプロンプトが表示されます。
VM起動しました。
ここでステータスを見てみるとstateがRunningになっています。
$ curl --unix-socket /tmp/firecracker.sock -i http://localhost/
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 29 Nov 2018 14:17:03 GMT
{"id":"anonymous-instance","state":"Running"}
他にもfirecrackerのAPIがあるんでGET系のものを実行してみます。
$ curl --unix-socket /tmp/firecracker.sock http://localhost/machine-config
{ "vcpu_count": 1, "mem_size_mib": 128, "ht_enabled": false, "cpu_template": "Uninitialized" }
VMにログイン
このVMイメージの場合はrootアカウントにrootパスワードでログインできます。
localhost login: root
Password:
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
login[984]: root login on 'ttyS0'
localhost:~#
とりあえずVMMとしてVM起動まで~
まあ、これだけだとQEMUとの違いとかがわからないっすね