4.2 KiB
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: L5662–L5662, L5687–L5689.
- libvirt (service): VM lifecycle 과 NIC/network configuration 을 관리한다. Evidence: L5663–L5663, L5691–L5691.
- QEMU (process): 실제로 실행되는 프로세스. 이 안에 virtio-net device model 이 있다. Evidence: L5666–L5666, L5693–L5693.
- virtio-net Device Model (service): control/setup path 가 닿는 자리. 장치를 만들고 backend 를 연결한다. Evidence: L5666–L5666, L5695–L5700.
- Physical NIC (hardware): 밖에서 온 packet 이 처음 닿는 하드웨어. Evidence: L5706–L5708.
- Physical NIC Driver (driver): 그 하드웨어를 제어하는 Host kernel driver. Evidence: L5674–L5674, L5710–L5710.
- Linux Bridge / Routing / NAT (network): L2 software switch 와 L3 routing, 주소 변환이 놓이는 자리. Evidence: L5672–L5673, L5712–L5712.
- TAP (network): VM 의 Ethernet frame 과 Host Linux networking 을 잇는 접점. Evidence: L5671–L5671, L5714–L5714.
- vhost-net (kernel): 반복되는 packet datapath 를 Host kernel 에서 처리하는 backend. Evidence: L5669–L5669, L5716–L5716.
- QEMU virtio backend (process): vhost-net 을 쓰지 않을 때 datapath backend 를 맡는 쪽. Evidence: L5668–L5668, L5742–L5742.
- virtqueue (queue): Guest 와 Host backend 가 I/O buffer 를 주고받는 descriptor 기반 공유 큐. Evidence: L5667–L5667, L5718–L5718.
- Guest (service): packet 이 올라가 애플리케이션 socket 에 닿는 쪽. Evidence: L5664–L5665, L5720–L5726.
Relationships
- Linux Bridge / Routing / NAT → TAP: Ethernet Frame. Evidence: L5671–L5671, L5712–L5714.
- Physical NIC Driver → Linux Bridge / Routing / NAT: L2 forwarding. Evidence: L5672–L5672, L5710–L5712.
- libvirt → QEMU: NIC/network configuration. Evidence: L5663–L5663, L5691–L5693.
- Physical NIC → Physical NIC Driver: Ethernet Frame. Evidence: L5671–L5671, L5708–L5710.
- QEMU virtio backend → virtqueue: Data Path. Evidence: L5729–L5729, L5742–L5744.
- QEMU → virtio-net Device Model: QEMU process. Evidence: L5666–L5666, L5693–L5695.
- virtio-net Device Model → QEMU virtio backend: control. Evidence: L5668–L5668, L5700–L5700.
- virtio-net Device Model → vhost-net: vhost-net backend 설정. Evidence: L5700–L5700, L5716–L5716.
- TAP → QEMU virtio backend: data. Evidence: L5729–L5729, L5740–L5742.
- TAP → vhost-net: vhost-net 사용. Evidence: L5703–L5703, L5714–L5716.
- vhost-net → virtqueue: Data Path. Evidence: L5703–L5703, L5716–L5718.
- virsh → libvirt: Control / Setup. Evidence: L5662–L5663, L5684–L5691.
- virtqueue → Guest: virtio-net Frontend Driver. Evidence: L5664–L5664, L5718–L5726.