Files

4.2 KiB
Raw Permalink Blame History

control/setup path 는 QEMU 를 지나고 data path 는 backend 에 따라 QEMU 를 지나기도 안 지나기도 한다

Alternative text

위쪽 줄은 virsh, libvirt, QEMU, virtio-net Device Model 로 이어지는 control/setup path 이고 아래쪽 줄은 Physical NIC 에서 TAP 까지 이어지는 data path 다. 두 줄이 vhost-net 과 QEMU virtio backend 에서 만나 virtqueue 를 지나 Guest 로 모이는 구성도.

Long description

왼쪽에서 오른쪽으로 읽는다. 위쪽 줄이 control/setup path 다. virsh 에서 libvirt 와 QEMU 를 지나 virtio-net Device Model 에 닿고, 그 device model 이 virtual NIC 생성과 feature negotiation, virtqueue 설정, vhost-net backend 설정을 맡는다. 아래쪽 줄이 data path 다. Physical NIC 에서 Physical NIC Driver 와 Linux Bridge, TAP 까지 온다. 두 줄은 네 번째 열 다음에서 만난다. device model 은 점선으로 backend 둘을 설정하고, TAP 은 실선으로 그 둘 가운데 실제로 쓰는 쪽에 packet 을 넘긴다. vhost-net 을 쓰면 packet 은 Host Kernel 안에서 처리돼 QEMU 사용자 공간을 지나지 않고, QEMU virtio backend 를 쓰면 같은 packet 이 QEMU 사용자 공간을 지난다. 어느 쪽이든 virtqueue 에서 만나 Guest 로 올라간다. 이 Host 가 둘 중 어느 backend 를 쓰고 있는지는 그림이 말하지 않는다.

Elements and evidence

  • virsh (cli): VM/network 관리 CLI. packet datapath 에는 직접 참여하지 않는다. Evidence: L5662L5662, L5687L5689.
  • libvirt (service): VM lifecycle 과 NIC/network configuration 을 관리한다. Evidence: L5663L5663, L5691L5691.
  • QEMU (process): 실제로 실행되는 프로세스. 이 안에 virtio-net device model 이 있다. Evidence: L5666L5666, L5693L5693.
  • virtio-net Device Model (service): control/setup path 가 닿는 자리. 장치를 만들고 backend 를 연결한다. Evidence: L5666L5666, L5695L5700.
  • Physical NIC (hardware): 밖에서 온 packet 이 처음 닿는 하드웨어. Evidence: L5706L5708.
  • Physical NIC Driver (driver): 그 하드웨어를 제어하는 Host kernel driver. Evidence: L5674L5674, L5710L5710.
  • Linux Bridge / Routing / NAT (network): L2 software switch 와 L3 routing, 주소 변환이 놓이는 자리. Evidence: L5672L5673, L5712L5712.
  • TAP (network): VM 의 Ethernet frame 과 Host Linux networking 을 잇는 접점. Evidence: L5671L5671, L5714L5714.
  • vhost-net (kernel): 반복되는 packet datapath 를 Host kernel 에서 처리하는 backend. Evidence: L5669L5669, L5716L5716.
  • QEMU virtio backend (process): vhost-net 을 쓰지 않을 때 datapath backend 를 맡는 쪽. Evidence: L5668L5668, L5742L5742.
  • virtqueue (queue): Guest 와 Host backend 가 I/O buffer 를 주고받는 descriptor 기반 공유 큐. Evidence: L5667L5667, L5718L5718.
  • Guest (service): packet 이 올라가 애플리케이션 socket 에 닿는 쪽. Evidence: L5664L5665, L5720L5726.

Relationships

  • Linux Bridge / Routing / NAT → TAP: Ethernet Frame. Evidence: L5671L5671, L5712L5714.
  • Physical NIC Driver → Linux Bridge / Routing / NAT: L2 forwarding. Evidence: L5672L5672, L5710L5712.
  • libvirt → QEMU: NIC/network configuration. Evidence: L5663L5663, L5691L5693.
  • Physical NIC → Physical NIC Driver: Ethernet Frame. Evidence: L5671L5671, L5708L5710.
  • QEMU virtio backend → virtqueue: Data Path. Evidence: L5729L5729, L5742L5744.
  • QEMU → virtio-net Device Model: QEMU process. Evidence: L5666L5666, L5693L5695.
  • virtio-net Device Model → QEMU virtio backend: control. Evidence: L5668L5668, L5700L5700.
  • virtio-net Device Model → vhost-net: vhost-net backend 설정. Evidence: L5700L5700, L5716L5716.
  • TAP → QEMU virtio backend: data. Evidence: L5729L5729, L5740L5742.
  • TAP → vhost-net: vhost-net 사용. Evidence: L5703L5703, L5714L5716.
  • vhost-net → virtqueue: Data Path. Evidence: L5703L5703, L5716L5718.
  • virsh → libvirt: Control / Setup. Evidence: L5662L5663, L5684L5691.
  • virtqueue → Guest: virtio-net Frontend Driver. Evidence: L5664L5664, L5718L5726.