我有一个利基用例(不是“生产”,它是教室的实验室环境),我在 Proxmox VE 机器上使用 LXC 容器来运行 GNS3 服务器和 KVM 虚拟化。
长话短说,我需要运行 KVM里面LXC容器,这意味着我必须将主机的CPU虚拟化功能传递给容器。我已经根据我读过的一些教程进行了这项工作,但我不明白为什么有用。我不知道这些配置文件行实际上做了什么,我只是盲目地复制粘贴。
这是我的容器配置(来自/etc/pve/lxc/102.conf
):
arch: amd64
cores: 2
hostname: ubuntu-gns3vm2-clone
memory: 4096
net0: name=eth0,bridge=vmbr0,hwaddr=86:4B:53:B7:66:0A,ip=dhcp,type=veth
ostype: ubuntu
rootfs: local-lvm:base-102-disk-0,size=16G
swap: 2048
template: 1
# LINES IN QUESTION
# This line seems to pass through the host CPU's virtualization features
lxc.cgroup.devices.allow: c 10:232 rwm
# These lines were needed for virtual machine networking to behave, I don't really understand them either
lxc.cgroup.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
有人可以帮我破译这些吗?10:232
和数字从何10:200
而来?什么是cgroup?实际上是做什么的/dev/net/tun
?
就像我说的,没有任何行为不当,一切都工作正常,我只是不想部署我不完全理解的东西。请随意使用 ELI5。
答案1
据我所知,容器中没有硬件直通:USB 设备、PCI 设备、KVM 等始终可用,只要使用它们的权限没有被容器中使用的各种隔离机制删除,或者除非它们的驱动程序/层包括名称空间感知,允许它们根据名称空间改变行为。以下是此类隔离机制的非详尽列表:
能力。例如在
/usr/share/lxc/config/common.conf
:# Drop some harmful capabilities lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
cgroups。例如在
/usr/share/lxc/config/common.conf
:# CGroup whitelist lxc.cgroup.devices.deny = a ## Allow any mknod (but not reading/writing the node) lxc.cgroup.devices.allow = c *:* m lxc.cgroup.devices.allow = b *:* m ## Allow specific devices ### /dev/null lxc.cgroup.devices.allow = c 1:3 rwm
[...]
秒计算。例如在
/usr/share/lxc/config/common.seccomp
:kexec_load errno 1 open_by_handle_at errno 1 init_module errno 1 finit_module errno 1 delete_module errno 1
这些是主要机制,还有其他机制(例如:pivot_root
/mount
当容器启动时,或在某些部分安装假条目/proc/
或/sys/
以防止访问)。
根据资源的类型,可以通过多种方式来模拟直通。例如:大多数网络接口(不是他们的底层硬件(或虚拟......)网络设备)有直接支持命名空间并且可以毫无问题地在命名空间中移动。这是容器的基本概念。和整体穿越不一样设备就像使用虚拟机一样。
现在,如果它是公开的 USB 串行设备/dev/ttyUSB0
,则不存在此类命名空间支持。这需要复制(使用mknod
)相关/dev/
条目,该条目通常具有动态设备节点值,这无助于进行简单的配置,并添加默认情况下删除的各种权限(请参阅上面的 cgroups)以恢复对此设备的访问。同样,不涉及设备直通。
因此,对于您的 KVM 案例。访问权限首先被删除(这是默认设置
lxc.cgroup.devices.deny = a
),然后您将其添加回来 ( lxc.cgroup.devices.allow: c 10:232 rwm
)。c 10:232
描述一个字符类型的设备节点字符主要 10和未成年人 232: 232 = /dev/kvm Kernel-based virtual machine (hardware virtualization extensions)
,这是 KVM 的保留元组。
QEMU/KVM正在创建和使用TUN/TAP
设备(而不是veth
与容器一起使用的接口)以具有网络连接,因此应添加回 QEMU/KVM 使用它们的权限,这就是下面与 tun 相关的行(Linux 记录的条目为c 10:200
是200 = /dev/net/tun TAP/TUN network device
)。另外,由于mount
在容器内是禁止的,LXC 预先安装了原件,/dev/net
以便能够使用原件/dev/net/tun
。我认为另一种方法是在容器中创建目录/dev/net
并创建相同的节点 ( c 10:200
) /dev/net/tun
。
如果您必须添加更多设备,您可以首先进行一些测试,以lxc-attach -e
绕过所有限制(例如:访问设备、使用mount
或rmmod
所有工作),然后查看应在配置中添加哪些权限。