この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、shoitoです。
先日、re:Invent 2018で発表された軽量な仮想環境Firecrackerをさわって大量のmicroVMを立ち上げてみました。
検証環境
- i3.metal(EC2インスタンス)
- Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - 64 ビット (x86)
必須要件
- Linux 4.14+
- KVM
セットアップ
firecrackerリポジトリにあるGetting Started with Firecrackerに従って進めます。
Firecrackerのバイナリをリリースからダウンロードします。
もちろんBuilding From Sourceに従ってソースからビルドしてもかまいません。
$ curl -L -O https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
$ chmod +x firecracker-v0.11.0
次に検証用のLinuxカーネルイメージ(Alpine)とルートファイルシステムをダウンロードします。
$ 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
次にAppendix A: Setting Up KVM Accessにあるように、KVMのセッティングの確認をします。
$ [ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"
FAIL
ここでOKとならなかったら、現在のユーザーに権限がないので、付与します。
$ ll /dev/kvm
crw-------+ 1 root root 10, 232 11月 29 20:10 /dev/kvm
$ sudo setfacl -m u:${USER}:rw /dev/kvm
$ ll /dev/kvm
crw-rw----+ 1 root root 10, 232 11月 29 20:10 /dev/kvm
$ [ -r /dev/kvm ] && [ -w /dev/kvm ] && echo "OK" || echo "FAIL"
OK
setfacl後、確認するとOKになりました。
Firecrackerとゲストマシンを立ち上げる
準備ができたのでFirecrackerを立ち上げます。
$ ./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock
問題なく立ち上がったら、別のシェルから、ゲストマシンを立ち上げてみます。
まずはゲストカーネルのセッティングします。
$ 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"
}'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 21:31:57 GMT
次に、ルートファイルシステムをセッティングします。
$ 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
}'
HTTP/1.1 204 No Content
Date: Thu, 29 Nov 2018 21:32:24 GMT
これでゲストマシンの最低限のセッティングはできたのでInstanceStartアクション
で立ち上げます。
$ 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 21:33:24 GMT
リクエストが正常に受け付けられると、Firecrackerを立ち上げた1つ目のシェルに、一瞬でLinuxのブートログが表示され、ログインできる状態になります。
$ ./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock
[ 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.
...(省略)
Welcome to Alpine Linux 3.8
Kernel 4.14.55-84.37.amzn2.x86_64 on an x86_64 (ttyS0)
localhost login:
Password:
あとはroot:root
でログインすると、ゲストマシンのAlpine Linuxが使えるようになります。
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[855]: root login on 'ttyS0'
試しにCPU情報を見てみるとFirecrackerのデフォルト設定で、1 vCPUであることが分かります。
localhost:~#cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 79
model name : Intel(R) Xeon(R) Processor @ 2.30GHz
stepping : 1
microcode : 0x1
cpu MHz : 2299.998
cache size : 46080 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat arch_capabilities
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4599.99
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
これだけだと、ちょっと物足りないので、Announcing the Firecracker Open Source Technology: Secure and Fast microVM for Serverless Computingで紹介されているように、1000インスタンスのmicroVMも立ち上げてみました。
for ((i=0; i<1000; i++)); do
./firecracker-v0.11.0 --api-sock /tmp/firecracker-$i.sock &
done
psコマンドでプロセスを見るとfirecracker-0.sock
から firecracker-999.sock
で立ち上がっているのが確認できました。
ps ax | grep firecracker | grep -v grep
14598 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-0.sock
14599 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-1.sock
14600 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-2.sock
14602 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-3.sock
...(省略)
16643 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-997.sock
16646 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-998.sock
16647 pts/0 Sl 0:00 ./firecracker-v0.11.0 --api-sock /tmp/firecracker-999.sock
さいごに
さて、これを活かして面白いことができないかなと模索してますが、今回はFirecrackerが爆速で立ち上げられることの確認までです。
Firecracker関連ではfirecracker-microvm Organizationに以下の2つのリポジトリもあったので、次の機会にまとめようと思います。