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

int*_*2Eh 6 virtualization kvm qemu docker virsh

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

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

hld*_*dev 11

--device=/dev/kvm仅当容器用户已经可以访问/dev/kvm主机系统时才有效。

正确的方法是将容器用户添加到kvm组中,但容器下的组ID(GID)必须与主机系统上的GID相同。您可以使用 找到主机上的组 ID grep kvm /etc/groups

现在的问题是GID取决于主机系统,不同的主机通常会有不同的GID。kvm要解决此问题,您可以使用以下命令在映像和主机系统上为组设置已知的 GID groupmod

groupmod -g 1100 kvm
Run Code Online (Sandbox Code Playgroud)

确保/dev/kvm主机系统上有kvmas 组。

另一种更简单的方法是在容器启动时设置组:

docker run --device=/dev/kvm --group-add GID
Run Code Online (Sandbox Code Playgroud)

其中是主机系统上组GID的 ID 。kvm

这一切都是必需的,因为权限是通过 UID 和 GID 跟踪的,docker 使用主机系统的内核,因此 docker 容器上的 UID 和 GID 直接映射到主机系统上的 ID。容器用户和组与主机系统上的名称相同并不意味着它们具有相同的 ID。


Cir*_*四事件 9

docker --privileged

来自Ubuntu 17.10主机Docker 1.13.1的一些有效命令:

sudo docker run --name ub16 -i --privileged -t ubuntu:16.04 bash
Run Code Online (Sandbox Code Playgroud)

然后在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 \
;
Run Code Online (Sandbox Code Playgroud)

根文件系统和使用此设置生成的bzImage 。


Mat*_*att 6

--device=/dev/kvm

添加到上一个答案:使用--privileged可能会为您的用例打开太多权限。我已经能够使用 kvm 运行 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 \
;
Run Code Online (Sandbox Code Playgroud)


cra*_*tua 0

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