前提条件
配置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的kernel和rootfs,我是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
否则会出现端口被占用的情况。