假设主机系统已经支持 KVM,是否可以创建一个 docker 镜像,其中包含一些脚本来使用 virsh 和 QEMU-KVM 启动 VM(在容器内)?
我们正在研究 dockerize 一个脚本,该脚本通过 QEMU-KVM 启动虚拟机并从虚拟机中提取一些结果。
docker --privileged
来自 Ubuntu 17.10 主机、Docker 1.13.1 的一些工作命令:
sudo docker run --name ub16 -i --privileged -t ubuntu:16.04 bash
然后在 Docker 内部:
apt-get update -y
apt-get install qemu -y
qemu-system-x86_64
qemu-system-x86_64 \
-append 'root=/dev/vda console=ttyS0' \
-drive file='rootfs.ext2.qcow2,if=virtio,format=qcow2' \
-enable-kvm \
-kernel 'bzImage' \
-nographic \
;
使用此设置生成根文件系统和bzImage。
--device=/dev/kvm
添加到之前的答案:使用
--privileged
可能会为您的用例打开太多权限。我已经能够使用 kvm 运行 qemu,并且无需使用设备参数来运行 qemu。
尝试以下命令:
docker run --device=/dev/kvm -it ubuntu bash
码头工人内部:
apt-get update -y
apt-get install -y qemu-system-x86
qemu-system-x86_64 \
-append 'root=/dev/vda console=ttyS0' \
-drive file='rootfs.ext2.qcow2,if=virtio,format=qcow2' \
-enable-kvm \
-kernel 'bzImage' \
-nographic \
;
主机系统
上的
--device=/dev/kvm
时,
/dev/kvm
才有效。
正确的方法是将容器用户添加到
kvm
组中,但容器下的组ID(GID)必须与主机系统上的GID相同。您可以使用 grep kvm /etc/groups
在主机上找到组 ID。
现在的问题是GID取决于主机系统,不同的主机通常会有不同的GID。要解决此问题,您可以使用
kvm
:在映像和主机系统上为
groupmod
组设置已知的 GID
groupmod -g 1100 kvm
确保主机系统上的
/dev/kvm
将 kvm
作为组。
另一种更简单的方法是在容器启动时设置组:
docker run --device=/dev/kvm --group-add GID
其中
GID
是主机系统上 kvm
组的 ID。
这一切都是必需的,因为权限是通过 UID 和 GID 跟踪的,docker 使用主机系统的内核,因此 docker 容器上的 UID 和 GID 直接映射到主机系统上的 ID。容器用户和组与主机系统上的名称相同并不意味着它们具有相同的 ID。
简单。您需要运行特权容器,确保容器中有 /dev/kvm 节点,安装所有软件包来为 kvm 提供服务(libvirt、quemu,等等)——这就是您所需要的。请参阅 https://github.com/sivaramsk/docker-kvm 以供参考。
如果您不想使用--privileged 选项。 更智能的设备管理器允许容器以安全的方式直接访问主机设备。