LXC:Cgroups、硬件直通,请用英文解释一下?

LXC:Cgroups、硬件直通,请用英文解释一下?

我有一个利基用例(不是“生产”,它是教室的实验室环境),我在 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:200200 = /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绕过所有限制(例如:访问设备、使用mountrmmod所有工作),然后查看应在配置中添加哪些权限。

相关内容