Firecracker VM — это легковесная виртуальная машина (VM), разработанная компанией Amazon Web Services (AWS) для создания и управления изолированными, безопасными и высокопроизводительными виртуальными средами. Она специально оптимизирована для использования в сервисах, таких как AWS Lambda и AWS Fargate, где требуется быстрое создание и запуск виртуальных машин с минимальными накладными расходами.

По сути дела это это оптимизированная версия KVM, которая позволяет запускать за доли секунды виртуальные машины с предустановленным пред настроенным пользовательским окружением и ядром. Мы будем использовать его для быстрого создания тестовых сред.

git clone https://github.com/avkcode/firecracker-sandbox.git
cd firecracker-sandbox 

Vm-config.json – конфиг VM firecracker, а в директории tools находятся сборочные скрипты.

Сначала устанавливаем последнюю версию firecracker:

./tools/install-firecracker.sh

Следующий шаг – запускаем сборочный скрипт rootfs для Debian. Этот скрипт скачивает скомпилированное ядро и с помощью debootstrap собирает корневую файловую систему.

rootfs
rootfs

Копируем в корневую папку rootfs и ядро:

cp tools/firecracker-rootfs.ext4 tools/vmlinux .

Makefile в данном случае это скрипт автоматизации для настройки firecracker:

make
make

Сначала make activate чтобы активировать сокет, потом make net-up чтобы настроить iptables для FC.

Можно запускать VM с помощью команды make up.
Обычно меньше секунды требуется для загрузки полноценной виртуальной машины. Логин пароль root:root это задается с помощью chroot в сборочном скрипте. В том же скрипте в rootfs задаются настройки сети и DNS. Все это кастомизируется.

boot
boot

Сборка кастомного ядра Linux для использования в средах, таких как Kubernetes или базы данных, может быть оправдана в ряде случаев. Это позволяет оптимизировать производительность, улучшить безопасность и адаптировать систему под конкретные требования. Рассмотрим подробнее, зачем это может быть нужно.

Кастомное ядро позволяет включить или отключить конкретные функции, которые могут значительно повлиять на производительность в контексте Kubernetes или баз данных.

Для Kubernetes:

Улучшение работы сетевого стека:
Включение поддержки современных сетевых протоколов (например, eBPF для Cilium или IPVS для kube-proxy).
Оптимизация работы с сетевыми интерфейсами и снижение задержек.
Улучшение работы cgroups и namespaces:
Kubernetes активно использует cgroups и namespaces для изоляции контейнеров. Кастомное ядро может включать улучшения для этих механизмов.
Оптимизация планировщика задач:
Настройка планировщика задач (например, CFS или MuQSS) для лучшей работы с высоконагруженными контейнерами.

Для баз данных:
Оптимизация ввода-вывода (I/O):
Включение поддержки асинхронного I/O (AIO) и оптимизация работы с файловыми системами (например, ext4, XFS, Btrfs).
Настройка параметров ядра для работы с SSD (например, noop или deadline I/O scheduler).
Улучшение работы с памятью:
Настройка параметров управления памятью (например, vm.swappiness, vm.dirty_ratio) для снижения накладных расходов.
Поддержка больших страниц (HugePages):
Включение поддержки HugePages для снижения накладных расходов на управление памятью, что особенно полезно для баз данных, таких как PostgreSQL или Oracle.

Один из конкретных примеров:

HugePages

Hugepages (или гигантские страницы) — это механизм управления памятью в современных операционных системах, который позволяет использовать страницы памяти большего размера, чем стандартные (обычно 4 КБ). Это может значительно улучшить производительность в определенных сценариях, особенно для приложений, работающих с большими объемами данных, таких как базы данных, виртуализация или высокопроизводительные вычисления (HPC).

Transparent Hugepages (THP) — это механизм в ядре Linux, который автоматически управляет использованием гигантских страниц (hugepages) для приложений, чтобы улучшить производительность памяти без необходимости ручной настройки. В отличие от обычных hugepages, которые требуют явного выделения и настройки, Transparent Hugepages работают "прозрачно" для приложений и системы.

Configuring HugePages on Linux

Transparent Hugepage

Using the Deadline IO Scheduler

В директории tools лежит скрипт которые собирает кастомное ядро vmlinux. Версию ядра можно указать с помощью переменной KERNEL_VERSION="6.11".
[

Kernel
Kernel

В скрипте можно задавать параметры ядра:

Custom params
Custom params

Подписывайтесь на мой канал.

Комментарии (9)


  1. Sap_ru
    19.02.2025 20:53

    Почему не докер?


    1. kt97679
      19.02.2025 20:53

      виртуальные машины обеспечивают бОльшую изоляцию


      1. Sap_ru
        19.02.2025 20:53

        Для сборки ядра?


        1. kt97679
          19.02.2025 20:53

          прошу прощения, я думал вы спрашиваете зачем в принципе нужен firecracker


          1. Sap_ru
            19.02.2025 20:53

            Firecracker прикольный. Я про него не знал.Я просто не понял, как это связано со сборкой ядра и зачем такой оверкил, если можно в докере собирать. А можно и просто в папочке.


            1. Rikimaru22 Автор
              19.02.2025 20:53

              В docker не будет изоляции, которую дает ВМ. Ядро мы собираем, чтобы протестировать какой-то прикладной софт с определенной версией ядра. Все это нужно автоматизировать. С firecracker можно запускать сотни и тысячи ВМ на одном хосте – без проблем.


  1. mc2
    19.02.2025 20:53

    Судя по картинкам, все нужно делать от рута. Это действительно так?


    1. Rikimaru22 Автор
      19.02.2025 20:53

      Firecracker нужен только доступ к /dev/kvm.


  1. aabzel
    19.02.2025 20:53

    Время собирать ядро

    Если переводить дословно kernel, то можно переименовать текст как

    "Время собирать зерно"