配置firecracker流程即踩坑记录

前提条件

配置firecracker的前提条件就是本机支持虚拟化。
可以通过如下的命令进行判断,如果返回不是0则支持

grep -E '(svm|vmx)' /proc/cpuinfo”

确定支持虚拟化后需要令kvm具有读写权限。

sudo setfacl -m u:${USER}:rw /dev/kvm

配置过程

整个流程都是按照github上面的指导手册完成的,过程中遇到了一点点的问题,但是总体来说问题不大。

我选择的并不是从头的从源码构建firecracker,而是直接下载了github提供的firecracker的二进制文件,直接运行。

首先下载对应的二进制文件并解压

release_url="https://github.com/firecracker-microvm/firecracker/releases"
latest=$(basename $(curl -fsSLI -o /dev/null -w  %{url_effective} ${release_url}/latest))
arch=`uname -m`
curl -L ${release_url}/download/${latest}/firecracker-${latest}-${arch}.tgz \
| tar -xz

该条命令可以直接在命令行中粘贴运行也可以放在shell文件中运行。

然后对下载好的文件进行重命名

mv release-${latest}-$(uname -m)/firecracker-${latest}-$(uname -m) firecracker

此时firecracker可执行程序已经准备好了,可以利用如下命令进行测试判断是否可以成功运行。

./firecracker --version

正确输出的结果是会输出firecracker的版本。

接下来需要在firecracker可执行程序所在的文件夹下面下载vm的kernelrootfs,我是x86_64系统,这里直接放了链接,也可以通过命令进行下载。

arch=`uname -m`
dest_kernel="hello-vmlinux.bin"
dest_rootfs="hello-rootfs.ext4"
image_bucket_url="https://s3.amazonaws.com/spec.ccfc.min/img/quickstart_guide/$arch"

if [ ${arch} = "x86_64" ]; then
    kernel="${image_bucket_url}/kernels/vmlinux.bin"
    rootfs="${image_bucket_url}/rootfs/bionic.rootfs.ext4"
elif [ ${arch} = "aarch64" ]; then
    kernel="${image_bucket_url}/kernels/vmlinux.bin"
    rootfs="${image_bucket_url}/rootfs/bionic.rootfs.ext4"
else
    echo "Cannot run firecracker on $arch architecture!"
    exit 1
fi

echo "Downloading $kernel..."
curl -fsSL -o $dest_kernel $kernel

echo "Downloading $rootfs..."
curl -fsSL -o $dest_rootfs $rootfs

echo "Saved kernel file to $dest_kernel and root block device to $dest_rootfs."

下载成功之后便可以运行,需要在firecracker所在的文件夹下面打开两个终端,第一个终端执行如下命令:

首先确定firecracker端口没有被占用

rm -f /tmp/firecracker.socket

然后运行firecracker,此时该终端会卡在这里等待vm启动

./firecracker --api-sock /tmp/firecracker.socket

然后在另一个终端对vm进行配置,首先设置kernel:

arch=`uname -m`
kernel_path=$(pwd)"/hello-vmlinux.bin"

if [ ${arch} = "x86_64" ]; then
    curl --unix-socket /tmp/firecracker.socket -i \
      -X PUT 'http://localhost/boot-source'   \
      -H 'Accept: application/json'           \
      -H 'Content-Type: application/json'     \
      -d "{
            \"kernel_image_path\": \"${kernel_path}\",
            \"boot_args\": \"console=ttyS0 reboot=k panic=1 pci=off\"
       }"
elif [ ${arch} = "aarch64" ]; then
    curl --unix-socket /tmp/firecracker.socket -i \
      -X PUT 'http://localhost/boot-source'   \
      -H 'Accept: application/json'           \
      -H 'Content-Type: application/json'     \
      -d "{
            \"kernel_image_path\": \"${kernel_path}\",
            \"boot_args\": \"keep_bootcon console=ttyS0 reboot=k panic=1 pci=off\"
       }"
else
    echo "Cannot run firecracker on $arch architecture!"
    exit 1
fi

此时,如果你下载的vmhello.bin和shell文件中写的bin名称不一样的时候会出现如下错误:the kernel file cannot be opened:No such file or directory 在这里插入图片描述
正常执行的结果如下:在这里插入图片描述

然后设置rootfs:

rootfs_path=$(pwd)"/hello-rootfs.ext4"
curl --unix-socket /tmp/firecracker.socket -i \
  -X PUT 'http://localhost/drives/rootfs' \
  -H 'Accept: application/json'           \
  -H 'Content-Type: application/json'     \
  -d "{
        \"drive_id\": \"rootfs\",
        \"path_on_host\": \"${rootfs_path}\",
        \"is_root_device\": true,
        \"is_read_only\": false
   }"

结果同上

最终运行vm

curl --unix-socket /tmp/firecracker.socket -i \
  -X PUT 'http://localhost/actions'       \
  -H  'Accept: application/json'          \
  -H  'Content-Type: application/json'    \
  -d '{
      "action_type": "InstanceStart"
   }'

此时可能会出现如下所示的错误:

在这里插入图片描述

这是因为If another hypervisor like VMware or VirtualBox is running on the host and locks /dev/kvm, Firecracker process will fail to start with “Resource busy” error.

This issue can be resolved by terminating the other hypervisor running on the host, and allowing Firecracker to start.

巧的是前不久因为配置minikube刚好安装了virtualbox,不停的aapt remove后通过top发现有一个正在运行的virtualbox进程,把该进程停下之后就可以成功运行了。

在这里插入图片描述

手册上说需要输入用户名和密码,如果是在github上面指出来的地址下载用户名和密码都是root,但是我在运行之后并没有让我输入用户名和密码。

然后在虚拟机中关机只需要输入reboot即可。

再次启动之前需要rm一下socket,也就是运行的第一条命令:

rm -f /tmp/firecracker.socket

否则会出现端口被占用的情况。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LYSnowy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值