如何从 Docker 容器内启动 qemu-kvm?

问题描述 投票:0回答:5

假设主机系统已经支持 KVM,是否可以创建一个 docker 镜像,其中包含一些脚本来使用 virsh 和 QEMU-KVM 启动 VM(在容器内)?

我们正在研究 dockerize 一个脚本,该脚本通过 QEMU-KVM 启动虚拟机并从虚拟机中提取一些结果。

docker virtualization qemu kvm virsh
5个回答
22
投票

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。


17
投票

--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 \
;

7
投票
仅当容器用户已经可以访问

主机系统

上的 
--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。


0
投票

简单。您需要运行特权容器,确保容器中有 /dev/kvm 节点,安装所有软件包来为 kvm 提供服务(libvirt、quemu,等等)——这就是您所需要的。请参阅 https://github.com/sivaramsk/docker-kvm 以供参考。


0
投票

如果您不想使用--privileged 选项。 更智能的设备管理器允许容器以安全的方式直接访问主机设备。

© www.soinside.com 2019 - 2024. All rights reserved.