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
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1257" height="448" viewBox="0 0 1257 448" role="img" aria-labelledby="diagram-title diagram-description">
<title id="diagram-title">qcow2 L1·L2 매핑과 backing fallback</title>
<desc id="diagram-description">게스트가 읽으려는 위치는 L1 표와 L2 표를 통해 파일 안 데이터 클러스터 오프셋으로 변환된다. 매핑된 값이 있으면 현재 qcow2의 데이터 클러스터를 읽는다. 값이 0이고 backing file이 있으면 base.qcow2의 같은 가상 위치를 읽고, backing file이 없으면 0으로 채운 64KB를 반환한다. backing file 경로는 qcow2 헤더의 문자열이므로 오버레이만 옮기면 부팅할 수 없다는 제한도 그림 끝에 반영한다.</desc>
<metadata>{&quot;techviz&quot;:{&quot;spec_version&quot;:&quot;1.1&quot;,&quot;id&quot;:&quot;qcow2-mapping-clusters&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;231. qcow2 파일 내부는 어떻게 생겼나 — 매핑표가 전부다&quot;,&quot;line&quot;:14221}},&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" />
</marker>
<style>
:root { color-scheme: light; }
text { font-family: Inter, Pretendard, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; fill: #111827; }
.canvas { fill: #ffffff; }
.group-box { fill: #ffffff; stroke: #9ca3af; stroke-width: 1.4; stroke-dasharray: 7 5; }
.group-label-bg { fill: #ffffff; }
.group-label { font-size: 13px; font-weight: 650; fill: #374151; }
.edge { fill: none; stroke: #374151; stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; marker-end: url(#arrow); }
.edge.style-dashed, .edge.semantic-dashed, .edge.assumption { stroke-dasharray: 7 5; }
.edge.style-dotted { stroke-dasharray: 2 5; }
.edge.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.edge.emphasis-muted { stroke: #9ca3af; }
.edge.emphasis-warning, .edge.kind-failure, .edge.kind-error { stroke: #dc2626; stroke-width: 2.2; }
.edge-label-bg { fill: #ffffff; }
.edge-label { font-size: 12px; font-weight: 560; text-anchor: middle; }
.node-shape { fill: #ffffff; stroke: #4b5563; stroke-width: 1.7; }
.node-shape.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.node-shape.emphasis-muted { stroke: #9ca3af; fill: #f9fafb; }
.node-shape.emphasis-warning { stroke: #d97706; stroke-width: 2; fill: #fffdf5; }
.node-shape.kind-database, .node-shape.kind-datastore, .node-shape.kind-storage { fill: #f8fafc; }
.node-shape.kind-queue, .node-shape.kind-event, .node-shape.kind-topic { fill: #fafafa; }
.node-shape.assumption { stroke-dasharray: 4 4; }
.storage-bottom, .controller-divider { fill: none; stroke: #4b5563; stroke-width: 1.4; }
.controller-led { fill: #4b5563; }
.actor-symbol { fill: none; stroke: #4b5563; stroke-width: 1.8; stroke-linecap: round; }
.actor-symbol.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
.node-label { font-size: 14px; font-weight: 650; text-anchor: middle; }
.node-role { font-size: 10px; letter-spacing: 0.04em; text-anchor: middle; fill: #6b7280; }
.node-detail-divider { stroke: #d1d5db; stroke-width: 1; }
.node-detail { font-size: 11px; fill: #374151; }
.assumption-badge { font-size: 9px; font-weight: 700; fill: #92400e; }
.failure-mark { stroke: #dc2626; stroke-width: 4; stroke-linecap: round; }
.lifeline { stroke: #9ca3af; stroke-width: 1.2; stroke-dasharray: 5 5; }
.timeline-axis { stroke: #374151; stroke-width: 1.8; marker-end: url(#arrow); }
.timeline-stem { stroke: #6b7280; stroke-width: 1.3; }
.timeline-marker { fill: #ffffff; stroke: #374151; stroke-width: 1.7; }
.timeline-marker.primary { fill: #2563eb; stroke: #2563eb; }
.timeline-marker.warning { fill: #dc2626; stroke: #dc2626; }
.timeline-label { font-size: 13px; font-weight: 650; text-anchor: middle; }
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
</style>
</defs>
<rect class="canvas" width="1257" height="448" />
<polyline class="edge kind-data style-solid emphasis-normal" points="561.0,231.5 641.0,231.5 641.0,231.5 721.0,231.5" data-evidence="14320-14337" />
<rect class="edge-label-bg" x="598.5" y="189.5" width="85.0" height="22" rx="3" />
<text class="edge-label" x="641.0" y="204.5">L2 cluster</text>
<polyline class="edge kind-data style-dashed emphasis-normal" points="871.0,213.5 958.8,213.5 958.8,95.5 1046.5,95.5" data-evidence="14343-14350" />
<rect class="edge-label-bg" x="936.9" y="140.5" width="91.7" height="22" rx="3" />
<text class="edge-label" x="982.8" y="155.5">0 + backing</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="871.0,231.5 951.0,231.5 951.0,235.0 1031.0,235.0" data-evidence="14343-14345" />
<rect class="edge-label-bg" x="945.9" y="219.2" width="58.2" height="22" rx="3" />
<text class="edge-label" x="975.0" y="234.2">mapped</text>
<polyline class="edge kind-result style-dashed emphasis-normal" points="871.0,249.5 958.8,249.5 958.8,371.0 1046.5,371.0" data-evidence="14343-14347" />
<rect class="edge-label-bg" x="926.9" y="296.2" width="111.8" height="22" rx="3" />
<text class="edge-label" x="982.8" y="311.2">0 + no backing</text>
<polyline class="edge kind-data style-solid emphasis-normal" points="251.0,231.5 331.0,231.5 331.0,231.5 411.0,231.5" data-evidence="14317-14324" />
<rect class="edge-label-bg" x="305.2" y="189.5" width="51.5" height="22" rx="3" />
<text class="edge-label" x="331.0" y="204.5">상위 비트</text>
<g id="node-guest-offset">
<rect class="node-shape kind-data emphasis-normal role-source" data-evidence="14317-14325" x="70.0" y="196.0" width="181.0" height="71.0" rx="7" />
<text class="node-label" x="160.5" y="223.0">Guest offset</text>
<line class="node-detail-divider" x1="84.0" y1="244.0" x2="237.0" y2="244.0" />
<text class="node-detail" x="86.0" y="261.0">virtual disk position</text>
</g>
<g id="node-l1">
<rect class="node-shape kind-component emphasis-normal role-service" data-evidence="14312-14337" x="411.0" y="196.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="486.0" y="223.0">L1 table</text>
<line class="node-detail-divider" x1="425.0" y1="244.0" x2="547.0" y2="244.0" />
<text class="node-detail" x="427.0" y="261.0">상위 비트</text>
</g>
<g id="node-l2">
<rect class="node-shape kind-component emphasis-primary role-service" data-evidence="14320-14347" x="721.0" y="196.0" width="150.0" height="71.0" rx="7" />
<text class="node-label" x="796.0" y="223.0">L2 entry</text>
<line class="node-detail-divider" x1="735.0" y1="244.0" x2="857.0" y2="244.0" />
<text class="node-detail" x="737.0" y="261.0">중간 13비트</text>
</g>
<g id="node-backing">
<rect class="node-shape kind-store emphasis-normal role-store" data-evidence="14343-14354" x="1046.5" y="71.8" width="150.0" height="47.3" /><ellipse class="node-shape kind-store emphasis-normal role-store" cx="1121.5" cy="71.8" rx="75.0" ry="11.8" /><path class="storage-bottom" d="M 1046.5 119.2 A 75.0 11.8 0 0 0 1196.5 119.2" />
<text class="node-label" x="1121.5" y="87.0">base.qcow2</text>
<line class="node-detail-divider" x1="1060.5" y1="108.0" x2="1182.5" y2="108.0" />
<text class="node-detail" x="1062.5" y="125.0">backing file</text>
</g>
<g id="node-local-cluster">
<rect class="node-shape kind-store emphasis-normal role-store" data-evidence="14267-14272,14343-14345" x="1031.0" y="213.7" width="181.0" height="42.7" /><ellipse class="node-shape kind-store emphasis-normal role-store" cx="1121.5" cy="213.7" rx="90.5" ry="10.7" /><path class="storage-bottom" d="M 1031.0 256.3 A 90.5 10.7 0 0 0 1212.0 256.3" />
<text class="node-label" x="1121.5" y="233.0">현재 qcow2 data cluster</text>
</g>
<g id="node-zero-fill">
<rect class="node-shape kind-result emphasis-normal role-sink" data-evidence="14343-14347" x="1046.5" y="339.0" width="150.0" height="64.0" rx="7" />
<text class="node-label" x="1121.5" y="369.0">zero-filled 64KB</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB