前言:
libvirt-4.3搭配qemu-2.12使用,如果使用默认的编译选项,可能会让qemu无法正常启动虚拟机。会报出来“qemu-system-x86_64: -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny: seccomp support is disabled”的错误。
好吧,老习惯,分析代码。
分析:
1, seccomp support is disabled
在编译的时候,没有打开CONFIG_SECCOMP编译选项。
从configure文件上来看,如果安装了libseccomp就是默认打开的;再或者就是--enable-seccomp和--disable-seccomp来控制。
2,libvirt
/etc/libvirt/qemu.conf中通过seccomp_sandbox来控制。
0是关闭,1是打开,-1是自动检测。注意,如果这里没有配置,libvirt则会自动检测。
那么就会出现上文的状况,libvirt的检测逻辑中,没有发现当前版本的qemu不支持sandbox,启动参数中带有了sandbox配置,导致qemu报错。
解决办法就是安装libseccomp,执行congfigure时添加--enable-seccomp,清空/var/cache/libvirt/qemu/capabilities重启libvirtd即可。
3,libseccomp
下载代码https://github.com/seccomp/libseccomp
libseccomp的代码量比较小,大约有几部分:
a,本地的db。用来保存seccomp的规则。
b,bpf生成。用来生成bpf代码。
c,使用syscall加载到kernel。prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, program);
4, PR_SET_SECCOMP
看一段man page,大意是说通过prctl的 PR_SET_SECCOMP可以限制进程使用syscall。更多的话,需要参考内存文档。
5,gvisor
Google搞了一个大新闻,开源了gvisor,地址https://github.com/google/gvisor
套路复杂很多,主要是为了容器使用的。
容器是直接运行在host os上的,可以访问host上的所有syscall,安全性上确实还不够。gvisor可以在一定程度上弥补这一点。
相比之下,虚拟机则不是,qemu使用到syscall集中于epoll,pread,pwrite,ioctl等比较有限的范围内。
领取专属 10元无门槛券
私享最新 技术干货