Firecracker 最小化启动指南

一个极其简单的 Firecracker 启动指南
Firecracker 只能在启用了 KVM 的 Linux 系统下运行。 具体支持请参阅:支持文档。 此教程适用于 x86_64 架构的 Linux 系统。
你可以阅读 ArchLinux Wiki - KVM 了解如何开启 KVM。

什么是 Firecracker

Firecracker 是一种开源虚拟化技术,专为创建和管理安全的多租户容器和功能服务而设计,这些服务提供无服务器运行模型。 Firecracker 在 MicroVMs 中运行工作负载,这些虚拟机结合了硬件虚拟化技术提供的安全性和隔离特性,以及容器的速度和灵活性。

安装 Firecracker

# 没错就这么点
sudo pacman -S firecracker --needed

构建 RootFS 和 Kernel 镜像

你可以参阅 官方构建指南 更全面的了解这一过程。构建 RootFS 需要 docker,请提前安装。

创建 Kernel 镜像

Terminal
# 1. 克隆仓库
git clone https://github.com/torvalds/linux.git linux.git --depth=1
git clone https://github.com/firecracker-microvm/firecracker firecracker.git --depth=1
cd linux.git

## 2. 配置内核
cp ../firecracker.git/resources/guest_configs/microvm-kernel-ci-x86_64-6.1.config ./.config
make olddefconfig

# 你可以在这一步配置内核选项,配置方法不仅限执行 `make menuconfig`
# 你可以将 PCI 支持打开,官方也推荐启用 PCI 确保 MicroVM 的性能与安全性(方便起见,本教程不启用 PCI)
make menuconfig

## 3. 编译内核(可能超过 3 分钟,这取决于 CPU 的性能)
make vmlinux -j$(nproc)

执行上述步骤后,Kernel 镜像将会生成在 linux.git/vmlinux 文件中。(文件大小约为 30MB)

创建 RootFS 镜像

为了标准化 RootFS 中的内容,我建议你使用 Dockerfile 构建镜像并导出。

Dockerfile
FROM docker.io/library/alpine:3.23.3

# Install utils
RUN apk add openrc \
    && apk add util-linux

# Setup agetty
RUN ln -s agetty /etc/init.d/agetty.ttyS0 \
    && echo ttyS0 > /etc/securetty \
    && rc-update add agetty.ttyS0 default

# Setup openrc
RUN rc-update add devfs boot \
    && rc-update add procfs boot \
    && rc-update add sysfs boot

# Set root password
RUN echo "root:root" | chpasswd
Terminal
# 1. 准备一个合适大小的文件,示例中可用大小为 50MB,你可以通过修改后面的 `50` 来修改文件大小
#    大小最少需要 30MB
dd if=/dev/zero of=rootfs.ext4 bs=1M count=50

# 2. 创建 ext4 文件系统(不能使用 btrfs、xfs 等其他文件系统,Firecracker 只支持 ext4)
mkfs.ext4 rootfs.ext4

# 3. 挂载 RootFS
mkdir /tmp/my-rootfs
sudo mount rootfs.ext4 /tmp/my-rootfs
sudo chmod 777 /tmp/my-rootfs # 方便起见,使用 777 权限(允许读写)

# 4. 构建 Docker 镜像
docker build --tag=rootfs --file Dockerfile .
docker create --name rootfs rootfs
docker export rootfs -o rootfs.tar
docker rm rootfs

# 你可以删除 Docker 镜像
# docker rmi rootfs

# 5. 导出到 RootFS
tar -xf rootfs.tar -C /tmp/my-rootfs

# 6. 卸载 RootFS
sudo umount /tmp/my-rootfs

运行 Firecracker

方便起见,我们使用 firectl 作为运行 Firecracker 的工具。 在 ArchLinux 发行版中,你可以安装 firectl AUR 包。
Terminal
# 使用 ttyS0 串口,Panic 时重启
firectl --root-drive=rootfs.ext4 --kernel=vmlinux --kernel-opts="console=ttyS0 reboot=k panic=1"

如果出现了登陆提示符,那么恭喜你,Firecracker 已经可以成功运行了。 你可以执行 reboot 退出并销毁 MicroVM。(在最小化配置下,reboot 是最可靠的退出方式)。 如果你无法登陆系统,请 pkill firectl 停止 firectl,并挂载 RootFS 镜像(rootfs.ext4),chroot 进去,接着使用 passwd 修改密码:

Terminal
sudo mount rootfs.ext4 /tmp/my-rootfs
sudo chroot /tmp/my-rootfs /bin/sh
passwd
exit
sudo umount /tmp/my-rootfs

如果 MicroVM 立即结束运行,没有出现登陆提示符(终端上会出现 Kernel panic 的信息),你需要仔细检查上面的步骤,确保没有错误,因为发生了 Kernel Panic。

目前为止,Firecracker 已经可以正常启动,但是无法访问网络。