LXC: Cgroups, hardware pass-through, 영어로 설명해주세요.

LXC: Cgroups, hardware pass-through, 영어로 설명해주세요.

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 등은 컨테이너에서 사용되는 다양한 격리 메커니즘에 의해 사용 권한이 제거되지 않는 한 항상 사용할 수 있습니다. 드라이버/레이어에 Aware 네임스페이스가 포함되어 있지 않으면 네임스페이스에 따라 동작을 변경할 수 있습니다. 다음은 이러한 격리 메커니즘의 대략적인 목록입니다.

  • 능력. 예를 들면 다음과 같습니다 /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). 또한 LXC에는 원본이 사전 설치되어 있으므로 mount컨테이너 내에서 /dev/net사용할 수 없습니다 /dev/net/tun. 또 다른 방법은 컨테이너 내부에 디렉터리를 만들고 /dev/net동일한 node( c 10:200) 를 만드는 것입니다 /dev/net/tun.

더 많은 장치를 추가해야 하는 경우 먼저 몇 가지 테스트를 수행하여 lxc-attach -e제한 사항(예: 액세스 장치, 사용량 mount또는 rmmod모든 작업)을 우회한 다음 구성에 어떤 권한을 추가해야 하는지 확인할 수 있습니다.

관련 정보