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
@@ -10,23 +10,23 @@
## Elements and evidence
- **Boundary: Guest Userspace** (boundary): 게스트 사용자 공간. 저장장치를 직접 다루지 않는다. Evidence: L5807L5809.
- **Boundary: Guest Kernel** (boundary): 게스트 커널 공간. VM Boundary 위쪽 계층이 전부 여기 있다. Evidence: L5815L5833.
- **PostgreSQL / Keycloak** (service): 파일 연산을 요청하는 게스트 프로세스. Evidence: L5807L5809, L5885L5885, L5811L5813.
- **VFS** (service): 열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. Evidence: L5815L5817, L5905L5905.
- **ext4 / XFS** (service): 파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. Evidence: L5819L5819.
- **Guest Page Cache** (store): 게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. Evidence: L5821L5821.
- **Guest Block Layer** (service): 파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. Evidence: L5825L5825.
- **/dev/vda** (device): 게스트 Linux 가 하나의 block device 로 인식하는 이름. Evidence: L5829L5829, L5879L5879.
- **virtio-blk Frontend** (service): 그 가상 block device 를 제어하는 게스트 커널 driver. Evidence: L5831L5831, L5789L5789.
- **virtqueue** (queue): 요청이 실리는 자리. 바로 아래가 VM Boundary 다. Evidence: L5833L5835.
- **Boundary: Guest Userspace** (boundary): 게스트 사용자 공간. 저장장치를 직접 다루지 않는다. Evidence: L5820L5822.
- **Boundary: Guest Kernel** (boundary): 게스트 커널 공간. VM Boundary 위쪽 계층이 전부 여기 있다. Evidence: L5828L5846.
- **PostgreSQL / Keycloak** (service): 파일 연산을 요청하는 게스트 프로세스. Evidence: L5820L5822, L5898L5898, L5824L5826.
- **VFS** (service): 열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. Evidence: L5828L5830, L5918L5918.
- **ext4 / XFS** (service): 파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. Evidence: L5832L5832.
- **Guest Page Cache** (store): 게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. Evidence: L5834L5834.
- **Guest Block Layer** (service): 파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. Evidence: L5838L5838.
- **/dev/vda** (device): 게스트 Linux 가 하나의 block device 로 인식하는 이름. Evidence: L5842L5842, L5892L5892.
- **virtio-blk Frontend** (service): 그 가상 block device 를 제어하는 게스트 커널 driver. Evidence: L5844L5844, L5802L5802.
- **virtqueue** (queue): 요청이 실리는 자리. 바로 아래가 VM Boundary 다. Evidence: L5846L5848.
## Relationships
- **PostgreSQL / Keycloak → VFS:** data. Evidence: L5811L5813, L5890L5890.
- **VFS → ext4 / XFS:** data. Evidence: L5817L5819.
- **ext4 / XFS → Guest Page Cache:** data. Evidence: L5819L5821.
- **Guest Page Cache → Guest Block Layer:** writeback. Evidence: L5823L5825.
- **Guest Block Layer → /dev/vda:** WRITE / FLUSH. Evidence: L5827L5829.
- **/dev/vda → virtio-blk Frontend:** data. Evidence: L5829L5831.
- **virtio-blk Frontend → virtqueue:** Virtio block request. Evidence: L5831L5833.
- **PostgreSQL / Keycloak → VFS:** data. Evidence: L5824L5826, L5903L5903.
- **VFS → ext4 / XFS:** data. Evidence: L5830L5832.
- **ext4 / XFS → Guest Page Cache:** data. Evidence: L5832L5834.
- **Guest Page Cache → Guest Block Layer:** writeback. Evidence: L5836L5838.
- **Guest Block Layer → /dev/vda:** WRITE / FLUSH. Evidence: L5840L5842.
- **/dev/vda → virtio-blk Frontend:** data. Evidence: L5842L5844.
- **virtio-blk Frontend → virtqueue:** Virtio block request. Evidence: L5844L5846.
@@ -0,0 +1,30 @@
digraph techviz {
graph [rankdir=TB, splines=ortho, nodesep=0.55, ranksep=0.85];
node [fontname=Helvetica, fontsize=11, margin="0.18,0.12", style="rounded,filled", fillcolor=white, color="#2d4357", penwidth=1.5];
edge [fontname=Helvetica, fontsize=10, color="#364b5f", penwidth=1.4, arrowsize=0.75];
subgraph cluster_0 {
label="Guest Userspace";
style="rounded,dashed";
color="#66788a";
n0 [label="PostgreSQL / Keycloak", shape=box, style="rounded,filled"];
}
subgraph cluster_1 {
label="Guest Kernel";
style="rounded,dashed";
color="#66788a";
n1 [label="VFS", shape=box, style="rounded,filled"];
n2 [label="ext4 / XFS", shape=box, style="rounded,filled"];
n3 [label="Guest Page Cache", shape=box, style="rounded,filled"];
n4 [label="Guest Block Layer", shape=box, style="rounded,filled"];
n5 [label="/dev/vda", shape=box, style="rounded,filled"];
n6 [label="virtio-blk Frontend", shape=box, style="rounded,filled"];
n7 [label="virtqueue", shape=oval, style="rounded,filled"];
}
n0 -> n1 [label="", style=solid];
n1 -> n2 [label="", style=solid];
n2 -> n3 [label="", style=solid];
n3 -> n4 [label="writeback", style=solid];
n4 -> n5 [label="WRITE / FLUSH", style=solid];
n5 -> n6 [label="", style=solid];
n6 -> n7 [label="Virtio block request", style=solid];
}
@@ -1,73 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" modified="2026-07-23T00:00:00.000Z" agent="techviz-harness" version="24.7.17" type="device">
<diagram id="guest-block-io-to-virtqueue" name="게스트의 write() 가 virtqueue 에 실리기까지">
<mxGraphModel dx="680" dy="1360" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1360" math="0" shadow="0">
<mxGraphModel dx="680" dy="2501" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="2501" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="g_guest-userspace" value="Guest Userspace" style="swimlane;html=1;rounded=1;startSize=30;horizontal=1;dashed=1;strokeWidth=1.5;fillColor=#f7f9fb;strokeColor=#66788a;fontStyle=1;fontSize=13;" vertex="1" parent="1">
<mxGeometry x="40.0" y="35.0" width="241.0" height="160.0" as="geometry"/>
<mxGeometry x="35.0" y="99.0" width="241.0" height="160.0" as="geometry"/>
</mxCell>
<mxCell id="g_guest-kernel" value="Guest Kernel" style="swimlane;html=1;rounded=1;startSize=30;horizontal=1;dashed=1;strokeWidth=1.5;fillColor=#f7f9fb;strokeColor=#66788a;fontStyle=1;fontSize=13;" vertex="1" parent="1">
<mxGeometry x="47.0" y="219.0" width="227.0" height="1096.0" as="geometry"/>
<mxGeometry x="47.0" y="440.0" width="227.0" height="2016.0" as="geometry"/>
</mxCell>
<mxCell id="n_app" value="PostgreSQL / Keycloak&lt;br/&gt;read / write&lt;br/&gt;fsync / sync" tooltip="파일 연산을 요청하는 게스트 프로세스. | Evidence: L5807-L5809, L5885-L5885, L5811-L5813" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="70.0" y="81.0" width="181.0" height="88.0" as="geometry"/>
<mxCell id="n_app" value="PostgreSQL / Keycloak&lt;br/&gt;read / write&lt;br/&gt;fsync / sync" tooltip="파일 연산을 요청하는 게스트 프로세스. | Evidence: L5820-L5822, L5898-L5898, L5824-L5826" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="65.0" y="145.0" width="181.0" height="88.0" as="geometry"/>
</mxCell>
<mxCell id="n_vfs" value="VFS" tooltip="열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. | Evidence: L5815-L5817, L5905-L5905" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="85.5" y="265.0" width="150.0" height="64.0" as="geometry"/>
<mxCell id="n_vfs" value="VFS" tooltip="열린 파일이 어느 filesystem 구현에 속하는지 보고 연산을 넘기는 공통 계층. | Evidence: L5828-L5830, L5918-L5918" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="486.0" width="150.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_fs" value="ext4 / XFS" tooltip="파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. | Evidence: L5819-L5819" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="85.5" y="425.0" width="150.0" height="64.0" as="geometry"/>
<mxCell id="n_fs" value="ext4 / XFS" tooltip="파일과 디렉터리를 block 공간에 배치하는 게스트 filesystem. | Evidence: L5832-L5832" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="796.0" width="150.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_page-cache" value="Guest Page Cache" tooltip="게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. | Evidence: L5821-L5821" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="85.5" y="585.0" width="150.0" height="64.0" as="geometry"/>
<mxCell id="n_page-cache" value="Guest Page Cache" tooltip="게스트 RAM 에 있는 cache. write() 가 성공해도 데이터는 아직 여기까지만 확정된다. | Evidence: L5834-L5834" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="1106.0" width="150.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_block-layer" value="Guest Block Layer" tooltip="파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. | Evidence: L5825-L5825" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="84.0" y="745.0" width="153.0" height="64.0" as="geometry"/>
<mxCell id="n_block-layer" value="Guest Block Layer" tooltip="파일 세계의 요청을 block device 세계의 요청으로 바꾸는 계층. | Evidence: L5838-L5838" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="1416.0" width="153.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_vda" value="/dev/vda" tooltip="게스트 Linux 가 하나의 block device 로 인식하는 이름. | Evidence: L5829-L5829, L5879-L5879" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="85.5" y="905.0" width="150.0" height="64.0" as="geometry"/>
<mxCell id="n_vda" value="/dev/vda" tooltip="게스트 Linux 가 하나의 block device 로 인식하는 이름. | Evidence: L5842-L5842, L5892-L5892" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="1729.0" width="150.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_virtio-blk" value="virtio-blk Frontend" tooltip="그 가상 block device 를 제어하는 게스트 커널 driver. | Evidence: L5831-L5831, L5789-L5789" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="1065.0" width="167.0" height="64.0" as="geometry"/>
<mxCell id="n_virtio-blk" value="virtio-blk Frontend" tooltip="그 가상 block device 를 제어하는 게스트 커널 driver. | Evidence: L5844-L5844, L5802-L5802" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="77.0" y="2039.0" width="167.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="n_virtqueue" value="virtqueue" tooltip="요청이 실리는 자리. 바로 아래가 VM Boundary 다. | Evidence: L5833-L5835" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="85.5" y="1225.0" width="150.0" height="64.0" as="geometry"/>
<mxCell id="n_virtqueue" value="virtqueue" tooltip="요청이 실리는 자리. 바로 아래가 VM Boundary 다. | Evidence: L5846-L5848" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="77.0" y="2366.0" width="150.0" height="64.0" as="geometry"/>
</mxCell>
<mxCell id="e_app-to-vfs" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_app" target="n_vfs">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="217.0" as="offset"/>
<mxPoint x="153.8" y="331.5" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_vfs-to-fs" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vfs" target="n_fs">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="377.0" as="offset"/>
<mxPoint x="176.0" y="673.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_fs-to-page-cache" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_fs" target="n_page-cache">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="537.0" as="offset"/>
<mxPoint x="176.0" y="983.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_page-cache-to-block-layer" value="writeback" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_page-cache" target="n_block-layer">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="697.0" as="offset"/>
<mxPoint x="152.8" y="1265.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_block-layer-to-vda" value="WRITE / FLUSH" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_block-layer" target="n_vda">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="857.0" as="offset"/>
<mxPoint x="152.8" y="1576.5" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_vda-to-virtio-blk" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_vda" target="n_virtio-blk">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="1017.0" as="offset"/>
<mxPoint x="156.2" y="1888.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_virtio-blk-to-virtqueue" value="Virtio block request" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_virtio-blk" target="n_virtqueue">
<mxGeometry relative="1" as="geometry">
<mxPoint x="184.5" y="1177.0" as="offset"/>
<mxPoint x="156.2" y="2206.5" as="offset"/>
</mxGeometry>
</mxCell>
</root>
@@ -6,8 +6,8 @@
{
"id": "group-guest-userspace",
"type": "rectangle",
"x": 40.0,
"y": 35.0,
"x": 35.0,
"y": 99.0,
"width": 241.0,
"height": 160.0,
"angle": 0,
@@ -36,8 +36,8 @@
{
"id": "group-label-guest-userspace",
"type": "text",
"x": 56.0,
"y": 41.0,
"x": 51.0,
"y": 105.0,
"width": 135,
"height": 24,
"angle": 0,
@@ -76,9 +76,9 @@
"id": "group-guest-kernel",
"type": "rectangle",
"x": 47.0,
"y": 219.0,
"y": 440.0,
"width": 227.0,
"height": 1096.0,
"height": 2016.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#f8f9fa",
@@ -106,7 +106,7 @@
"id": "group-label-guest-kernel",
"type": "text",
"x": 63.0,
"y": 225.0,
"y": 446.0,
"width": 108,
"height": 24,
"angle": 0,
@@ -144,10 +144,10 @@
{
"id": "edge-app-to-vfs",
"type": "arrow",
"x": 160.5,
"y": 169.0,
"width": 0.0,
"height": 96.0,
"x": 152.0,
"y": 233.0,
"width": 3.5,
"height": 253.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -170,20 +170,20 @@
"locked": false,
"points": [
[
0.0,
3.5,
0.0
],
[
0.0,
48.0
3.5,
126.5
],
[
0.0,
48.0
126.5
],
[
0.0,
96.0
253.0
]
],
"lastCommittedPoint": null,
@@ -204,10 +204,10 @@
{
"id": "edge-vfs-to-fs",
"type": "arrow",
"x": 160.5,
"y": 329.0,
"x": 152.0,
"y": 550.0,
"width": 0.0,
"height": 96.0,
"height": 246.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -235,15 +235,15 @@
],
[
0.0,
48.0
123.0
],
[
0.0,
48.0
123.0
],
[
0.0,
96.0
246.0
]
],
"lastCommittedPoint": null,
@@ -264,10 +264,10 @@
{
"id": "edge-fs-to-page-cache",
"type": "arrow",
"x": 160.5,
"y": 489.0,
"x": 152.0,
"y": 860.0,
"width": 0.0,
"height": 96.0,
"height": 246.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -295,15 +295,15 @@
],
[
0.0,
48.0
123.0
],
[
0.0,
48.0
123.0
],
[
0.0,
96.0
246.0
]
],
"lastCommittedPoint": null,
@@ -324,10 +324,10 @@
{
"id": "edge-page-cache-to-block-layer",
"type": "arrow",
"x": 160.5,
"y": 649.0,
"width": 0.0,
"height": 96.0,
"x": 152.0,
"y": 1170.0,
"width": 1.5,
"height": 246.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -355,15 +355,15 @@
],
[
0.0,
48.0
123.0
],
[
0.0,
48.0
1.5,
123.0
],
[
0.0,
96.0
1.5,
246.0
]
],
"lastCommittedPoint": null,
@@ -384,8 +384,8 @@
{
"id": "edge-label-page-cache-to-block-layer",
"type": "text",
"x": 139.5,
"y": 685.0,
"x": 107.75,
"y": 1253.0,
"width": 90,
"height": 24,
"angle": 0,
@@ -423,10 +423,10 @@
{
"id": "edge-block-layer-to-vda",
"type": "arrow",
"x": 160.5,
"y": 809.0,
"width": 0.0,
"height": 96.0,
"x": 152.0,
"y": 1480.0,
"width": 1.5,
"height": 249.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -449,20 +449,20 @@
"locked": false,
"points": [
[
0.0,
1.5,
0.0
],
[
0.0,
48.0
1.5,
124.5
],
[
0.0,
48.0
124.5
],
[
0.0,
96.0
249.0
]
],
"lastCommittedPoint": null,
@@ -483,8 +483,8 @@
{
"id": "edge-label-block-layer-to-vda",
"type": "text",
"x": 132.5,
"y": 845.0,
"x": 100.75,
"y": 1564.5,
"width": 104,
"height": 24,
"angle": 0,
@@ -522,10 +522,10 @@
{
"id": "edge-vda-to-virtio-blk",
"type": "arrow",
"x": 160.5,
"y": 969.0,
"width": 0.0,
"height": 96.0,
"x": 152.0,
"y": 1793.0,
"width": 8.5,
"height": 246.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -553,15 +553,15 @@
],
[
0.0,
48.0
123.0
],
[
0.0,
48.0
8.5,
123.0
],
[
0.0,
96.0
8.5,
246.0
]
],
"lastCommittedPoint": null,
@@ -582,10 +582,10 @@
{
"id": "edge-virtio-blk-to-virtqueue",
"type": "arrow",
"x": 160.5,
"y": 1129.0,
"width": 0.0,
"height": 96.0,
"x": 152.0,
"y": 2103.0,
"width": 8.5,
"height": 263.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
@@ -608,20 +608,20 @@
"locked": false,
"points": [
[
0.0,
8.5,
0.0
],
[
0.0,
48.0
8.5,
131.5
],
[
0.0,
48.0
131.5
],
[
0.0,
96.0
263.0
]
],
"lastCommittedPoint": null,
@@ -642,8 +642,8 @@
{
"id": "edge-label-virtio-blk-to-virtqueue",
"type": "text",
"x": 104.5,
"y": 1165.0,
"x": 76.25,
"y": 2194.5,
"width": 160,
"height": 24,
"angle": 0,
@@ -681,8 +681,8 @@
{
"id": "node-app",
"type": "rectangle",
"x": 70.0,
"y": 81.0,
"x": 65.0,
"y": 145.0,
"width": 181.0,
"height": 88.0,
"angle": 0,
@@ -711,8 +711,8 @@
{
"id": "node-label-app",
"type": "text",
"x": 80.0,
"y": 91.0,
"x": 75.0,
"y": 155.0,
"width": 161.0,
"height": 68.0,
"angle": 0,
@@ -750,8 +750,8 @@
{
"id": "node-vfs",
"type": "rectangle",
"x": 85.5,
"y": 265.0,
"x": 77.0,
"y": 486.0,
"width": 150.0,
"height": 64.0,
"angle": 0,
@@ -780,8 +780,8 @@
{
"id": "node-label-vfs",
"type": "text",
"x": 95.5,
"y": 275.0,
"x": 87.0,
"y": 496.0,
"width": 130.0,
"height": 44.0,
"angle": 0,
@@ -819,8 +819,8 @@
{
"id": "node-fs",
"type": "rectangle",
"x": 85.5,
"y": 425.0,
"x": 77.0,
"y": 796.0,
"width": 150.0,
"height": 64.0,
"angle": 0,
@@ -849,8 +849,8 @@
{
"id": "node-label-fs",
"type": "text",
"x": 95.5,
"y": 435.0,
"x": 87.0,
"y": 806.0,
"width": 130.0,
"height": 44.0,
"angle": 0,
@@ -888,8 +888,8 @@
{
"id": "node-page-cache",
"type": "rectangle",
"x": 85.5,
"y": 585.0,
"x": 77.0,
"y": 1106.0,
"width": 150.0,
"height": 64.0,
"angle": 0,
@@ -918,8 +918,8 @@
{
"id": "node-label-page-cache",
"type": "text",
"x": 95.5,
"y": 595.0,
"x": 87.0,
"y": 1116.0,
"width": 130.0,
"height": 44.0,
"angle": 0,
@@ -957,8 +957,8 @@
{
"id": "node-block-layer",
"type": "rectangle",
"x": 84.0,
"y": 745.0,
"x": 77.0,
"y": 1416.0,
"width": 153.0,
"height": 64.0,
"angle": 0,
@@ -987,8 +987,8 @@
{
"id": "node-label-block-layer",
"type": "text",
"x": 94.0,
"y": 755.0,
"x": 87.0,
"y": 1426.0,
"width": 133.0,
"height": 44.0,
"angle": 0,
@@ -1026,8 +1026,8 @@
{
"id": "node-vda",
"type": "rectangle",
"x": 85.5,
"y": 905.0,
"x": 77.0,
"y": 1729.0,
"width": 150.0,
"height": 64.0,
"angle": 0,
@@ -1056,8 +1056,8 @@
{
"id": "node-label-vda",
"type": "text",
"x": 95.5,
"y": 915.0,
"x": 87.0,
"y": 1739.0,
"width": 130.0,
"height": 44.0,
"angle": 0,
@@ -1096,7 +1096,7 @@
"id": "node-virtio-blk",
"type": "rectangle",
"x": 77.0,
"y": 1065.0,
"y": 2039.0,
"width": 167.0,
"height": 64.0,
"angle": 0,
@@ -1126,7 +1126,7 @@
"id": "node-label-virtio-blk",
"type": "text",
"x": 87.0,
"y": 1075.0,
"y": 2049.0,
"width": 147.0,
"height": 44.0,
"angle": 0,
@@ -1164,8 +1164,8 @@
{
"id": "node-virtqueue",
"type": "rectangle",
"x": 85.5,
"y": 1225.0,
"x": 77.0,
"y": 2366.0,
"width": 150.0,
"height": 64.0,
"angle": 0,
@@ -1194,8 +1194,8 @@
{
"id": "node-label-virtqueue",
"type": "text",
"x": 95.5,
"y": 1235.0,
"x": 87.0,
"y": 2376.0,
"width": 130.0,
"height": 44.0,
"angle": 0,
@@ -2,30 +2,41 @@
"harness_version": "0.2.0",
"spec_id": "guest-block-io-to-virtqueue",
"spec_version": "1.1",
"spec_sha256": "f41eedadcb8a6841cf981bea9e0a9e50a3df836df3cad528b4245a8d42e83915",
"spec_sha256": "3c2c2a9e053d25d2277226299d48db325ea1d1af836f6bacf4c23ea3672c38f4",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
"document_sha256": "8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210",
"anchor": {
"kind": "heading",
"value": "128. 전체 구조",
"line": 5804
"line": 5817
}
},
"outputs": [
"guest-block-io-to-virtqueue.svg",
"guest-block-io-to-virtqueue.drawio",
"guest-block-io-to-virtqueue.mmd",
"guest-block-io-to-virtqueue.d2",
"guest-block-io-to-virtqueue.dot",
"guest-block-io-to-virtqueue.drawio",
"guest-block-io-to-virtqueue.excalidraw",
"guest-block-io-to-virtqueue.alt.md"
],
"lint_issue_count": 5,
"lint_issue_count": 6,
"assumption_count": 0,
"assumptions_allowed": false,
"composition_profile": "component-flow",
"reference_ids": [
"payment-event-flow"
],
"diagram_only": true
"diagram_only": true,
"source_spec_file_sha256": "bdb3a2b7f3434ecf75e7dceca28611002766e42aabd96a9c8f521c29049466d9",
"output_sha256": {
"guest-block-io-to-virtqueue.svg": "5b7be8f61cc3a04b3b490184f7fe4b1cb2b6f62e48fb6d1dd116b4a8253fdc4a",
"guest-block-io-to-virtqueue.mmd": "cf6e5a7a029e614d0e0f1f295663f9f733e9fbeeee002b16c545129257f7565d",
"guest-block-io-to-virtqueue.d2": "92c96a0b016a4b2b8f3d03ca528574f3c75156588ff66610c47bd7b938181740",
"guest-block-io-to-virtqueue.dot": "3f3605120200df313b5476cb4a3b2121aa5b8b3c05052e9e822403b5275f7077",
"guest-block-io-to-virtqueue.drawio": "c649f476bed58b768777cbac3d773a5a3ba3d7cfa95a9bb3e598defb670c94b9",
"guest-block-io-to-virtqueue.excalidraw": "84f0416128f3a3ac1ceca2a0a2e3cb5b0ebbb74bf522c47ae2c0b558c2fe24c8",
"guest-block-io-to-virtqueue.alt.md": "0d45d2ce74a7e2245e046f950fa0bbdd4e037bdb095444e95f14e762d8f4bc53"
}
}
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="680" height="1360" viewBox="0 0 680 1360" role="img" aria-labelledby="diagram-title diagram-description">
<svg xmlns="http://www.w3.org/2000/svg" width="680" height="2501" viewBox="0 0 680 2501" role="img" aria-labelledby="diagram-title diagram-description">
<title id="diagram-title">게스트의 write() 가 virtqueue 에 실리기까지</title>
<desc id="diagram-description">위에서 아래로 읽는다. 맨 위 Guest Userspace 구역에 PostgreSQL / Keycloak 이 있고 write() 가 게스트 커널로 내려간다. Guest Kernel 구역 안에서 VFS 가 먼저 받고, ext4 / XFS 가 파일을 block 공간에 배치하고, Guest Page Cache 가 그 내용을 dirty page 로 받아 두었다가 writeback 으로 Guest Block Layer 에 내려보낸다. Guest Block Layer 는 그것을 WRITE 나 FLUSH 요청으로 바꿔 /dev/vda 에 걸고, virtio-blk Frontend 가 그 요청을 virtqueue 에 게시한다. virtqueue 아래의 VM Boundary 부터는 QEMU 와 호스트 계층이라 이 그림에서 잘랐다. 완료가 같은 virtqueue 로 되돌아오는 역방향은 SSOT 의 다른 절이 대는 사실이라 이 그림에 넣지 않았고 본문 문단이 맡는다.</desc>
<metadata>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;guest-block-io-to-virtqueue&quot;,&quot;profile&quot;:&quot;component-flow&quot;},&quot;source_context&quot;:{&quot;document&quot;:&quot;docs/virtualization/final/document.md&quot;,&quot;document_sha256&quot;:&quot;181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd&quot;,&quot;anchor&quot;:{&quot;kind&quot;:&quot;heading&quot;,&quot;value&quot;:&quot;128. 전체 구조&quot;,&quot;line&quot;:5804}},&quot;evidence_policy&quot;:&quot;Each factual element cites source lines or is marked assumption.&quot;,&quot;diagram_only&quot;:true}</metadata>
<metadata>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;guest-block-io-to-virtqueue&quot;,&quot;profile&quot;:&quot;component-flow&quot;},&quot;source_context&quot;:{&quot;document&quot;:&quot;docs/virtualization/final/document.md&quot;,&quot;document_sha256&quot;:&quot;8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210&quot;,&quot;anchor&quot;:{&quot;kind&quot;:&quot;heading&quot;,&quot;value&quot;:&quot;128. 전체 구조&quot;,&quot;line&quot;:5817}},&quot;evidence_policy&quot;:&quot;Each factual element cites source lines or is marked assumption.&quot;,&quot;diagram_only&quot;:true}</metadata>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" />
@@ -49,59 +49,59 @@
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
</style>
</defs>
<rect class="canvas" width="680" height="1360" />
<rect class="group-box" x="40.0" y="35.0" width="241.0" height="160.0" rx="8" />
<rect class="group-label-bg" x="54.0" y="25.0" width="127.0" height="22" />
<text class="group-label" x="64.0" y="40.0">Guest Userspace</text>
<rect class="group-box" x="47.0" y="219.0" width="227.0" height="1096.0" rx="8" />
<rect class="group-label-bg" x="61.0" y="209.0" width="106.0" height="22" />
<text class="group-label" x="71.0" y="224.0">Guest Kernel</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,169.0 160.5,217.0 160.5,217.0 160.5,265.0" data-evidence="5811-5813,5890-5890" />
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,329.0 160.5,377.0 160.5,377.0 160.5,425.0" data-evidence="5817-5819" />
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,489.0 160.5,537.0 160.5,537.0 160.5,585.0" data-evidence="5819-5821" />
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,649.0 160.5,697.0 160.5,697.0 160.5,745.0" data-evidence="5823-5825" />
<rect class="edge-label-bg" x="145.3" y="683.0" width="78.3" height="22" rx="3" />
<text class="edge-label" x="184.5" y="698.0">writeback</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,809.0 160.5,857.0 160.5,857.0 160.5,905.0" data-evidence="5827-5829" />
<rect class="edge-label-bg" x="131.9" y="843.0" width="105.1" height="22" rx="3" />
<text class="edge-label" x="184.5" y="858.0">WRITE / FLUSH</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,969.0 160.5,1017.0 160.5,1017.0 160.5,1065.0" data-evidence="5829-5831" />
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,1129.0 160.5,1177.0 160.5,1177.0 160.5,1225.0" data-evidence="5831-5833" />
<rect class="edge-label-bg" x="108.5" y="1163.0" width="152.0" height="22" rx="3" />
<text class="edge-label" x="184.5" y="1178.0">Virtio block request</text>
<rect class="canvas" width="680" height="2501" />
<rect class="group-box" x="35.0" y="99.0" width="241.0" height="160.0" rx="8" />
<rect class="group-label-bg" x="49.0" y="89.0" width="127.0" height="22" />
<text class="group-label" x="59.0" y="104.0">Guest Userspace</text>
<rect class="group-box" x="47.0" y="440.0" width="227.0" height="2016.0" rx="8" />
<rect class="group-label-bg" x="61.0" y="430.0" width="106.0" height="22" />
<text class="group-label" x="71.0" y="445.0">Guest Kernel</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="155.5,233.0 155.5,359.5 152.0,359.5 152.0,486.0" data-evidence="5824-5826,5903-5903" />
<polyline class="edge kind-data style-solid emphasis-normal" points="152.0,550.0 152.0,673.0 152.0,673.0 152.0,796.0" data-evidence="5830-5832" />
<polyline class="edge kind-data style-solid emphasis-normal" points="152.0,860.0 152.0,983.0 152.0,983.0 152.0,1106.0" data-evidence="5832-5834" />
<polyline class="edge kind-data style-solid emphasis-normal" points="152.0,1170.0 152.0,1293.0 153.5,1293.0 153.5,1416.0" data-evidence="5836-5838" />
<rect class="edge-label-bg" x="113.6" y="1251.0" width="78.3" height="22" rx="3" />
<text class="edge-label" x="152.8" y="1266.0">writeback</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="153.5,1480.0 153.5,1604.5 152.0,1604.5 152.0,1729.0" data-evidence="5840-5842" />
<rect class="edge-label-bg" x="100.2" y="1562.5" width="105.1" height="22" rx="3" />
<text class="edge-label" x="152.8" y="1577.5">WRITE / FLUSH</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="152.0,1793.0 152.0,1916.0 160.5,1916.0 160.5,2039.0" data-evidence="5842-5844" />
<polyline class="edge kind-data style-solid emphasis-normal" points="160.5,2103.0 160.5,2234.5 152.0,2234.5 152.0,2366.0" data-evidence="5844-5846" />
<rect class="edge-label-bg" x="80.2" y="2192.5" width="152.0" height="22" rx="3" />
<text class="edge-label" x="156.2" y="2207.5">Virtio block request</text>
<g id="node-app">
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="5807-5809,5885-5885,5811-5813" x="70.0" y="81.0" width="181.0" height="88.0" rx="7" />
<text class="node-label" x="160.5" y="108.0">PostgreSQL / Keycloak</text>
<line class="node-detail-divider" x1="84.0" y1="129.0" x2="237.0" y2="129.0" />
<text class="node-detail" x="86.0" y="146.0">read / write</text>
<text class="node-detail" x="86.0" y="162.0">fsync / sync</text>
<rect class="node-shape kind-service emphasis-normal role-source" data-evidence="5820-5822,5898-5898,5824-5826" x="65.0" y="145.0" width="181.0" height="88.0" rx="7" />
<text class="node-label" x="155.5" y="172.0">PostgreSQL / Keycloak</text>
<line class="node-detail-divider" x1="79.0" y1="193.0" x2="232.0" y2="193.0" />
<text class="node-detail" x="81.0" y="210.0">read / write</text>
<text class="node-detail" x="81.0" y="226.0">fsync / sync</text>
</g>
<g id="node-vfs">
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5815-5817,5905-5905" x="85.5" y="265.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="295.0">VFS</text>
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5828-5830,5918-5918" x="77.0" y="486.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="152.0" y="516.0">VFS</text>
</g>
<g id="node-fs">
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5819-5819" x="85.5" y="425.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="455.0">ext4 / XFS</text>
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5832-5832" x="77.0" y="796.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="152.0" y="826.0">ext4 / XFS</text>
</g>
<g id="node-page-cache">
<rect class="node-shape kind-store emphasis-normal role-store" data-evidence="5821-5821" x="85.5" y="585.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="615.0">Guest Page Cache</text>
<rect class="node-shape kind-store emphasis-normal role-store" data-evidence="5834-5834" x="77.0" y="1106.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="152.0" y="1136.0">Guest Page Cache</text>
</g>
<g id="node-block-layer">
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5825-5825" x="84.0" y="745.0" width="153.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="775.0">Guest Block Layer</text>
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5838-5838" x="77.0" y="1416.0" width="153.0" height="64.0" rx="7" />
<text class="node-label" x="153.5" y="1446.0">Guest Block Layer</text>
</g>
<g id="node-vda">
<rect class="node-shape kind-device emphasis-normal role-service" data-evidence="5829-5829,5879-5879" x="85.5" y="905.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="935.0">/dev/vda</text>
<rect class="node-shape kind-device emphasis-normal role-service" data-evidence="5842-5842,5892-5892" x="77.0" y="1729.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="152.0" y="1759.0">/dev/vda</text>
</g>
<g id="node-virtio-blk">
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5831-5831,5789-5789" x="77.0" y="1065.0" width="167.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="1095.0">virtio-blk Frontend</text>
<rect class="node-shape kind-service emphasis-normal role-service" data-evidence="5844-5844,5802-5802" x="77.0" y="2039.0" width="167.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="2069.0">virtio-blk Frontend</text>
</g>
<g id="node-virtqueue">
<rect class="node-shape kind-queue emphasis-primary role-queue" data-evidence="5833-5835" x="85.5" y="1225.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="160.5" y="1255.0">virtqueue</text>
<rect class="node-shape kind-queue emphasis-primary role-queue" data-evidence="5846-5848" x="77.0" y="2366.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="152.0" y="2396.0">virtqueue</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB