[{"data":1,"prerenderedAt":51},["ShallowReactive",2],{"navigation":3,"search":14},[4],{"title":5,"path":6,"stem":7,"children":8,"page":13},"Posts","\u002Fposts","posts",[9],{"title":10,"path":11,"stem":12},"Firecracker 最小化启动指南","\u002Fposts\u002Ffirecracker-minimal-startup","posts\u002Ffirecracker-minimal-startup",false,[15,19,25,30,35,41,46],{"id":11,"title":10,"titles":16,"content":17,"level":18},[],"一个极其简单的 Firecracker 启动指南 Firecracker 只能在启用了 KVM 的 Linux 系统下运行。\n具体支持请参阅：支持文档。\n此教程适用于 x86_64 架构的 Linux 系统。 你可以阅读 ArchLinux Wiki - KVM 了解如何开启 KVM。",1,{"id":20,"title":21,"titles":22,"content":23,"level":24},"\u002Fposts\u002Ffirecracker-minimal-startup#什么是-firecracker","什么是 Firecracker",[10],"Firecracker 是一种开源虚拟化技术，专为创建和管理安全的多租户容器和功能服务而设计，这些服务提供无服务器运行模型。\nFirecracker 在 MicroVMs 中运行工作负载，这些虚拟机结合了硬件虚拟化技术提供的安全性和隔离特性，以及容器的速度和灵活性。",2,{"id":26,"title":27,"titles":28,"content":29,"level":24},"\u002Fposts\u002Ffirecracker-minimal-startup#安装-firecracker","安装 Firecracker",[10],"# 没错就这么点\nsudo pacman -S firecracker --needed\nARCH=\"$(uname -m)\"\n\n# 启动 Docker\nsudo systemctl start docker\n\n# 克隆 Firecracker 仓库\ngit clone https:\u002F\u002Fgithub.com\u002Ffirecracker-microvm\u002Ffirecracker firecracker_src\n\n# 构建 Firecracker\n#\n# 可以通过传递参数 \"-l gnu\" 来构建 GNU 版本\n#\n# 这将在以下位置生成 firecracker 和 jailer 二进制文件：\n# `.\u002Ffirecracker\u002Fbuild\u002Fcargo_target\u002F${toolchain}\u002Fdebug`\n#\nsudo .\u002Ffirecracker_src\u002Ftools\u002Fdevtool build\n\n# 重命名可执行文件为 \"firecracker\"\nsudo cp .\u002Ffirecracker_src\u002Fbuild\u002Fcargo_target\u002F${ARCH}-unknown-linux-musl\u002Fdebug\u002Ffirecracker firecracker\nARCH=\"$(uname -m)\"\n\nrelease_url=\"https:\u002F\u002Fgithub.com\u002Ffirecracker-microvm\u002Ffirecracker\u002Freleases\"\nlatest=$(basename $(curl -fsSLI -o \u002Fdev\u002Fnull -w  %{url_effective} ${release_url}\u002Flatest))\ncurl -L ${release_url}\u002Fdownload\u002F${latest}\u002Ffirecracker-${latest}-${ARCH}.tgz \\\n| tar -xz\n\n# 重命名可执行文件为 \"firecracker\"\nmv release-${latest}-$(uname -m)\u002Ffirecracker-${latest}-${ARCH} firecracker",{"id":31,"title":32,"titles":33,"content":34,"level":24},"\u002Fposts\u002Ffirecracker-minimal-startup#构建-rootfs-和-kernel-镜像","构建 RootFS 和 Kernel 镜像",[10],"你可以参阅 官方构建指南 更全面的了解这一过程。构建 RootFS 需要 docker，请提前安装。",{"id":36,"title":37,"titles":38,"content":39,"level":40},"\u002Fposts\u002Ffirecracker-minimal-startup#创建-kernel-镜像","创建 Kernel 镜像",[10,32],"# 1. 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002Ftorvalds\u002Flinux.git linux.git --depth=1\ngit clone https:\u002F\u002Fgithub.com\u002Ffirecracker-microvm\u002Ffirecracker firecracker.git --depth=1\ncd linux.git\n\n## 2. 配置内核\ncp ..\u002Ffirecracker.git\u002Fresources\u002Fguest_configs\u002Fmicrovm-kernel-ci-x86_64-6.1.config .\u002F.config\nmake olddefconfig\n\n# 你可以在这一步配置内核选项，配置方法不仅限执行 `make menuconfig`\n# 你可以将 PCI 支持打开，官方也推荐启用 PCI 确保 MicroVM 的性能与安全性（方便起见，本教程不启用 PCI）\nmake menuconfig\n\n## 3. 编译内核（可能超过 3 分钟，这取决于 CPU 的性能）\nmake vmlinux -j$(nproc) 执行上述步骤后，Kernel 镜像将会生成在 linux.git\u002Fvmlinux 文件中。（文件大小约为 30MB）",3,{"id":42,"title":43,"titles":44,"content":45,"level":40},"\u002Fposts\u002Ffirecracker-minimal-startup#创建-rootfs-镜像","创建 RootFS 镜像",[10,32],"为了标准化 RootFS 中的内容，我建议你使用 Dockerfile 构建镜像并导出。 FROM docker.io\u002Flibrary\u002Falpine:3.23.3\n\n# Install utils\nRUN apk add openrc \\\n    && apk add util-linux\n\n# Setup agetty\nRUN ln -s agetty \u002Fetc\u002Finit.d\u002Fagetty.ttyS0 \\\n    && echo ttyS0 > \u002Fetc\u002Fsecuretty \\\n    && rc-update add agetty.ttyS0 default\n\n# Setup openrc\nRUN rc-update add devfs boot \\\n    && rc-update add procfs boot \\\n    && rc-update add sysfs boot\n\n# Set root password\nRUN echo \"root:root\" | chpasswd # 1. 准备一个合适大小的文件，示例中可用大小为 50MB，你可以通过修改后面的 `50` 来修改文件大小\n#    大小最少需要 30MB\ndd if=\u002Fdev\u002Fzero of=rootfs.ext4 bs=1M count=50\n\n# 2. 创建 ext4 文件系统（不能使用 btrfs、xfs 等其他文件系统，Firecracker 只支持 ext4）\nmkfs.ext4 rootfs.ext4\n\n# 3. 挂载 RootFS\nmkdir \u002Ftmp\u002Fmy-rootfs\nsudo mount rootfs.ext4 \u002Ftmp\u002Fmy-rootfs\nsudo chmod 777 \u002Ftmp\u002Fmy-rootfs # 方便起见，使用 777 权限（允许读写）\n\n# 4. 构建 Docker 镜像\ndocker build --tag=rootfs --file Dockerfile .\ndocker create --name rootfs rootfs\ndocker export rootfs -o rootfs.tar\ndocker rm rootfs\n\n# 你可以删除 Docker 镜像\n# docker rmi rootfs\n\n# 5. 导出到 RootFS\ntar -xf rootfs.tar -C \u002Ftmp\u002Fmy-rootfs\n\n# 6. 卸载 RootFS\nsudo umount \u002Ftmp\u002Fmy-rootfs",{"id":47,"title":48,"titles":49,"content":50,"level":24},"\u002Fposts\u002Ffirecracker-minimal-startup#运行-firecracker","运行 Firecracker",[10],"方便起见，我们使用 firectl 作为运行 Firecracker 的工具。\n在 ArchLinux 发行版中，你可以安装 firectl AUR 包。 # 使用 ttyS0 串口，Panic 时重启\nfirectl --root-drive=rootfs.ext4 --kernel=vmlinux --kernel-opts=\"console=ttyS0 reboot=k panic=1\" 如果出现了登陆提示符，那么恭喜你，Firecracker 已经可以成功运行了。\n你可以执行 reboot 退出并销毁 MicroVM。（在最小化配置下，reboot 是最可靠的退出方式）。\n如果你无法登陆系统，请 pkill firectl 停止 firectl，并挂载 RootFS 镜像（rootfs.ext4），chroot 进去，接着使用 passwd 修改密码： sudo mount rootfs.ext4 \u002Ftmp\u002Fmy-rootfs\nsudo chroot \u002Ftmp\u002Fmy-rootfs \u002Fbin\u002Fsh\npasswd\nexit\nsudo umount \u002Ftmp\u002Fmy-rootfs 如果 MicroVM 立即结束运行，没有出现登陆提示符（终端上会出现 Kernel panic 的信息），你需要仔细检查上面的步骤，确保没有错误，因为发生了 Kernel Panic。 目前为止，Firecracker 已经可以正常启动，但是无法访问网络。 html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",1773755573940]