refactor: 문서 개선 중

This commit is contained in:
donghyeon-ka
2026-09-21 14:30:55 +09:00
parent c93cdea150
commit 805a18f486
1497 changed files with 525837 additions and 59152 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -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 구조로 그대로 남는다."
}
}