refactor: 문서 개선 중
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
"title": "control/setup path 는 QEMU 를 지나고 data path 는 backend 에 따라 QEMU 를 지나기도 안 지나기도 한다",
|
||||
"question": "설정하는 경로와 packet 이 흐르는 경로는 어디에서 갈라지고, 그 두 갈래 가운데 어느 쪽이 QEMU 사용자 공간을 지나는가",
|
||||
"type": "network",
|
||||
"direction": "TB",
|
||||
"direction": "LR",
|
||||
"audience": [
|
||||
"가상 머신 안의 요청이 느릴 때 계층을 가르려는 사람",
|
||||
"vhost-net 이 무엇을 우회하는지 확인하려는 사람"
|
||||
@@ -14,11 +14,11 @@
|
||||
"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 를 쓰고 있는지는 그림이 말하지 않는다.",
|
||||
"source_context": {
|
||||
"document": "docs/virtualization/final/document.md",
|
||||
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
|
||||
"document_sha256": "8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210",
|
||||
"anchor": {
|
||||
"kind": "heading",
|
||||
"value": "125. 최종 기준 구조",
|
||||
"line": 5682
|
||||
"line": 5695
|
||||
}
|
||||
},
|
||||
"composition": {
|
||||
@@ -44,12 +44,12 @@
|
||||
"description": "VM/network 관리 CLI. packet datapath 에는 직접 참여하지 않는다.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5662,
|
||||
"end_line": 5662
|
||||
"start_line": 5675,
|
||||
"end_line": 5675
|
||||
},
|
||||
{
|
||||
"start_line": 5687,
|
||||
"end_line": 5689
|
||||
"start_line": 5700,
|
||||
"end_line": 5702
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -63,12 +63,12 @@
|
||||
"description": "VM lifecycle 과 NIC/network configuration 을 관리한다.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5663,
|
||||
"end_line": 5663
|
||||
"start_line": 5676,
|
||||
"end_line": 5676
|
||||
},
|
||||
{
|
||||
"start_line": 5691,
|
||||
"end_line": 5691
|
||||
"start_line": 5704,
|
||||
"end_line": 5704
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -85,12 +85,12 @@
|
||||
"description": "실제로 실행되는 프로세스. 이 안에 virtio-net device model 이 있다.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5666,
|
||||
"end_line": 5666
|
||||
"start_line": 5679,
|
||||
"end_line": 5679
|
||||
},
|
||||
{
|
||||
"start_line": 5693,
|
||||
"end_line": 5693
|
||||
"start_line": 5706,
|
||||
"end_line": 5706
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -111,12 +111,12 @@
|
||||
"description": "control/setup path 가 닿는 자리. 장치를 만들고 backend 를 연결한다.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5666,
|
||||
"end_line": 5666
|
||||
"start_line": 5679,
|
||||
"end_line": 5679
|
||||
},
|
||||
{
|
||||
"start_line": 5695,
|
||||
"end_line": 5700
|
||||
"start_line": 5708,
|
||||
"end_line": 5713
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -130,8 +130,8 @@
|
||||
"description": "밖에서 온 packet 이 처음 닿는 하드웨어.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5706,
|
||||
"end_line": 5708
|
||||
"start_line": 5719,
|
||||
"end_line": 5721
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -145,12 +145,12 @@
|
||||
"description": "그 하드웨어를 제어하는 Host kernel driver.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5674,
|
||||
"end_line": 5674
|
||||
"start_line": 5687,
|
||||
"end_line": 5687
|
||||
},
|
||||
{
|
||||
"start_line": 5710,
|
||||
"end_line": 5710
|
||||
"start_line": 5723,
|
||||
"end_line": 5723
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -164,12 +164,12 @@
|
||||
"description": "L2 software switch 와 L3 routing, 주소 변환이 놓이는 자리.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5672,
|
||||
"end_line": 5673
|
||||
"start_line": 5685,
|
||||
"end_line": 5686
|
||||
},
|
||||
{
|
||||
"start_line": 5712,
|
||||
"end_line": 5712
|
||||
"start_line": 5725,
|
||||
"end_line": 5725
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -186,12 +186,12 @@
|
||||
"description": "VM 의 Ethernet frame 과 Host Linux networking 을 잇는 접점.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5671,
|
||||
"end_line": 5671
|
||||
"start_line": 5684,
|
||||
"end_line": 5684
|
||||
},
|
||||
{
|
||||
"start_line": 5714,
|
||||
"end_line": 5714
|
||||
"start_line": 5727,
|
||||
"end_line": 5727
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -208,12 +208,12 @@
|
||||
"description": "반복되는 packet datapath 를 Host kernel 에서 처리하는 backend.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5669,
|
||||
"end_line": 5669
|
||||
"start_line": 5682,
|
||||
"end_line": 5682
|
||||
},
|
||||
{
|
||||
"start_line": 5716,
|
||||
"end_line": 5716
|
||||
"start_line": 5729,
|
||||
"end_line": 5729
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -230,12 +230,12 @@
|
||||
"description": "vhost-net 을 쓰지 않을 때 datapath backend 를 맡는 쪽.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5668,
|
||||
"end_line": 5668
|
||||
"start_line": 5681,
|
||||
"end_line": 5681
|
||||
},
|
||||
{
|
||||
"start_line": 5742,
|
||||
"end_line": 5742
|
||||
"start_line": 5755,
|
||||
"end_line": 5755
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -252,12 +252,12 @@
|
||||
"description": "Guest 와 Host backend 가 I/O buffer 를 주고받는 descriptor 기반 공유 큐.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5667,
|
||||
"end_line": 5667
|
||||
"start_line": 5680,
|
||||
"end_line": 5680
|
||||
},
|
||||
{
|
||||
"start_line": 5718,
|
||||
"end_line": 5718
|
||||
"start_line": 5731,
|
||||
"end_line": 5731
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -277,12 +277,12 @@
|
||||
"description": "packet 이 올라가 애플리케이션 socket 에 닿는 쪽.",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5664,
|
||||
"end_line": 5665
|
||||
"start_line": 5677,
|
||||
"end_line": 5678
|
||||
},
|
||||
{
|
||||
"start_line": 5720,
|
||||
"end_line": 5726
|
||||
"start_line": 5733,
|
||||
"end_line": 5739
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -298,12 +298,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5662,
|
||||
"end_line": 5663
|
||||
"start_line": 5675,
|
||||
"end_line": 5676
|
||||
},
|
||||
{
|
||||
"start_line": 5684,
|
||||
"end_line": 5691
|
||||
"start_line": 5697,
|
||||
"end_line": 5704
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -312,17 +312,17 @@
|
||||
"id": "libvirt-to-qemu",
|
||||
"from": "libvirt",
|
||||
"to": "qemu",
|
||||
"label": "NIC/network configuration",
|
||||
"label": "NIC config",
|
||||
"kind": "control",
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5663,
|
||||
"end_line": 5663
|
||||
"start_line": 5676,
|
||||
"end_line": 5676
|
||||
},
|
||||
{
|
||||
"start_line": 5691,
|
||||
"end_line": 5693
|
||||
"start_line": 5704,
|
||||
"end_line": 5706
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -336,12 +336,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5666,
|
||||
"end_line": 5666
|
||||
"start_line": 5679,
|
||||
"end_line": 5679
|
||||
},
|
||||
{
|
||||
"start_line": 5693,
|
||||
"end_line": 5695
|
||||
"start_line": 5706,
|
||||
"end_line": 5708
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -355,12 +355,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5671,
|
||||
"end_line": 5671
|
||||
"start_line": 5684,
|
||||
"end_line": 5684
|
||||
},
|
||||
{
|
||||
"start_line": 5708,
|
||||
"end_line": 5710
|
||||
"start_line": 5721,
|
||||
"end_line": 5723
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -374,12 +374,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5672,
|
||||
"end_line": 5672
|
||||
"start_line": 5685,
|
||||
"end_line": 5685
|
||||
},
|
||||
{
|
||||
"start_line": 5710,
|
||||
"end_line": 5712
|
||||
"start_line": 5723,
|
||||
"end_line": 5725
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -393,12 +393,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5671,
|
||||
"end_line": 5671
|
||||
"start_line": 5684,
|
||||
"end_line": 5684
|
||||
},
|
||||
{
|
||||
"start_line": 5712,
|
||||
"end_line": 5714
|
||||
"start_line": 5725,
|
||||
"end_line": 5727
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -412,12 +412,12 @@
|
||||
"style": "dashed",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5700,
|
||||
"end_line": 5700
|
||||
"start_line": 5713,
|
||||
"end_line": 5713
|
||||
},
|
||||
{
|
||||
"start_line": 5716,
|
||||
"end_line": 5716
|
||||
"start_line": 5729,
|
||||
"end_line": 5729
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -431,12 +431,12 @@
|
||||
"style": "dashed",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5668,
|
||||
"end_line": 5668
|
||||
"start_line": 5681,
|
||||
"end_line": 5681
|
||||
},
|
||||
{
|
||||
"start_line": 5700,
|
||||
"end_line": 5700
|
||||
"start_line": 5713,
|
||||
"end_line": 5713
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -450,12 +450,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5703,
|
||||
"end_line": 5703
|
||||
"start_line": 5716,
|
||||
"end_line": 5716
|
||||
},
|
||||
{
|
||||
"start_line": 5714,
|
||||
"end_line": 5716
|
||||
"start_line": 5727,
|
||||
"end_line": 5729
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -469,12 +469,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5729,
|
||||
"end_line": 5729
|
||||
"start_line": 5742,
|
||||
"end_line": 5742
|
||||
},
|
||||
{
|
||||
"start_line": 5740,
|
||||
"end_line": 5742
|
||||
"start_line": 5753,
|
||||
"end_line": 5755
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -488,12 +488,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5703,
|
||||
"end_line": 5703
|
||||
"start_line": 5716,
|
||||
"end_line": 5716
|
||||
},
|
||||
{
|
||||
"start_line": 5716,
|
||||
"end_line": 5718
|
||||
"start_line": 5729,
|
||||
"end_line": 5731
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -507,12 +507,12 @@
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5729,
|
||||
"end_line": 5729
|
||||
"start_line": 5742,
|
||||
"end_line": 5742
|
||||
},
|
||||
{
|
||||
"start_line": 5742,
|
||||
"end_line": 5744
|
||||
"start_line": 5755,
|
||||
"end_line": 5757
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -521,17 +521,17 @@
|
||||
"id": "virtqueue-to-guest",
|
||||
"from": "virtqueue",
|
||||
"to": "guest",
|
||||
"label": "virtio-net Frontend Driver",
|
||||
"label": "frontend",
|
||||
"kind": "data",
|
||||
"style": "solid",
|
||||
"evidence": [
|
||||
{
|
||||
"start_line": 5664,
|
||||
"end_line": 5664
|
||||
"start_line": 5677,
|
||||
"end_line": 5677
|
||||
},
|
||||
{
|
||||
"start_line": 5718,
|
||||
"end_line": 5726
|
||||
"start_line": 5731,
|
||||
"end_line": 5739
|
||||
}
|
||||
],
|
||||
"assumption": false
|
||||
@@ -539,6 +539,6 @@
|
||||
],
|
||||
"legend": [],
|
||||
"metadata": {
|
||||
"rationale": "network 으로 고른 이유는 이 절이 답하는 물음이 「어느 경로가 어느 계층을 지나는가」이기 때문이다. 점선은 설정이고 실선은 packet 이다 — 색이 아니라 선 모양으로 갈랐다. Internet/Client 와 Socket, Keycloak 은 노드로 세우지 않고 양 끝 노드의 details 로 내렸다. §125 가 적은 세 직선을 그대로 세 장으로 옮기면 SSOT 와 같은 그림이 되고, 이 글이 필요로 하는 것은 그 셋이 어디를 공유하는가다. LR 로 그렸더니 캔버스가 2249px 가 되어 TB 로 바꿨다. 갈래 구간의 엇갈리는 두 이음에 라벨을 다 붙였더니 라벨끼리 겹치고(497px²) 하나가 device model 상자에 먹혀(316px²) check-figure-overlap 이 걸렸다. 그 구간에서는 vhost-net 쪽 두 이음에만 이름을 남기고 QEMU backend 쪽 두 이음은 선 모양(점선=설정·실선=packet)과 도착 상자 이름으로 읽게 두었다."
|
||||
"rationale": "이 절이 세운 것은 control/setup path와 두 data path가 device model·backend·virtqueue에서 갈라지고 다시 만나는 구조다. component-flow와 LR를 사용하면 이 관계를 상자 충돌 없이 보존한다. NIC config는 NIC/network configuration의 축약이고 frontend는 도착 노드의 virtio-net Frontend Driver를 반복하지 않기 위한 edge 축약이다. backend 선택이라는 핵심 의미와 QEMU userspace 우회 여부는 node/edge 구조로 그대로 남는다."
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user