Firecracker

Firecracker — новая технология виртуализации от Amazon, позволяющая запускать полноценные виртуальные машины с мнимальными накладными расходами.

В рамках заметки мы попробуем запустить тестовую VM. В качестве хоста будем использовать сервер с поддержкой KVM виртуализации, а в качестве ОС у нас будет работать Fedora. Стоит отметить, что запускать виртуаьные машины стоит в пределах окружения, созданного с помощью утилиты jailer, однако мы для тестов этот момент опустим в рамках данной заметки.

Установка Firecracker.

1. Для начала, ставим всё необходимое для работы виртуализации:

# dnf install @virtualization

2. Далее, проверяем, что в нашей системе есть всё необходимое для запуска firecracker (одна команда):

err=""; [ "$(uname) $(uname -m)" = "Linux x86_64" ] || err="ERROR: your system is not Linux x86_64."; [ -r /dev/kvm ] && [ -w /dev/kvm ] || err="$err\nERROR: /dev/kvm is innaccessible."; (( $(uname -r | cut -d. -f1)*1000 + $(uname -r | cut -d. -f2) >= 4014 )) || err="$err\nERROR: your kernel version ($(uname -r)) is too old."; dmesg | grep -i "hypervisor detected" && echo "WARNING: you are running in a virtual machine. Firecracker is not well tested under nested virtualization."; [ -z "$err" ] && echo "Your system looks ready for Firecracker." || echo -e "$err"

Эта команда проверит, не работаем ли мы в виртуальной машине, подходит ли для работы текущая версия ядра, и имеется ли доступ к /dev/kvm устройству. Если проверка пройдёт хорошо, мы получим сообщение:

Your system looks ready for Firecracker.

3. Мы не будем собирать утилиты из исходников, а воспользуемся готовым для работы бинарником. Так же, для работы нам потребуется скачать заранее подготовленные ядро и корневую файловую систему (для тестов уже подготовлен дистрибутив Alpine:

# wget https://github.com/firecracker-microvm/firecracker/releases/download/v0.11.0/firecracker-v0.11.0
# wget -O hello-vmlinux.bin https://s3.amazonaws.com/spec.ccfc.min/img/hello/kernel/hello-vmlinux.bin
# wget -O hello-rootfs.ext4 https://s3.amazonaws.com/spec.ccfc.min/img/hello/fsfiles/hello-rootfs.ext4

Запуск виртуальной машины.

Работа с firecracker у нас будет проходить с помощью api через файл сокет. Так же, для тестов нам потребуется два шелла (либо tmux, например, с двумя панелями).

4. В первом шелле, мы выполняем команду (и оставляем его открытым):

./firecracker-v0.11.0 --api-sock /tmp/firecracker.sock

5. Переходим во второй шелл, откуда и запускаем непосредственно VM. Для этого…

— Задаём ядро гостевой ОС:

# 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
}'

— Задаём параметры виртуальной машины — процессор и память:

# curl --unix-socket /tmp/firecracker.sock -i \
    -X PUT 'http://localhost/machine-config' \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    -d '{
        "vcpu_count": 2,
        "mem_size_mib": 2048
}'

— И запускаем саму виртуальную машину:

# 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"
}'

6. Возвращаемся к первому шеллу и видим там приглашение для ввода логина и пароля нашей гостевой ОС. Для тестовой VM это будут root и root соответственно.

firecracker

И знакомимся с нашей свежесозданной виртуалкой:

firecracker

7. Выключить инстанс из тестовых ядра и ФС можно, например, командой reboot, так же нужно удалить и сокет, созданный для теста VM.

Что в итоге? Один бинарник, весьма доступный API, изоляция инстансов. На мой взгляд, это как минимум неплохая альтернатива тому же LXC. Для ряда задач не хватает графического интерфейса, но думаю что это дело времени. В общем и целом — за развитием firecracker буду следить и дальше.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *