# Enable virtualization

Virtualization uses software to create an abstraction layer over
computer hardware.

The abstraction layer divides the hardware elements of a single computer,
such as processor, memory, and storage into different
virtual entities, called as virtual machines (VMs). Each VM runs its
own OS and behaves like an independent computer,
though it’s running on the same underlying computer hardware.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export virtualization.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="6.0939in" height="4.89004in" viewbox="0 0 438.761 352.083" xml:space="preserve" color-interpolation-filters="sRGB" class="st10" aria-label="Representation or virtualization design."><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"></v:ud>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-width: 1.5 }
.svg-1 .st2 { fill: none; stroke: #d2d7e1; stroke-width: 1.5 }
.svg-1 .st3 { fill: #d2d7e1; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st4 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.16666em }
.svg-1 .st5 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st6 { fill: #feffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.16666em }
.svg-1 .st7 { fill: none; stroke: none; stroke-width: 2 }
.svg-1 .st8 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st9 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.75em }
.svg-1 .st10 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="shape1029-1" v:mid="1029" v:groupcontext="shape" transform="translate(19.4999,-22.5829)">		<title>Rounded Rectangle</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.069444325034464):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.069444325034464):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.069444325034464):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.069444325034464):1"></v:ud>		</v:userdefs>		<path d="M5 352.08 L394.76 352.08 A4.99991 4.99991 -180 0 0 399.76 347.08 L399.76 47.08 A4.99991 4.99991 -180 0 0 394.76					 42.08 L5 42.08 A4.99991 4.99991 -180 0 0 0 47.08 L0 347.08 A4.99991 4.99991 -180 0 0 5 352.08 Z" class="st1"></path>	</g>	<g id="shape1007-3" v:mid="1007" v:groupcontext="shape" transform="translate(229.392,-165.403)">		<title>Rectangle.1007</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="221.383" width="175" height="130.7" rx="2.88" ry="2.88" class="st2"></rect>	</g>	<g id="shape1023-5" v:mid="1023" v:groupcontext="shape" transform="translate(31.2499,-165.403)">		<title>Rectangle.1023</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="221.383" width="175" height="130.7" rx="2.88" ry="2.88" class="st2"></rect>	</g>	<g id="shape1016-7" v:mid="1016" v:groupcontext="shape" transform="translate(30.2499,-115.107)">		<title>Rectangle.1016</title>		<desc>Operating system</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="187.721" cy="333.99" width="375.45" height="36.1864"></v:textrect>		<rect x="0" y="315.897" width="375.443" height="36.1864" rx="2.88" ry="2.88" class="st3"></rect>		<text x="132.93" y="338.19" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Operating system</text>		</g>	<g id="shape1019-10" v:mid="1019" v:groupcontext="shape" transform="translate(30.2499,-64.8101)">		<title>Rectangle.1019</title>		<desc>Hardware</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="187.721" cy="333.99" width="375.45" height="36.1864"></v:textrect>		<rect x="0" y="315.897" width="375.443" height="36.1864" rx="2.88" ry="2.88" class="st5"></rect>		<text x="157.46" y="338.19" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape1002-13" v:mid="1002" v:groupcontext="shape" transform="translate(44.1067,-236.892)">		<title>Rectangle.1002</title>		<desc>User space</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="74.6432" cy="328.475" width="149.29" height="47.2151"></v:textrect>		<rect x="0" y="304.868" width="149.286" height="47.2151" rx="2.88" ry="2.88" class="st3"></rect>		<text x="39.97" y="332.68" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>User space</text>		</g>	<g id="shape1003-16" v:mid="1003" v:groupcontext="shape" transform="translate(44.1067,-177.873)">		<title>Rectangle.1003</title>		<desc>Operating system</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="74.6432" cy="328.475" width="149.29" height="47.2151"></v:textrect>		<rect x="0" y="304.868" width="149.286" height="47.2151" rx="2.88" ry="2.88" class="st3"></rect>		<text x="19.85" y="332.68" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Operating system</text>		</g>	<g id="shape1009-19" v:mid="1009" v:groupcontext="shape" transform="translate(53.673,-300.852)">		<title>Sheet.1009</title>		<desc>Virtual machine #1</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63.7939" cy="338.968" width="127.59" height="26.2306"></v:textrect>		<rect x="0" y="325.852" width="127.588" height="26.2306" class="st7"></rect>		<text x="5.18" y="343.17" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Virtual machine #1</text>		</g>	<g id="shape1005-22" v:mid="1005" v:groupcontext="shape" transform="translate(242.134,-236.686)">		<title>Rectangle.1005</title>		<desc>User space</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="74.6432" cy="328.475" width="149.29" height="47.2151"></v:textrect>		<rect x="0" y="304.868" width="149.286" height="47.2151" rx="2.88" ry="2.88" class="st3"></rect>		<text x="39.97" y="332.68" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>User space</text>		</g>	<g id="shape1006-25" v:mid="1006" v:groupcontext="shape" transform="translate(242.134,-177.667)">		<title>Rectangle.1006</title>		<desc>Operating system</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="74.6432" cy="328.475" width="149.29" height="47.2151"></v:textrect>		<rect x="0" y="304.868" width="149.286" height="47.2151" rx="2.88" ry="2.88" class="st3"></rect>		<text x="19.85" y="332.68" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Operating system</text>		</g>	<g id="shape1010-28" v:mid="1010" v:groupcontext="shape" transform="translate(219.805,-300.685)">		<title>Sheet.1010</title>		<desc>Virtual machine #2</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="96.9723" cy="338.968" width="193.95" height="26.2306"></v:textrect>		<rect x="0" y="325.852" width="193.945" height="26.2306" class="st7"></rect>		<text x="38.36" y="343.17" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Virtual machine #2</text>		</g>	<g id="shape1027-31" v:mid="1027" v:groupcontext="shape" transform="translate(19.4999,-18)">		<title>Sheet.1027</title>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>	</g>	<g id="shape1030-32" v:mid="1030" v:groupcontext="shape" transform="translate(349.261,-32.5829)">		<title>Sheet.1030</title>		<rect x="0" y="339.777" width="12.7435" height="12.306" rx="2" ry="2" class="st5"></rect>	</g>	<g id="shape1031-34" v:mid="1031" v:groupcontext="shape" transform="translate(361.842,-32.5829)">		<title>Sheet.1031</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="23.625" cy="345.93" width="47.25" height="12.306"></v:textrect>		<rect x="0" y="339.777" width="47.25" height="12.306" class="st8"></rect>		<text x="4.17" y="348.63" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g></g>
</svg>

**Figure: Virtualization**

## KVM overview

A kernel-based virtual machine (KVM) is an open-source virtualization module integrated into the Linux kernel.
This integration allows the KVM to act as a hypervisor.
KVM facilitates hardware-assisted virtualization for guest operating systems.

Note

KVM is supported on Dragonwing™ IQ-8275 and Dragonwing IQ-9075 SoCs only.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export kvm-blockdiagram.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.6947in" height="9.23481in" viewbox="0 0 626.019 664.906" xml:space="preserve" color-interpolation-filters="sRGB" class="st33" aria-label="Representation of high-level KVM/QEMU virtualization process."><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-2 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-2 .st2 { fill: #040a40; fill-opacity: 0; stroke: #040a40; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st3 { fill: none; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st4 { fill: #040a40; stroke: #ffffff; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-2 .st5 { fill: #ffffff; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.24 }
.svg-2 .st6 { fill: #e4e4e4; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.24 }
.svg-2 .st7 { fill: #ffffff; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st8 { fill: #ffffff; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st9 { fill: #007884; stroke: #ffffff; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-2 .st10 { fill: #007884; stroke: #ffffff; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st11 { stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-2 .st12 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em; font-weight: bold }
.svg-2 .st13 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-2 .st14 { font-size: 1em }
.svg-2 .st15 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-2 .st16 { fill: #d2d7e1; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-2 .st17 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.833336em }
.svg-2 .st18 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.99999em }
.svg-2 .st19 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.00001em }
.svg-2 .st20 { stroke: #040a40; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-2 .st21 { stroke: #ffffff; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st22 { marker-end: url("#1-mrkr4-102"); marker-start: url("#1-mrkr4-100"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st23 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.45454545454545 }
.svg-2 .st24 { marker-end: url("#1-mrkr4-102"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st25 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st26 { marker-end: url("#1-mrkr4-174"); stroke: #2a2aea; stroke-dasharray: 1.5, 3; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st27 { fill: #2a2aea; fill-opacity: 1; stroke: #2a2aea; stroke-opacity: 1; stroke-width: 0.45454545454545 }
.svg-2 .st28 { stroke: #2a2aea; stroke-dasharray: 1.5, 3; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st29 { fill: #d2d7e1; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.24 }
.svg-2 .st30 { fill: #d2d7e1; fill-opacity: 0; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st31 { fill: #040a40; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-2 .st32 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-2 .st33 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="1-mrkr4-100" class="st23" v:arrowtype="4" v:arrowsize="1" v:setback="4.16" refx="4.16" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.2) "></use>	</marker>	<marker id="1-mrkr4-102" class="st23" v:arrowtype="4" v:arrowsize="1" v:setback="4.4" refx="-4.4" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.2,-2.2) "></use>	</marker>	<marker id="1-mrkr4-174" class="st27" v:arrowtype="4" v:arrowsize="1" v:setback="4.4" refx="-4.4" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.2,-2.2) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1039-1" v:mid="1039" v:groupcontext="shape" transform="translate(19,-19)">		<title>Rectangle</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="38" width="588.019" height="626.906" rx="2.88" ry="2.88" class="st1"></rect>	</g>	<g id="shape1024-3" v:mid="1024" v:groupcontext="shape" transform="translate(113.605,-434.457)">		<title>Rounded Rectangle.1024</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.061208163569655):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.061208163569655):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.061208163569655):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.061208163569655):1"></v:ud>		</v:userdefs>		<path d="M4.41 664.91 L139.84 664.91 A4.40692 4.40692 -180 0 0 144.25 660.5 L144.25 573.15 A4.40692 4.40692 -180 0 0					 139.84 568.74 L4.41 568.74 A4.40692 4.40692 -180 0 0 0 573.15 L0 660.5 A4.40692 4.40692 -180 0 0 4.41 664.91					 Z" class="st2"></path>	</g>	<g id="shape1006-5" v:mid="1006" v:groupcontext="shape" transform="translate(105.042,-381.313)">		<title>Rounded Rectangle</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.033088234308011):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.033088234308011):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.033088234308011):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.033088234308011):1"></v:ud>		</v:userdefs>		<path d="M2.38 664.91 L240.62 664.91 A2.38231 2.38231 -180 0 0 243 662.52 L243 419.29 A2.38231 2.38231 -180 0 0 240.62					 416.9 L2.38 416.9 A2.38231 2.38231 -180 0 0 -0 419.29 L0 662.52 A2.38231 2.38231 -180 0 0 2.38 664.91 Z" class="st3"></path>	</g>	<g id="shape1073-7" v:mid="1073" v:groupcontext="shape" transform="translate(122.51,-477.197)">		<title>Rounded Rectangle.1073</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>		</v:userdefs>		<path d="M3.86 664.91 L122.6 664.91 A3.86364 3.86364 -180 0 0 126.46 661.04 L126.46 639.34 A3.86364 3.86364 -180 0 0					 122.6 635.48 L3.86 635.48 A3.86364 3.86364 -180 0 0 0 639.34 L0 661.04 A3.86364 3.86364 -180 0 0 3.86 664.91					 Z" class="st4"></path>	</g>	<g id="group1069-9" transform="translate(31.6532,-495.192)" v:mid="1069" v:groupcontext="group">		<v:userdefs>			<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.35355339059327):1"></v:ud>			<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.78539816339745):32"></v:ud>			<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>			<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.22131937754001):1"></v:ud>			<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.75170305605143):32"></v:ud>			<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.16204759304558):1"></v:ud>			<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.15147927176):1"></v:ud>		</v:userdefs>		<title>Folded Corner.1069</title>		<g id="shape1069-10" v:mid="1069" v:groupcontext="groupContent">			<path d="M0 664.91 L42.74 664.91 L54.41 654 L54.41 606.7 L0 606.7 L0 664.91 Z" class="st5"></path>		</g>		<g id="shape1070-12" v:mid="1070" v:groupcontext="shape" transform="translate(42.7413,1.13687E-13)">			<title>Sheet.1070</title>			<v:userdefs>				<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(1):1"></v:ud>				<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="FillForegnd" v:prompt="" v:val="VT0(1):26"></v:ud>				<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(0.60454173930146):1"></v:ud>				<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.1616797674876):1"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.16204759304558):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.15147927176):1"></v:ud>			</v:userdefs>			<path d="M0 664.91 L11.67 654 L0.79 653.27 L0 664.91 Z" class="st6"></path>		</g>	</g>	<g id="shape1026-14" v:mid="1026" v:groupcontext="shape" transform="translate(113.458,-556.88)">		<title>Rounded Rectangle.1026</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.061270273447059):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.061270273447059):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.061270273447059):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.061270273447059):1"></v:ud>		</v:userdefs>		<path d="M4.41 664.91 L139.98 664.91 A4.41139 4.41139 -180 0 0 144.39 660.49 L144.39 635.79 A4.41139 4.41139 -180 0 0					 139.98 631.38 L4.41 631.38 A4.41139 4.41139 -180 0 0 0 635.79 L0 660.49 A4.41139 4.41139 -180 0 0 4.41 664.91					 Z" class="st4"></path>	</g>	<g id="shape1015-16" v:mid="1015" v:groupcontext="shape" transform="translate(104.5,-77.6367)">		<title>Rounded Rectangle.1015</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>		</v:userdefs>		<path d="M3.67 664.91 L345.3 664.91 A3.67321 3.67321 -180 0 0 348.98 661.23 L348.98 560.65 A3.67321 3.67321 -180 0 0					 345.3 556.98 L3.67 556.98 A3.67321 3.67321 -180 0 0 0 560.65 L0 661.23 A3.67321 3.67321 -180 0 0 3.67 664.91					 Z" class="st7"></path>	</g>	<g id="shape1014-18" v:mid="1014" v:groupcontext="shape" transform="translate(104.5,-217.62)">		<title>Rounded Rectangle.1014</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.051017613326297):1"></v:ud>		</v:userdefs>		<path d="M3.67 664.91 L345.3 664.91 A3.67321 3.67321 -180 0 0 348.98 661.23 L348.98 538.32 A3.67321 3.67321 -180 0 0					 345.3 534.65 L3.67 534.65 A3.67321 3.67321 -180 0 0 0 538.32 L0 661.23 A3.67321 3.67321 -180 0 0 3.67 664.91					 Z" class="st8"></path>	</g>	<g id="shape1012-20" v:mid="1012" v:groupcontext="shape" transform="translate(364.019,-434.125)">		<title>Rounded Rectangle.1012</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>		</v:userdefs>		<path d="M2.73 664.91 L86.72 664.91 A2.73306 2.73306 -180 0 0 89.46 662.17 L89.46 628.12 A2.73306 2.73306 -180 0 0 86.72					 625.38 L2.73 625.38 A2.73306 2.73306 -180 0 0 -0 628.12 L0 662.17 A2.73306 2.73306 -180 0 0 2.73 664.91					 Z" class="st9"></path>	</g>	<g id="shape1011-22" v:mid="1011" v:groupcontext="shape" transform="translate(364.019,-509.52)">		<title>Rounded Rectangle.1011</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.037959755202283):1"></v:ud>		</v:userdefs>		<path d="M2.73 664.91 L86.72 664.91 A2.73306 2.73306 -180 0 0 89.46 662.17 L89.46 586.66 A2.73306 2.73306 -180 0 0 86.72					 583.93 L2.73 583.93 A2.73306 2.73306 -180 0 0 -0 586.66 L0 662.17 A2.73306 2.73306 -180 0 0 2.73 664.91					 Z" class="st9"></path>	</g>	<g id="shape1008-24" v:mid="1008" v:groupcontext="shape" transform="translate(117.107,-302.237)">		<title>Rounded Rectangle.1008</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>		</v:userdefs>		<path d="M3.67 664.91 L251.66 664.91 A3.66718 3.66718 -180 0 0 255.32 661.24 L255.32 635.05 A3.66718 3.66718 -180 0 0					 251.66 631.38 L3.67 631.38 A3.66718 3.66718 -180 0 0 0 635.05 L0 661.24 A3.66718 3.66718 -180 0 0 3.67 664.91					 Z" class="st10"></path>	</g>	<g id="shape1007-26" v:mid="1007" v:groupcontext="shape" transform="translate(117.695,-231.373)">		<title>Rounded Rectangle.1007</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.050933897400677):1"></v:ud>		</v:userdefs>		<path d="M3.67 664.91 L251.66 664.91 A3.66718 3.66718 -180 0 0 255.32 661.24 L255.32 607.84 A3.66718 3.66718 -180 0 0					 251.66 604.17 L3.67 604.17 A3.66718 3.66718 -180 0 0 0 607.84 L0 661.24 A3.66718 3.66718 -180 0 0 3.67 664.91					 Z" class="st10"></path>	</g>	<g id="shape24-28" v:mid="24" v:groupcontext="shape" transform="translate(188.71,-604.01)">		<title>Sheet.24</title>		<desc>KVM Guest</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="39.2249" cy="657.389" width="78.45" height="15.0345"></v:textrect>		<path d="M78.45 649.87 L0 649.87 L0 664.91 L78.45 664.91 L78.45 649.87" class="st11"></path>		<text x="8.94" y="660.99" class="st12" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>KVM Guest</text>		</g>	<g id="shape25-32" v:mid="25" v:groupcontext="shape" transform="translate(144.522,-566.125)">		<title>Sheet.25</title>		<desc>Application</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="41.2062" cy="657.389" width="82.42" height="15.0345"></v:textrect>		<path d="M82.41 649.87 L0 649.87 L0 664.91 L82.41 664.91 L82.41 649.87" class="st11"></path>		<text x="11.09" y="660.99" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Application</text>		</g>	<g id="shape34-36" v:mid="34" v:groupcontext="shape" transform="translate(367.526,-521.654)">		<title>Sheet.34</title>		<desc>Hardware emulation (QEMU)</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="41.2215" cy="636.55" width="82.45" height="56.7124"></v:textrect>		<path d="M82.44 608.19 L0 608.19 L0 664.91 L82.44 664.91 L82.44 608.19" class="st11"></path>		<text x="15.28" y="625.75" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware <tspan x="14.61" dy="1.2em" class="st14">emulation </tspan><tspan x="20.42" dy="1.2em" class="st14">(QEMU) </tspan> </text>		</g>	<g id="shape37-42" v:mid="37" v:groupcontext="shape" transform="translate(383.714,-447.173)">		<title>Sheet.37</title>		<desc>iothread</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="25.0337" cy="658.193" width="50.07" height="13.4274"></v:textrect>		<path d="M50.07 651.48 L0 651.48 L0 664.91 L50.07 664.91 L50.07 651.48" class="st11"></path>		<text x="3.03" y="661.79" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>iothread</text>		</g>	<g id="shape51-46" v:mid="51" v:groupcontext="shape" transform="translate(137.857,-267.796)">		<title>Sheet.51</title>		<desc>File system and block devices</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="106.331" cy="655.778" width="212.67" height="18.2561"></v:textrect>		<path d="M212.66 646.65 L0 646.65 L0 664.91 L212.66 664.91 L212.66 646.65" class="st11"></path>		<text x="26.84" y="659.38" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>File system and block devices</text>		</g>	<g id="shape53-50" v:mid="53" v:groupcontext="shape" transform="translate(404.519,-311.5)">		<title>Sheet.53</title>		<desc>Linux kernel</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="19.3442" cy="651.215" width="38.69" height="27.3818"></v:textrect>		<path d="M38.69 637.52 L0 637.52 L0 664.91 L38.69 664.91 L38.69 637.52" class="st11"></path>		<text x="4.73" y="647.62" class="st12" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Linux <tspan x="2.51" dy="1.2em" class="st14">kernel</tspan></text>		</g>	<g id="shape55-55" v:mid="55" v:groupcontext="shape" transform="translate(385.124,-161.744)">		<title>Sheet.55</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="30.1882" cy="655.778" width="60.38" height="18.2561"></v:textrect>		<path d="M60.38 646.65 L0 646.65 L0 664.91 L60.38 664.91 L60.38 646.65" class="st11"></path>		<text x="4.11" y="659.38" class="st12" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape97-59" v:mid="97" v:groupcontext="shape" transform="translate(123.058,-477)">		<title>Sheet.97</title>		<desc>File system drivers</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63.232" cy="648.986" width="126.47" height="31.8404"></v:textrect>		<rect x="0" y="633.066" width="126.464" height="31.8404" class="st15"></rect>		<text x="13.35" y="652.59" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>File system drivers</text>		</g>	<g id="shape111-62" v:mid="111" v:groupcontext="shape" transform="translate(344.139,-35.1539)">		<title>Sheet.111</title>		<rect x="0" y="649.714" width="16.4907" height="15.1922" rx="2.88" ry="2.88" class="st16"></rect>	</g>	<g id="shape114-64" v:mid="114" v:groupcontext="shape" transform="translate(35.1312,-499.78)">		<title>Sheet.114</title>		<desc>KVM guest kernel</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="23.0937" cy="640.392" width="46.19" height="49.0284"></v:textrect>		<rect x="0" y="615.878" width="46.1874" height="49.0284" class="st15"></rect>		<text x="12.41" y="631.39" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>KVM <tspan x="10.67" dy="1.2em" class="st14">guest </tspan><tspan x="9.6" dy="1.2em" class="st14">kernel</tspan></text>		</g>	<g id="shape118-69" v:mid="118" v:groupcontext="shape" transform="translate(209.923,-390.562)">		<title>Sheet.118</title>		<desc>…</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="23.0937" cy="643.174" width="46.19" height="43.4648"></v:textrect>		<path d="M46.19 621.44 L0 621.44 L0 664.91 L46.19 664.91 L46.19 621.44" class="st11"></path>		<text x="15.07" y="650.37" class="st18" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>…</text>		</g>	<g id="shape119-73" v:mid="119" v:groupcontext="shape" transform="translate(196.185,-307.823)">		<title>Sheet.119</title>		<desc>KVM (kvm.ko)</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.0032" cy="654.253" width="96.01" height="21.306"></v:textrect>		<rect x="0" y="643.6" width="96.0063" height="21.306" class="st15"></rect>		<text x="10.32" y="657.85" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>KVM (kvm.ko)</text>		</g>	<g id="shape1001-76" v:mid="1001" v:groupcontext="shape" transform="translate(162.147,-397.043)">		<title>Sheet.1001</title>		<desc>Vcpu 0</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="23.0937" cy="657.389" width="46.19" height="15.0345"></v:textrect>		<path d="M46.19 649.87 L0 649.87 L0 664.91 L46.19 664.91 L46.19 649.87" class="st11"></path>		<text x="4.61" y="660.99" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Vcpu 0</text>		</g>	<g id="shape1002-80" v:mid="1002" v:groupcontext="shape" transform="translate(252.351,-391.032)">		<title>Sheet.1002</title>		<path d="M2.88 635.48 L64.83 635.48 A2.88 2.88 0 0 1 67.71 638.36 L67.71 662.03 A2.88 2.88 0 0 1 64.83 664.91 L2.88 664.91					 A2.88 2.88 0 0 1 -0 662.03 L0 638.36 A2.88 2.88 0 0 1 2.88 635.48" class="st20"></path>	</g>	<g id="shape1003-83" v:mid="1003" v:groupcontext="shape" transform="translate(261.172,-398.228)">		<title>Sheet.1003</title>		<desc>Vcpu N</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="25.0337" cy="657.389" width="50.07" height="15.0345"></v:textrect>		<path d="M50.07 649.87 L0 649.87 L0 664.91 L50.07 664.91 L50.07 649.87" class="st11"></path>		<text x="5.64" y="660.99" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Vcpu N</text>		</g>	<g id="shape52-87" v:mid="52" v:groupcontext="shape" transform="translate(190.901,-237.429)">		<title>Sheet.52</title>		<desc>Physical drivers</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="53.287" cy="655.778" width="106.58" height="18.2561"></v:textrect>		<path d="M106.57 646.65 L0 646.65 L0 664.91 L106.57 664.91 L106.57 646.65" class="st11"></path>		<text x="11.38" y="659.38" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Physical drivers</text>		</g>	<g id="shape1021-91" v:mid="1021" v:groupcontext="shape" transform="translate(117.107,-261)">		<title>Sheet.1021</title>		<path d="M0 664.91 L255.32 664.91" class="st21"></path>	</g>	<g id="shape1022-94" v:mid="1022" v:groupcontext="shape" transform="translate(1073.65,230.781) rotate(90)">		<title>Sheet.1022</title>		<path d="M6.24 664.91 L6.6 664.91 L78.9 664.91" class="st22"></path>	</g>	<g id="shape1023-103" v:mid="1023" v:groupcontext="shape" transform="translate(952.425,90.983) rotate(90)">		<title>Sheet.1023</title>		<path d="M0 664.91 L146.86 664.91" class="st24"></path>	</g>	<g id="shape1029-108" v:mid="1029" v:groupcontext="shape" transform="translate(151.806,-389.847)">		<title>Sheet.1029</title>		<path d="M2.88 635.48 L64.83 635.48 A2.88 2.88 0 0 1 67.71 638.36 L67.71 662.03 A2.88 2.88 0 0 1 64.83 664.91 L2.88 664.91					 A2.88 2.88 0 0 1 -0 662.03 L0 638.36 A2.88 2.88 0 0 1 2.88 635.48" class="st20"></path>	</g>	<g id="shape1030-111" v:mid="1030" v:groupcontext="shape" transform="translate(258.147,-573.923)">		<title>Sheet.1030</title>		<path d="M0 664.91 L29.37 664.91" class="st25"></path>	</g>	<g id="shape1031-114" v:mid="1031" v:groupcontext="shape" transform="translate(850.634,108.697) rotate(90)">		<title>Sheet.1031</title>		<path d="M0 664.91 L18.99 664.91" class="st24"></path>	</g>	<g id="shape1032-119" v:mid="1032" v:groupcontext="shape" transform="translate(869.175,134.918) rotate(90)">		<title>Sheet.1032</title>		<path d="M0 664.91 L16.33 664.91" class="st24"></path>	</g>	<g id="shape1033-124" v:mid="1033" v:groupcontext="shape" transform="translate(850.629,227.858) rotate(89.7767)">		<title>Sheet.1033</title>		<path d="M0 664.91 L8.58 664.91" class="st24"></path>	</g>	<g id="shape1034-129" v:mid="1034" v:groupcontext="shape" transform="translate(337.439,923.193) rotate(180)">		<title>Sheet.1034</title>		<path d="M0 664.91 L10.78 664.91" class="st24"></path>	</g>	<g id="shape1035-134" v:mid="1035" v:groupcontext="shape" transform="translate(1073.65,155.387) rotate(90)">		<title>Sheet.1035</title>		<path d="M0 664.91 L29.27 664.91" class="st24"></path>	</g>	<g id="shape1036-139" v:mid="1036" v:groupcontext="shape" transform="translate(952.425,283.593) rotate(90)">		<title>Sheet.1036</title>		<path d="M6.24 664.91 L6.6 664.91 L25.45 664.91" class="st22"></path>	</g>	<g id="shape1037-146" v:mid="1037" v:groupcontext="shape" transform="translate(851.2,284.973) rotate(90)">		<title>Sheet.1037</title>		<path d="M6.24 664.91 L6.6 664.91 L25.45 664.91" class="st22"></path>	</g>	<g id="shape1038-153" v:mid="1038" v:groupcontext="shape" transform="translate(943.894,447.286) rotate(90)">		<title>Sheet.1038</title>		<path d="M6.24 664.91 L6.6 664.91 L25.45 664.91" class="st22"></path>	</g>	<g id="shape1040-160" v:mid="1040" v:groupcontext="shape" transform="translate(1002.35,171.156) rotate(90)">		<title>Sheet.1040</title>		<path d="M0 664.91 L86.88 664.91" class="st25"></path>	</g>	<g id="shape1041-163" v:mid="1041" v:groupcontext="shape" transform="translate(400.094,835.996) rotate(180)">		<title>Sheet.1041</title>		<path d="M0 664.91 L62.65 664.91" class="st25"></path>	</g>	<g id="shape1043-166" v:mid="1043" v:groupcontext="shape" transform="translate(1064.92,155.387) rotate(90)">		<title>Sheet.1043</title>		<path d="M0 664.91 L15.54 664.91" class="st25"></path>	</g>	<g id="shape1044-169" v:mid="1044" v:groupcontext="shape" transform="translate(58.8576,-469.886)">		<title>Sheet.1044</title>		<path d="M0 664.91 L47.87 664.91" class="st26"></path>	</g>	<g id="shape1045-175" v:mid="1045" v:groupcontext="shape" transform="translate(723.764,169.714) rotate(90)">		<title>Sheet.1045</title>		<path d="M0 664.91 L25.31 664.91" class="st28"></path>	</g>	<g id="shape1046-178" v:mid="1046" v:groupcontext="shape" transform="translate(487.519,779.803) rotate(180)">		<title>Sheet.1046</title>		<path d="M0 664.91 L27.44 664.91" class="st26"></path>	</g>	<g id="shape1048-183" v:mid="1048" v:groupcontext="shape" transform="translate(485.519,875.926) rotate(180)">		<title>Sheet.1048</title>		<path d="M0 664.91 L25.44 664.91" class="st26"></path>	</g>	<g id="shape1051-188" v:mid="1051" v:groupcontext="shape" transform="translate(304.806,-132.31)">		<title>Rectangle.1051</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st29"></rect>	</g>	<g id="shape58-190" v:mid="58" v:groupcontext="shape" transform="translate(313.581,-135.825)">		<title>Sheet.58</title>		<desc>cpuN</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="17.7967" cy="654.253" width="35.6" height="21.306"></v:textrect>		<path d="M35.59 643.6 L0 643.6 L0 664.91 L35.59 664.91 L35.59 643.6" class="st11"></path>		<text x="3.7" y="657.85" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>cpuN</text>		</g>	<g id="shape59-194" v:mid="59" v:groupcontext="shape" transform="translate(222.348,-143.433)">		<title>Sheet.59</title>		<desc>………</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="41.2062" cy="655.778" width="82.42" height="18.2561"></v:textrect>		<path d="M82.41 646.65 L0 646.65 L0 664.91 L82.41 664.91 L82.41 646.65" class="st11"></path>		<text x="17.12" y="662.98" class="st18" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>………</text>		</g>	<g id="shape1052-198" v:mid="1052" v:groupcontext="shape" transform="translate(169.417,-133.327)">		<title>Rectangle.1052</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st29"></rect>	</g>	<g id="shape57-200" v:mid="57" v:groupcontext="shape" transform="translate(180.195,-136.841)">		<title>Sheet.57</title>		<desc>cpu0</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="16.6658" cy="654.253" width="33.34" height="21.306"></v:textrect>		<path d="M33.33 643.6 L0 643.6 L0 664.91 L33.33 664.91 L33.33 643.6" class="st11"></path>		<text x="3.48" y="657.85" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>cpu0</text>		</g>	<g id="group1064-204" transform="translate(121.019,-87.7592)" v:mid="1064" v:groupcontext="group">		<title>Sheet.1064</title>		<g id="group1054-205" v:mid="1054" v:groupcontext="group">			<title>Sheet.1054</title>			<g id="shape61-206" v:mid="61" v:groupcontext="shape" transform="translate(11.5169,-5.78918)">				<title>Sheet.61</title>				<desc>Disk</desc>				<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>				<v:textrect cx="15.0548" cy="656.528" width="30.11" height="16.7567"></v:textrect>				<path d="M30.11 648.15 L0 648.15 L0 664.91 L30.11 664.91 L30.11 648.15" class="st11"></path>				<text x="3.53" y="660.13" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Disk</text>				</g>			<g id="shape1053-210" v:mid="1053" v:groupcontext="shape">				<title>Rectangle.1053</title>				<v:userdefs>					<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>				</v:userdefs>				<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st30"></rect>			</g>		</g>		<g id="group1055-212" transform="translate(80.9805,1.13687E-13)" v:mid="1055" v:groupcontext="group">			<title>Sheet.1055</title>			<g id="shape1056-213" v:mid="1056" v:groupcontext="shape" transform="translate(11.5169,-5.78918)">				<title>Sheet.1056</title>				<desc>Disk</desc>				<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>				<v:textrect cx="15.0548" cy="656.528" width="30.11" height="16.7567"></v:textrect>				<path d="M30.11 648.15 L0 648.15 L0 664.91 L30.11 664.91 L30.11 648.15" class="st11"></path>				<text x="3.53" y="660.13" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Disk</text>				</g>			<g id="shape1057-217" v:mid="1057" v:groupcontext="shape">				<title>Rectangle.1053</title>				<v:userdefs>					<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>				</v:userdefs>				<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st30"></rect>			</g>		</g>		<g id="group1058-219" transform="translate(161.961,1.13687E-13)" v:mid="1058" v:groupcontext="group">			<title>Sheet.1058</title>			<g id="shape1059-220" v:mid="1059" v:groupcontext="shape" transform="translate(11.5169,-5.78918)">				<title>Sheet.1059</title>				<desc>Disk</desc>				<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>				<v:textrect cx="15.0548" cy="656.528" width="30.11" height="16.7567"></v:textrect>				<path d="M30.11 648.15 L0 648.15 L0 664.91 L30.11 664.91 L30.11 648.15" class="st11"></path>				<text x="3.53" y="660.13" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Disk</text>				</g>			<g id="shape1060-224" v:mid="1060" v:groupcontext="shape">				<title>Rectangle.1053</title>				<v:userdefs>					<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>				</v:userdefs>				<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st30"></rect>			</g>		</g>		<g id="group1061-226" transform="translate(242.941,1.13687E-13)" v:mid="1061" v:groupcontext="group">			<title>Sheet.1061</title>			<g id="shape1062-227" v:mid="1062" v:groupcontext="shape" transform="translate(11.5169,-5.78918)">				<title>Sheet.1062</title>				<desc>Disk</desc>				<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>				<v:textrect cx="15.0548" cy="656.528" width="30.11" height="16.7567"></v:textrect>				<path d="M30.11 648.15 L0 648.15 L0 664.91 L30.11 664.91 L30.11 648.15" class="st11"></path>				<text x="3.53" y="660.13" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Disk</text>				</g>			<g id="shape1063-231" v:mid="1063" v:groupcontext="shape">				<title>Rectangle.1053</title>				<v:userdefs>					<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>				</v:userdefs>				<rect x="0" y="636.571" width="53.1434" height="28.335" rx="2.88" ry="2.88" class="st30"></rect>			</g>		</g>	</g>	<g id="shape1074-233" v:mid="1074" v:groupcontext="shape" transform="translate(121.581,-442.66)">		<title>Rounded Rectangle.1074</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.053662530354004):1"></v:ud>		</v:userdefs>		<path d="M3.86 664.91 L122.6 664.91 A3.86364 3.86364 -180 0 0 126.46 661.04 L126.46 639.34 A3.86364 3.86364 -180 0 0					 122.6 635.48 L3.86 635.48 A3.86364 3.86364 -180 0 0 0 639.34 L0 661.04 A3.86364 3.86364 -180 0 0 3.86 664.91					 Z" class="st4"></path>	</g>	<g id="shape28-235" v:mid="28" v:groupcontext="shape" transform="translate(164.763,-449.904)">		<title>Sheet.28</title>		<desc>Drivers</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="21.5278" cy="657.389" width="43.06" height="15.0345"></v:textrect>		<path d="M43.06 649.87 L0 649.87 L0 664.91 L43.06 664.91 L43.06 649.87" class="st11"></path>		<text x="2.9" y="660.99" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Drivers</text>		</g>	<g id="group1078-239" transform="translate(488.049,-379)" v:mid="1078" v:groupcontext="group">		<title>Sheet.1078</title>		<g id="group1067-240" transform="translate(0.732845,1.13687E-13)" v:mid="1067" v:groupcontext="group">			<v:userdefs>				<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.35355339059327):1"></v:ud>				<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.78539816339745):32"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>				<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.38386470118142):1"></v:ud>				<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.80115424076445):32"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.26725577774745):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.27581312148258):1"></v:ud>			</v:userdefs>			<title>Folded Corner.1067</title>			<g id="shape1067-241" v:mid="1067" v:groupcontext="groupContent">				<path d="M0 664.91 L80 664.91 L99.24 645.05 L99.24 568.74 L0 568.74 L0 664.91 Z" class="st5"></path>			</g>			<g id="shape1068-243" v:mid="1068" v:groupcontext="shape" transform="translate(79.3947,1.13687E-13)">				<title>Sheet.1068</title>				<v:userdefs>					<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(1):1"></v:ud>					<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="FillForegnd" v:prompt="" v:val="VT0(1):26"></v:ud>					<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(1.1027047576299):1"></v:ud>					<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.26712309410995):1"></v:ud>					<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.26725577774745):1"></v:ud>					<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.27581312148258):1"></v:ud>				</v:userdefs>				<path d="M0.61 664.91 L19.85 645.05 L0 645.67 L0.61 664.91 Z" class="st6"></path>			</g>		</g>		<g id="shape124-245" v:mid="124" v:groupcontext="shape" transform="translate(1.59872E-14,-15.1838)">			<title>Sheet.124</title>			<desc>Generates I/O requests to the host on behalf of the guests an...</desc>			<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>			<v:textrect cx="50.6128" cy="624.416" width="101.23" height="80.9805"></v:textrect>			<rect x="0" y="583.926" width="101.226" height="80.9805" class="st15"></rect>			<text x="19.78" y="603.42" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Generates I/O <tspan x="6.18" dy="1.2em" class="st14">requests to the host </tspan><tspan x="15.79" dy="1.2em" class="st14">on behalf of the </tspan><tspan x="7.35" dy="1.2em" class="st14">guests and handles </tspan><tspan x="35.92" dy="1.2em" class="st14">events</tspan></text>			</g>	</g>	<g id="group1079-252" transform="translate(488.049,-509.52)" v:mid="1079" v:groupcontext="group">		<title>Sheet.1079</title>		<g id="group1065-253" v:mid="1065" v:groupcontext="group">			<v:userdefs>				<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.35355339059327):1"></v:ud>				<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.78539816339745):32"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>				<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>				<v:ud v:nameu="ControlDistFromCorner" v:prompt="" v:val="VT0(0.36008895679279):1"></v:ud>				<v:ud v:nameu="AngToControl" v:prompt="" v:val="VT0(0.89605524828025):32"></v:ud>				<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.23056945782683):1"></v:ud>				<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.28821174175811):1"></v:ud>			</v:userdefs>			<title>Folded Corner</title>			<g id="shape1065-254" v:mid="1065" v:groupcontext="groupContent">				<path d="M0 664.91 L84.62 664.91 L101.23 644.16 L101.23 583.93 L0 583.93 L0 664.91 Z" class="st5"></path>			</g>			<g id="shape1066-256" v:mid="1066" v:groupcontext="shape" transform="translate(80.9805,1.13687E-13)">				<title>Sheet.1066</title>				<v:userdefs>					<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(1):1"></v:ud>					<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.25):1"></v:ud>					<v:ud v:nameu="FillForegnd" v:prompt="" v:val="VT0(1):26"></v:ud>					<v:ud v:nameu="ControlX" v:prompt="" v:val="VT0(1.124728817305):1"></v:ud>					<v:ud v:nameu="ControlY" v:prompt="" v:val="VT0(0.22494582631013):1"></v:ud>					<v:ud v:nameu="XFoldLength" v:prompt="" v:val="VT0(0.23056945782683):1"></v:ud>					<v:ud v:nameu="YFoldLength" v:prompt="" v:val="VT0(0.28821174175811):1"></v:ud>				</v:userdefs>				<path d="M3.64 664.91 L20.25 644.16 L0 648.71 L3.64 664.91 Z" class="st6"></path>			</g>		</g>		<g id="shape127-258" v:mid="127" v:groupcontext="shape" transform="translate(4.91771,-14.7148)">			<title>Sheet.127</title>			<desc>Only one thread can run QEMU code at a time (qemu_mutex)</desc>			<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>			<v:textrect cx="45.6951" cy="634.539" width="91.4" height="60.7354"></v:textrect>			<rect x="0" y="604.171" width="91.3902" height="60.7354" class="st15"></rect>			<text x="10.92" y="619.54" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Only one thread <tspan x="14.03" dy="1.2em" class="st14">can run QEMU </tspan><tspan x="14.09" dy="1.2em" class="st14">code at a time </tspan><tspan x="13.46" dy="1.2em" class="st14">(qemu_mutex)</tspan></text>			</g>	</g>	<g id="shape1080-264" v:mid="1080" v:groupcontext="shape" transform="translate(361.058,-37.125)">		<title>Sheet.1080</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="26.5717" cy="659.281" width="53.15" height="11.25"></v:textrect>		<rect x="0" y="653.656" width="53.1434" height="11.25" class="st15"></rect>		<text x="4.96" y="662.88" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape1081-267" v:mid="1081" v:groupcontext="shape" transform="translate(440.691,-37.125)">		<title>Sheet.1081</title>		<desc>Third party</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="30.1882" cy="659.281" width="60.38" height="11.25"></v:textrect>		<rect x="0" y="653.656" width="60.3765" height="11.25" class="st15"></rect>		<text x="6.27" y="662.88" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Third party</text>		</g>	<g id="shape1082-270" v:mid="1082" v:groupcontext="shape" transform="translate(427.191,-35.1539)">		<title>Sheet.1082</title>		<rect x="0" y="649.714" width="16.4907" height="15.1922" rx="2.88" ry="2.88" class="st31"></rect>	</g>	<g id="shape1083-272" v:mid="1083" v:groupcontext="shape" transform="translate(521.691,-37.125)">		<title>Sheet.1083</title>		<desc>Open source</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="33.0941" cy="659.281" width="66.19" height="11.25"></v:textrect>		<rect x="0" y="653.656" width="66.1882" height="11.25" class="st15"></rect>		<text x="5.06" y="662.88" class="st17" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Open source</text>		</g>	<g id="shape1084-275" v:mid="1084" v:groupcontext="shape" transform="translate(505.941,-35.1539)">		<title>Sheet.1084</title>		<rect x="0" y="649.714" width="16.4907" height="15.1922" rx="2.88" ry="2.88" class="st32"></rect>	</g></g>
</svg>

**High-level overview of KVM/QEMU virtualization**

The following are the prerequisites to enable KVM Hypervisor on Arm CPU-based systems:

- The Boot loader starts the Linux kernel in the exception level 2 (EL2)
- `CONFIG_KVM` is enabled in the kernel configuration

To verify if KVM is available on the device, run the following command to verify the presence of `/dev/kvm`:

ls -l /dev/kvm
    Copy to clipboard

For instructions to boot the Linux kernel in EL2 to enable the KVM hypervisor,
see [UEFI](https://docs.qualcomm.com/bundle/publicresource/topics/80-80020-4/boot-developer-touchpoints.html#uefi).

Consider the following when enabling KVM:

- Virtual host extensions (VHE) are enabled by default on all the Qualcomm Linux SoCs that support Arm (v8.1) or
later instruction sets. This configuration allows the entire Linux Kernel to run at EL2 with slight modifications.
The guest OS kernel and user space run at EL1 and EL0.
With VHE, transitions between the guest and host incur less penalty because the guest and host kernels
operate at different exception levels.
- The Linux kernel manages all accessible non-secure memory. It doesn’t support protected
use cases that require specific isolation from the Linux kernel.
- The power state coordination interface (PSCI) for KVM is supported on the Linux kernel. PSCI ensures that
CPU hotplug and low-power modes (LPM) function correctly with KVM.

### Virtual machine manager

Quick emulator (QEMU) is used as the virtual machine manager (VMM) for virtualization.
Libvirt acts as a management layer that interacts with QEMU to start, stop, and manage virtual machines.

#### QEMU

Use QEMU as a VMM with the KVM to run VMs at near-native performance. QEMU supports emulated devices, for example,
virtio devices, that provide high-performance I/O operations and allows access to USB and peripheral component
interconnect (PCI) devices from the VM.
The QEMU process and its threads manage a single VM. Invoke QEMU directly to create the VMs. For more information,
see [QEMU’s](https://qemu-project.gitlab.io/qemu/index.html).

#### Libvirt

Libvirt is a suite of tools, including an API library, a daemon (libvirtd), and a command-line utility (virsh),
for managing VMs. The virsh utility is useful for managing multiple VMs.
For more information, see [virsh](https://www.libvirt.org/manpages/virsh.html).

### Launch guest VM

To launch an ARM64-based VM, use QEMU or virsh commands that internally work with libvirt. The commands allow you to configure the VM with CPU, memory, and storage.
Specify the number of virtual CPUs and the amount of memory allocated to the VM. Additionally, the VM can boot with a ramdisk (initrd) and a `.ext4` root file system.

Note

Verify that the guest kernel image (`Image`), root filesystem CPIO (`rootfs.cpio.gz`), and
root filesystem image (`rootfs.ext4`) are present in the `/mnt/overlay/guest` directory
in the host filesystem before launching the guest. These file paths and formats are examples for reference.

#### QEMU

To bring up the VMs with various configurations, run the following commands:

##### Boot with ramdisk

To boot with ramdisk, run the following command:

qemu-system-aarch64 \
       -M virt -m 2G \
       -kernel /mnt/overlay/guest/Image \
       -initrd /mnt/overlay/guest/rootfs.cpio.gz \
       -cpu host --enable-kvm -smp 4 -nographic
    Copy to clipboard

##### Boot with rootfs image

To boot with rootfs image, run the following command:

qemu-system-aarch64 \
       -M virt -m 2G \
       -kernel /mnt/overlay/guest/Image \
       -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
       -append "root=/dev/vda" \
       -cpu host --enable-kvm -smp 4 -nographic
    Copy to clipboard

#### Libvirt

Libvirt enables you to use QEMU and KVM to create, interact, and manage VMs.

##### VM management with virsh

virsh provides a range of commands to create, control, and monitor VMs.
Run the following virsh commands for VM management:

# Define a new VM domain called initrd_simple
    virsh define /mnt/overlay/libvirt_initrd_simple.xml
    Copy to clipboard

# List all domains and check the state of initrd_simple, it is not started yet
    virsh list --all
    Copy to clipboard

# start the initrd_simple VM
    virsh start initrd_simple
    Copy to clipboard

# connect to console
    virsh console initrd_simple
    Copy to clipboard

# Disconnect from console by pressing (Ctrl + ]) key combination
    Copy to clipboard

# shutdown the VM
    Copy to clipboard

virsh shutdown initrd_simple
    Copy to clipboard

# Undefine the VM if there is no intention to restart/resue it
    virsh undefine initrd_simple
    Copy to clipboard

##### Boot with ramdisk

Copy the following XML content to `/mnt/overlay/guest/libvirt_initrd_simple.xml` on the host:

##### Boot with rootfs image

Copy the following XML file to the host file system in the `/mnt/overlay/guest/libvirt_rootfs_simple.xml` file.
Use the VM management commands with `rootfs_simple` as VM domain/name instead of `initrd_simple`.

> 
> 
>

### Virtio framework

Virtio abstracts devices in a paravirtualized hypervisor environment.
It provides an I/O paravirtualization framework to interact with the paravirtualized (paravirt) devices.
The virtual machine monitor (VMM) or hypervisor (HYP) emulates most of the devices exposed to virtual machines (VMs) using virtio.

### Key features

The following are the key features of virtual network:

- Paravirtualization and full virtualization

> 
> 
> - Full virtualization: In a fully virtual environment, the guest VM does not recognize the hypervisor, it runs without modifications. However, full virtualization results in higher overhead due to the device emulation.
>     - Paravirtualization: In a paravirtualize environment, the VM recognizes the hypervisor and requires modifications to the OS. Paravirtualization allows efficient communication between the guest and the host.
- Virtio architecture

> 
> 
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
> <!-- Generated by Microsoft Visio, SVG Export virtio_arch (2).svg Page-1 -->
> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.23958in" height="5.59375in" viewbox="0 0 305.25 402.75" xml:space="preserve" color-interpolation-filters="sRGB" class="st17" aria-label="Representation of the virtio architecture."><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
> <style>.svg-3 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
> .svg-3 .st2 { fill: #040a40; fill-opacity: 0; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
> .svg-3 .st3 { marker-end: url("#2-mrkr4-13"); marker-start: url("#2-mrkr4-11"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
> .svg-3 .st4 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313432835821 }
> .svg-3 .st5 { fill: #7c8aa3; stroke: #007884; stroke-linecap: round; stroke-linejoin: round; stroke-opacity: 0; stroke-width: 0.24 }
> .svg-3 .st6 { fill: #007884; fill-opacity: 0; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
> .svg-3 .st7 { stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
> .svg-3 .st8 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.33333em }
> .svg-3 .st9 { fill: #ffffff; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 1.33333em }
> .svg-3 .st10 { fill: #007884; stroke: #007884; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
> .svg-3 .st11 { fill: #040a40; stroke: #ffffff; stroke-linecap: round; stroke-linejoin: round; stroke-opacity: 0.32; stroke-width: 1.5 }
> .svg-3 .st12 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
> .svg-3 .st13 { fill: none; stroke: none; stroke-width: 0.25 }
> .svg-3 .st14 { fill: #000000; font-family: Roboto Flex, Qualcomm-Next, sans-serif; font-size: 0.75em }
> .svg-3 .st15 { fill: #040a40; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
> .svg-3 .st16 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
> .svg-3 .st17 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
> <defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="2-mrkr4-11" class="st4" v:arrowtype="4" v:arrowsize="2" v:setback="5.12" refx="5.12" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.68) "></use>	</marker>	<marker id="2-mrkr4-13" class="st4" v:arrowtype="4" v:arrowsize="2" v:setback="5.36" refx="-5.36" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.68,-2.68) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="shape44-1" v:mid="44" v:groupcontext="shape" transform="translate(18.75,-18.75)">		<title>Rectangle.44</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="37.5" width="267.75" height="365.25" rx="2.88" ry="2.88" class="st1"></rect>	</g>	<g id="shape38-3" v:mid="38" v:groupcontext="shape" transform="translate(29.4375,-288.977)">		<title>Rectangle.38</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="317.792" width="247.5" height="84.9582" rx="2.88" ry="2.88" class="st2"></rect>	</g>	<g id="shape30-5" v:mid="30" v:groupcontext="shape" transform="translate(555.938,245.42) rotate(90)">		<title>Sheet.30</title>		<path d="M7.68 402.75 L8.04 402.75 L39.88 402.75" class="st3"></path>	</g>	<g id="shape29-14" v:mid="29" v:groupcontext="shape" transform="translate(555.938,113.773) rotate(90)">		<title>Sheet.29</title>		<path d="M7.68 402.75 L8.04 402.75 L39.8 402.75" class="st3"></path>	</g>	<g id="shape36-21" v:mid="36" v:groupcontext="shape" transform="translate(29.4375,-64.4107)">		<title>Rectangle.36</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="357.75" width="247.5" height="45" rx="2.88" ry="2.88" class="st5"></rect>	</g>	<g id="shape33-23" v:mid="33" v:groupcontext="shape" transform="translate(29.4375,-157.33)">		<title>Rectangle</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="317.792" width="247.5" height="84.9582" rx="2.88" ry="2.88" class="st6"></rect>	</g>	<g id="shape14-25" v:mid="14" v:groupcontext="shape" transform="translate(101.474,-342.391)">		<title>Sheet.14</title>		<desc>Guest OS</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="48.2514" cy="391.964" width="96.51" height="21.5726"></v:textrect>		<path d="M96.5 381.18 L0 381.18 L0 402.75 L96.5 402.75 L96.5 381.18" class="st7"></path>		<text x="15.19" y="396.76" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Guest OS</text>		</g>	<g id="shape17-29" v:mid="17" v:groupcontext="shape" transform="translate(97.4616,-166.325)">		<title>Sheet.17</title>		<desc>Hypervisor</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="52.2634" cy="391.964" width="104.53" height="21.5726"></v:textrect>		<path d="M104.53 381.18 L0 381.18 L0 402.75 L104.53 402.75 L104.53 381.18" class="st7"></path>		<text x="14.13" y="396.76" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hypervisor</text>		</g>	<g id="shape18-33" v:mid="18" v:groupcontext="shape" transform="translate(102.049,-76.1243)">		<title>Sheet.18</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="47.6763" cy="391.964" width="95.36" height="21.5726"></v:textrect>		<path d="M95.35 381.18 L0 381.18 L0 402.75 L95.35 402.75 L95.35 381.18" class="st7"></path>		<text x="13.09" y="396.76" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g>	<g id="shape19-37" v:mid="19" v:groupcontext="shape" transform="translate(167.25,-254.641)">		<title>Sheet.19</title>		<desc>virtqueue</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="33.75" cy="391.964" width="67.5" height="21.5726"></v:textrect>		<path d="M67.5 381.18 L0 381.18 L0 402.75 L67.5 402.75 L67.5 381.18" class="st7"></path>		<text x="0.77" y="396.76" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>virtqueue</text>		</g>	<g id="shape34-41" v:mid="34" v:groupcontext="shape" transform="translate(68.4438,-196.946)">		<title>Rectangle.34</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="368.359" width="162.562" height="34.3907" rx="2.88" ry="2.88" class="st10"></rect>	</g>	<g id="shape16-43" v:mid="16" v:groupcontext="shape" transform="translate(83.6308,-203.355)">		<title>Sheet.16</title>		<desc>Backend drivers</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="66.0943" cy="391.964" width="132.19" height="21.5726"></v:textrect>		<path d="M132.19 381.18 L0 381.18 L0 402.75 L132.19 402.75 L132.19 381.18" class="st7"></path>		<text x="9.27" y="396.76" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Backend drivers</text>		</g>	<g id="shape35-47" v:mid="35" v:groupcontext="shape" transform="translate(64.2251,-299.641)">		<title>Rectangle.35</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<rect x="0" y="368.359" width="171" height="34.3907" rx="2.88" ry="2.88" class="st11"></rect>	</g>	<g id="shape15-49" v:mid="15" v:groupcontext="shape" transform="translate(71.6032,-306.05)">		<title>Sheet.15</title>		<desc>Frontend drivers</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="78.1219" cy="391.964" width="156.25" height="21.5726"></v:textrect>		<path d="M156.24 381.18 L0 381.18 L0 402.75 L156.24 402.75 L156.24 381.18" class="st7"></path>		<text x="20.15" y="396.76" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Frontend drivers</text>		</g>	<g id="shape1000-53" v:mid="1000" v:groupcontext="shape" transform="translate(207.544,-28.944)">		<title>Sheet.1000</title>		<rect x="0" y="390.444" width="12.7435" height="12.306" rx="2" ry="2" class="st12"></rect>	</g>	<g id="shape1001-55" v:mid="1001" v:groupcontext="shape" transform="translate(220.125,-28.944)">		<title>Sheet.1001</title>		<desc>Open source</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="30.375" cy="396.597" width="60.75" height="12.306"></v:textrect>		<rect x="0" y="390.444" width="60.75" height="12.306" class="st13"></rect>		<text x="5.15" y="399.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Open source</text>		</g>	<g id="shape1002-58" v:mid="1002" v:groupcontext="shape" transform="translate(128.128,-28.491)">		<title>Sheet.1002</title>		<rect x="0" y="390.444" width="12.7435" height="12.306" rx="2" ry="2" class="st15"></rect>	</g>	<g id="shape1003-60" v:mid="1003" v:groupcontext="shape" transform="translate(140.709,-28.491)">		<title>Sheet.1003</title>		<desc>Third party</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="25.875" cy="396.597" width="51.75" height="12.306"></v:textrect>		<rect x="0" y="390.444" width="51.75" height="12.306" class="st13"></rect>		<text x="4.35" y="399.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Third party</text>		</g>	<g id="shape1004-63" v:mid="1004" v:groupcontext="shape" transform="translate(54.5435,-28.491)">		<title>Sheet.1004</title>		<rect x="0" y="390.444" width="12.7435" height="12.306" rx="2" ry="2" class="st16"></rect>	</g>	<g id="shape1005-65" v:mid="1005" v:groupcontext="shape" transform="translate(67.125,-28.491)">		<title>Sheet.1005</title>		<desc>Hardware</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="23.625" cy="396.597" width="47.25" height="12.306"></v:textrect>		<rect x="0" y="390.444" width="47.25" height="12.306" class="st13"></rect>		<text x="4.17" y="399.3" class="st14" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g></g>
> </svg>
> 
> 
> **Figure : A high-level overview of the virtio architecture**
> 
>     - Front-end drivers: Implements in the guest OS. The front-end drivers interact with the back-end drivers
> in the hypervisor
>     - Back-end drivers: Implements in the VMM/HYP. The back-end drivers handle the actual device emulation,
> and interacts with the front-end drivers through virtual queues
>     - Virtual queues: Virtio uses virtual queues (virtqueues) to facilitate communication between front-end and back-end drivers. These queues are implemented as rings to manage guest-to-hypervisor transitions efficiently.
- Vhost

> 
> 
> Vhost is a protocol that offloads the virtio data plane implementation to another element
> (user process or kernel module) to enhance performance. This offloading reduces the overhead
> of context switching between the guest VM and the hypervisor.

    - Vhost-net: A kernel-level implementation that allows the data plane to bypass the QEMU process,
to reduce latency and improves performance.
For more information about v-host-net, see [Introduction to
virtio-networking and vhost-net](https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net).
    - Vhost-user: A user-space implementation that handles the data plane with a separate process, to provide flexibility and
better performance for workloads. For more information about v-host-user,
see [Vhost-user Protocol](https://www.qemu.org/docs/master/interop/vhost-user.html).

### Benefits

The following are the advantages of using virtio framework:

- Standardization: Virtio provides a common interface for device emulation. It promotes code reuse and efficiency across different
virtualization platforms.
- Flexibility: Virtio supports block devices and network devices.

### Virtio interfaces

The following are the virtio-supported interfaces:

#### 9P transport overview

`virtio-9p` enables you to share files between the host and the VMs under the 9P
(Plan 9 file system) protocol to enhance the performance within the virtio framework.

Note

Ensure that the following configurations are enabled in the host and guest kernels:

Host side: CONFIG_NET_9P, CONFIG_NET_9P_VIRTIO
    Copy to clipboard

Guest side: CONFIG_NET_9P, CONFIG_NET_9P_VIRTIO, CONFIG_9P_FS
    Copy to clipboard

To create a `virtio-9p` shared directory, define it on the host, and configure the guest VM to mount it.
See the following example:

root@qcs9100-ride-sx:~# ls -la /mnt/overlay/test_dir
    total 12
    drwxr-xr-x. 2 root root 4096 Apr 29 21:36 .
    drwxr-xr-x. 7 root root 4096 Apr 29 21:36 ..
    -rw-r--r--. 1 root root    8 Apr 29 21:36 file.txt
    root@qcs9100-ride-sx:~# cat /mnt/overlay/test_dir/file.txt
    testing
    root@qcs9100-ride-sx:~#
    Copy to clipboard

Create a `/mnt/overlay/test_dir` directory on the host to share it with the guest VM. Pass this information either in the libvirt XML configuration or as QEMU arguments.
To configure the 9P transport, run the following command:

qemu-system-aarch64 \
    -M virt -m 2G \
    -kernel /mnt/overlay/guest/Image \
    -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
    -append "root=/dev/vda" \
    -cpu host --enable-kvm -smp 4 -nographic \
    -fsdev local,id=fsdev0,path=/mnt/overlay/test_dir,security_model=passthrough \
    -device virtio-9p-pci,fsdev=fsdev0,mount_tag=hostshare
    Copy to clipboard

To identify and mount the shared directory on the guest VM, use the `fsdev0` and `hostshare` filesystem devices.

To launch the Libvirt guest VM from the libvirt interface with the following sample XML,
see Libvirt.

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_9p</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <filesystem type='mount' accessmode='mapped' fmode='644' dmode='755'>
          <!-- Specify the directory to be shared -->
          <source dir='/mnt/overlay/test_dir'/>
          <!-- Specify the mount_tag to identify the mount point -->
          <target dir='hostshare'/>
        </filesystem>
      </devices>
    </domain>
    Copy to clipboard

Note

Copy the XML content to `/mnt/overlay/guest/libvirt_virtio_9p.xml` file in the host.

After the guest VM boots up, verify if the virtio device is probed successfully.

root@v8a-arm64:~# lspci
    00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
    00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
    00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
    00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
    01:00.0 Unclassified device [0002]: Red Hat, Inc. Virtio 1.0 filesystem (rev 01)
    02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
    root@v8a-arm64:~#root@v8a-arm64:~# cat /sys/bus/pci/devices/0000\:01\:00.0/virtio0/uevent
    DRIVER=9pnet_virtio
    MODALIAS=virtio:d00000009v00001AF4
    root@v8a-arm64:~#
    Copy to clipboard

To mount the shared directory in the guest VM, run the following command:

mount -t 9p -o trans=virtio hostshare mountpoint
    Copy to clipboard

#### VSOCK overview

VSOCK is a virtual socket interface that allows communication between VMs and the host OS.
It’s used in KVM and QEMU. VSOCK is supported through a virtio interface. virtio-vsock is a vhost-based virtio device where the host kernel manages all the data transfer
while the KVM hypervisor controls the information.

To create a VSOCK connection in a KVM and QEMU environment, specify the context identifier (CID) and port the
number. The CID is a unique identifier assigned to each VM in a VSOCK environment, which is used to route
communication between the host and the VMs. The host has a CID of 2 while VMs are assigned CIDs starting from 3
and above.

The following table lists the CID values:

Table: CID values

| CID | Description |
| --- | --- |
| -1 | Any address for binding |
| 0 | Hypervisor |
| 1 | Loopback |
| 2 | Host |

Note

Ensure that the following configurations are enabled in the host and guest kernels.

Host side: CONFIG_VSOCKETS, CONFIG_VHOST_VSOCK
    
    Guest side: CONFIG_VSOCKETS, CONFIG_VIRTIO_VSOCKETS
    Copy to clipboard

- Enable VSOCK device: To enable the VSOCK device, specify the device in the VM configuration file (libvirt XML), or pass an argument to QEMU.

qemu-system-aarch64 \
        -machine virt -m 2G \
        -kernel /mnt/overlay/guest/Image \
        -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
        -append "root=/dev/vda" \
        -cpu host --enable-kvm -smp 4 -nographic \
        -device vhost-vsock-pci,guest-cid=73
        Copy to clipboard

In this command, `guest-cid=73` specifies the CID for the VM.

- Launch the guest VM using the libvirt interface: To use the VSOCK device with libvirt, define the VSOCK device in the VM XML configuration file.

    To launch the guest VM using the libvirt interface, see Libvirt.

Copy the XML content to `/mnt/overlay/guest/libvirt_virtio_vsock.xml` on the host.
After the Guest VM boots up, verify that the device is probed successfully.

> 
> 
> root@v8a-arm64:~# lspci
>     00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>     00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>     02:00.0 Communication controller: Red Hat, Inc. Virtio 1.0 socket (rev 01)
>     root@v8a-arm64:~#
>     root@v8a-arm64:~# cat /sys/bus/pci/devices/0000\:02\:00.0/virtio1/uevent
>     DRIVER=vmw_vsock_virtio_transport
>     MODALIAS=virtio:d00000013v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

To verify the host-to-guest and guest-to-host interaction, use the `socat` utility.
Ensure that the `socat` utility is supported on host and guest.

- On the host, verify the following port:

> 
> 
> socat STDIN VSOCK-LISTEN:1234
>     Copy to clipboard

- On the guest, connect to the host using the host CID (2):

socat STDOUT VSOCK-CONNECT:2:1234
    Copy to clipboard

- In this setup, the guest and host show the same values.

#### Virtio block overview

The virtio block is a standardized way to present block devices to the VM. Each virtio block device appears as a disk
inside the guest VM. The virtio block allows the VMs to read and write operations.

The following are the key features of the virtio-block device:

- Simplicity: Easy to implement and use
- Performance: Designed to minimize overhead and maximize throughput
- Flexibility: Designed to use with various types of storage back ends

Note

Ensure that `CONFIG_VIRTIO_BLK` is enabled in the guest kernel.

To use a virtio-block device, do the following:

1. To configure the VM for including a virtio-block device, specify the device in the
VM configuration file (libvirt XML), or pass an argument to QEMU.

    1. To enable the virtio-block device in the VM, use the following QEMU command:

qemu-system-aarch64 \
            -M virt -m 2G \
            -kernel /mnt/overlay/guest/Image \
            -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
            -append "root=/dev/vda" \
            -cpu host --enable-kvm -smp 4 -nographic \
            -drive file=/mnt/overlay/guest/disk.img,if=virtio,format=raw
            Copy to clipboard

        In this command, `rootfs.ext4` and `disk.img` are the disks inside the guest VM.
    2. Launch the guest VM using the libvirt interface: To launch the guest VM with the following sample XML,
see Libvirt:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
              <name>simple_block_device</name>
              <memory unit='KiB'>2097152</memory>
              <vcpu placement='static'>4</vcpu>
              <resource>
                <partition>/machine</partition>
              </resource>
              <os>
                <type arch='aarch64' machine='virt-6.2'>hvm</type>
                <kernel>/mnt/overlay/guest/Image</kernel>
                <cmdline>root=/dev/vda</cmdline>
                <boot dev='hd'/>
              </os>
              <features>
                <gic version='3'/>
              </features>
              <cpu mode='host-passthrough' check='none'/>
              <devices>
                <console type='pty'>
                </console>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/>
                  <!-- specify rootfs image file  -->
                  <source file="/mnt/overlay/guest/rootfs.ext4"/>
                  <target dev="vda" bus="virtio"/>
                </disk>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/>
                  <!-- specify a different disk image file -->
                  <source file="/mnt/overlay/guest/disk.img"/>
                  <target dev="vdb" bus="virtio"/>
                </disk>
              </devices>
            </domain>
            Copy to clipboard

Note

Copy the XML content to `/mnt/overlay/guest/libvirt_virtio_blk.xml` on the host.
2. The guest OS detects the virtio-block device and initializes it. In this process, the guest driver
communicates with the device to set up the necessary data structures and queues.

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>         [    0.225425] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>         [    0.227073] virtio-pci 0000:02:00.0: enabling device (0000 -> 0002)
>         [    0.234012] virtio_blk virtio0: 4/0/0 default/read/poll queues
>         [    0.235405] virtio_blk virtio0: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>         [    0.241213] virtio_blk virtio1: 4/0/0 default/read/poll queues
>         [    0.242418] virtio_blk virtio1: [vdb] 8192000 512-byte logical blocks (4.19 GB/3.91 GiB)
>         root@v8a-arm64:~#
>         root@v8a-arm64:~# lspci
>         00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>         00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>         02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>         root@v8a-arm64:~#
>         Copy to clipboard
3. After initializing, you can use the virtio-block and other block devices.
The guest OS performs read and write operations on the virtio driver and passes the operations
to the host for processing.
4. To manage the virtio-block device, use the standard tools and commands available in the guest OS.
For example, `lsblk` and `df`.

#### Virtio-IOMMU overview

Virtio-IOMMU is a paravirtualized input/output memory management unit (IOMMU) that provides
direct memory access (DMA) management in the virtual environments.
Virtio-IOMMU integrates with the existing software APIs such as virtual function I/O (VFIO) and removes the
need for page table emulation, making it a lightweight and high-performance solution.
Virtio-IOMMU acts as a proxy for physical IOMMUs and manages the devices assigned to the guest.
As virtual IOMMU, it manages, emulates, and paravirtualizes the devices.

The following are the key features of Virtio-IOMMU:

- Paravirtualization: Leverages existing transport mechanisms and reduces overhead.
- Flexibility: Supports PCI passthrough and shares virtual memory.
- Integration: Integrates with software APIs and enhances compatibility. For example, VFIO.

Note

Ensure that `CONFIG_VIRTIO_IOMMU` is enabled in the guest kernel.

To use a Virtio-IOMMU device, do the following:

1. To configure the VM for including a Virtio-IOMMU device, specify the device in the
VM configuration file (XML), or pass an argument to QEMU.

> 
> 
> 1. Enable a Virtio-IOMMU device: To enable the Virtio-IOMMU device in the VM, use the following QEMU command:
> 
> 
> 
> 
> > 
> > 
> > qemu-system-aarch64 \
> >     -M virt -m 2G \
> >     -kernel /mnt/overlay/guest/Image \
> >     -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
> >     -append "root=/dev/vda" \
> >     -cpu host --enable-kvm -smp 4 -nographic \
> >     -device virtio-iommu-pci
> >     Copy to clipboard
> 
> 
> 2. Launch guest VM using the libvirt interface: To launch the guest VM with the following sample XML, see Libvirt.
> 
> 
> 
> 
> > 
> > 
> > <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> >       <name>simple_iommu</name>
> >       <memory unit='KiB'>2097152</memory>
> >       <vcpu placement='static'>4</vcpu>
> >       <resource>
> >         <partition>/machine</partition>
> >       </resource>
> >       <os>
> >         <type arch='aarch64' machine='virt-6.2'>hvm</type>
> >         <kernel>/mnt/overlay/guest/Image</kernel>
> >         <cmdline>root=/dev/vda</cmdline>
> >         <boot dev='hd'/>
> >       </os>
> >       <features>
> >         <gic version='3'/>
> >       </features>
> >       <cpu mode='host-passthrough' check='none'/>
> >       <devices>
> >         <controller type='pci' index='0' model='pcie-root'>
> >           <alias name='pcie.0'/>
> >         </controller>
> >         <console type='pty'>
> >         </console>
> >         <disk type="file" device="disk">
> >           <driver name="qemu" type="raw"/>
> >           <!-- specify rootfs image file  -->
> >           <source file="/mnt/overlay/guest/rootfs.ext4"/>
> >           <target dev="vda" bus="virtio"/>
> >         </disk>
> >       </devices>
> >       <qemu:commandline>
> >         <qemu:arg value="-device"/>
> >         <qemu:arg value='{"driver":"virtio-iommu-pci","bus":"pcie.0","addr":"0x3"}'/>
> >       </qemu:commandline>
> >     </domain>
> >     Copy to clipboard
> 
> 
> 
> Note
> 
> 
> Copy the XML content to `/mnt/overlay/guest/libvirt_virtio_iommu.xml` on the host.

2. The guest OS detects the Virtio-IOMMU device and initializes it.
In this process, the guest driver communicates with the device to set up the necessary data structures and mappings.

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>     [    0.184166] virtio-pci 0000:00:03.0: enabling device (0000 -> 0002)
>     [    0.189122] virtio_iommu virtio0: input address: 64 bits
>     [    0.189516] virtio_iommu virtio0: page mask: 0xfffffffffffff000
>     [    0.220135] virtio-pci 0000:01:00.0: Adding to iommu group 0
>     [    0.220676] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>     [    0.223065] virtio_blk virtio1: 4/0/0 default/read/poll queues
>     [    0.224713] virtio_blk virtio1: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>     root@v8a-arm64:~#
>     Copy to clipboard
> 
> 
> The DMESG logs show that the virtio-block device is attached to the IOMMU domain,
> which is a part of the IOMMU group `0`.

3. After initializing, the Virtio-IOMMU device manages DMA operations for attached devices.
The guest OS performs mapping and unmapping operations with the virtio driver
and passes the operations to the host for processing.

> 
> 
> The following example shows Virtio-IOMMU device operations:
> 
> 
> root@v8a-arm64:~# cat /sys/kernel/iommu_groups/0/devices/0000\:01\:00.0/virtio1/uevent
>     DRIVER=virtio_blk
>     MODALIAS=virtio:d00000002v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

#### Virtio-net overview

The virtio-net device is a virtual network device that provides an interface for network
operations in virtualized environments. It offers high performance and low overhead.

The following are the key features of the virtio-net device:

- Efficiency: Minimizes overhead and maximizes throughput.
- Simplicity: Easy to implement and use.
- Flexibility: Supports various network configurations and back ends.

Note

Ensure that `CONFIG_VIRTIO_NET` is enabled in the guest kernel.

To use a virtio-net device, do the following:

1. To configure the VM for including a virtio-net device, specify the device in
the VM configuration file (libvirt XML), or pass an argument to QEMU.

> 
> 
> 1. To enable the virtio-net device in the VM, use the following QEMU command:
> 
> 
> 
> 
> > 
> > 
> > qemu-system-aarch64 \
> >     -M virt -m 2G \
> >     -kernel /mnt/overlay/guest/Image \
> >     -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
> >     -append "root=/dev/vda" \
> >     -cpu host --enable-kvm -smp 4 -nographic \
> >     -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
> >     -device virtio-net-pci,netdev=net0
> >     Copy to clipboard
> > 
> > 
> > Note
> > 
> > 
> > This command creates a Tap interface on the host. To create the Tap interface manually,
> > run the following command:
> > 
> > 
> > ip tuntap add dev tap0 mode tap
> >     Copy to clipboard
> 
> 
> 2. To launch the guest VM with the following sample XML, see Libvirt.
> 
> 
> 
> 
> > 
> > 
> > <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> >       <name>simple_net</name>
> >       <memory unit='KiB'>2097152</memory>
> >       <vcpu placement='static'>4</vcpu>
> >       <resource>
> >         <partition>/machine</partition>
> >       </resource>
> >       <os>
> >         <type arch='aarch64' machine='virt-6.2'>hvm</type>
> >         <kernel>/mnt/overlay/guest/Image</kernel>
> >         <cmdline>root=/dev/vda</cmdline>
> >         <boot dev='hd'/>
> >       </os>
> >       <features>
> >         <gic version='3'/>
> >       </features>
> >       <cpu mode='host-passthrough' check='none'/>
> >       <devices>
> >         <console type='pty'>
> >         </console>
> >         <disk type="file" device="disk">
> >           <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
> >           <source file="/mnt/overlay/guest/rootfs.ext4"/>
> >           <target dev="vda" bus="virtio"/>
> >         </disk>
> >         <interface type='ethernet'>
> >           <target dev='tap0'/>
> >           <model type='virtio'/>
> >         </interface>
> >       </devices>
> >     </domain>
> >     Copy to clipboard
> > 
> > 
> > To create a tap interface for direct communication between the host VM and the guest VM, copy the XML content to `/mnt/overlay/guest/libvirt_virtio_net.xml` on the host.

2. The guest operating system detects the virtio-net device and initializes it.
In this process, the guest driver communicates with the device to set up the necessary data structures and queues.

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>     [    0.394365] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>     [    0.396364] virtio-pci 0000:02:00.0: enabling device (0000 -> 0002)
>     [    0.404496] virtio_blk virtio1: 4/0/0 default/read/poll queues
>     [    0.406048] virtio_blk virtio1: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>     [    0.980919] virtio_net virtio0 enp1s0: renamed from eth0
>     root@v8a-arm64:~# lspci
>     00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>     00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     01:00.0 Ethernet controller: Red Hat, Inc. Virtio 1.0 network device (rev 01)
>     02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>     root@v8a-arm64:~#
>     Copy to clipboard

3. Operate: After you initialize and configure the virtio-net device, use it as other network interface.
The guest OS performs standard network operations with the virtio driver
and passes the operations to the host for processing.

To use the Tap interface, run the following network configurations on the host VM and the guest VM:

- Host configuration:

root@qcs9100-ride-sx:~# ip addr add 192.168.100.1/24 dev tap0
        root@qcs9100-ride-sx:~# ip link set dev tap0 up
        Copy to clipboard
- Guest configuration:

root@v8a-arm64:~# ip addr add 192.168.100.2/24 dev enp1s0
        root@v8a-arm64:~# ip link set dev enp1s0 up
        Copy to clipboard

To run the network traffic on this interface, use the following example:

> 
> 
> root@v8a-arm64:~# ping 192.168.100.1
>     PING 192.168.100.1 (192.168.100.1): 56 data bytes
>     64 bytes from 192.168.100.1: seq=0 ttl=64 time=0.364 ms
>     64 bytes from 192.168.100.1: seq=1 ttl=64 time=0.156 ms
>     Copy to clipboard

#### Virtio-serial and virtio-console overview

The virtio-serial device provides an interface for serial communication between the host VM and the guest VM in virtual environments.

The following are the key features of the virtio-serial device:

- Multiple ports: Supports multiple serial ports, allows various communication channels.
- Efficiency: Minimizes overhead and maximizes throughput.
- Flexibility: Supports different types of data exchange. For example, console access and file transfer.

Note

Ensure that `CONFIG_VIRTIO_CONSOLE` is enabled in the guest kernel.

To use a virtio-serial device, do the following:

1. To configure the VM for including a virtio-serial device, specify the device in
the VM configuration file (libvirt XML), or pass an argument to QEMU.

    1. To enable the virtio-net device in the VM, use the following QEMU command:

> 
> 
> qemu-system-aarch64 \
>         -M virt -m 2G \
>         -kernel /mnt/overlay/guest/Image \
>         -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
>         -append "root=/dev/vda" \
>         -cpu host --enable-kvm -smp 4 -nographic \
>         -device virtio-serial-pci,id=virtio-serial0 \
>         -chardev pty,id=charconsole0 \
>         -device virtconsole,chardev=charconsole0,id=console0 \
>         -chardev socket,path=/tmp/qemu.sock,server=on,wait=off,id=charchannel0 \
>         -device virtserialport,chardev=charchannel0,name=org.qemu.guest_agent.0
>         Copy to clipboard

    2. To launch the guest VM with the following sample XML, see Libvirt.

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
              <name>simple_serial</name>
              <memory unit='KiB'>2097152</memory>
              <vcpu placement='static'>4</vcpu>
              <resource>
                <partition>/machine</partition>
              </resource>
              <os>
                <type arch='aarch64' machine='virt-6.2'>hvm</type>
                <kernel>/mnt/overlay/guest/Image</kernel>
                <cmdline>root=/dev/vda</cmdline>
                <boot dev='hd'/>
              </os>
              <features>
                <gic version='3'/>
              </features>
              <cpu mode='host-passthrough' check='none'/>
              <devices>
                <console type='pty'>
                </console>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
                  <source file="/mnt/overlay/guest/rootfs.ext4"/>
                  <target dev="vda" bus="virtio"/>
                </disk>
                <controller type='virtio-serial' index='0'>
                  <alias name='virtio-serial0'/>
                </controller>
                <console type='pty'>
                  <target type='virtio' port='0'/>
                </console>
                <channel type='unix'>
                  <target type='virtio' name='org.qemu.guest_agent.0'/>
                  <address type='virtio-serial' controller='0' bus='0' port='1'/>
                </channel>
              </devices>
            </domain>
            Copy to clipboard

Note

Copy the XML content to `/mnt/overlay/guest/virtio_serial.xml` on the host.
2. The guest operating system detects the virtio-serial device and initializes it.
In this process, the guest driver communicates with the device to set up the necessary data structures and ports.

> 
> 
> root@v8a-arm64:~# lspci
>     00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>     00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     01:00.0 Communication controller: Red Hat, Inc. Virtio 1.0 console (rev 01)
>     02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>     root@v8a-arm64:~#
>     root@v8a-arm64:~# cat /sys/bus/virtio/devices/virtio0/uevent
>     DRIVER=virtio_console
>     MODALIAS=virtio:d00000003v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

3. After initialization, you can use the virtio-serial device as a serial device. The guest OS performs read and write operations with the virtio driver and passes the operations to the host for processing.
4. To manage the virtio-serial device, do the following:

    - Monitor the performance
    - Verify the device status
    - Perform maintenance tasks
    - Use the standard tools and commands available in the guest OS

##### Memory balloon device support

The traditional virtio memory balloon device manages the guest memory.
It allows the host system to reclaim memory from VMs. The memory balloon instructs VMs to return a
portion of their memory to the host. This process involves inflating the memory balloon inside the Guest VM, which reduces the memory available for other tasks within the VM. The Guest OS decides which memory pages to give back to the host, indicating which pages it does not need or access. The host then un-maps these pages from the guest VM and marks them as unavailable for the guest VM and allows the host system to use them. If the guest VM requires more memory later, the host deflates the balloon to return the pages. This feature allows each guest VM to continue running while its available memory is managed.

Use the following for the virtio-balloon device to relocate physical memory between a guest VM and the host:

1. Balloon inflation: The guest driver allocates memory and informs the host. The host then reuses the inflated memory for other VMs.
2. Balloon deflation: After informing the host, the guest driver frees the previously allocated memory
and enables the guest VM to use the deflated memory.

`Target balloon size` controls the balloon inflation or deflation through a request to change the guest
VM memory size. The resize request is sent through QEMU monitor mode or through virsh commands.

The following are the key features of the virtio-balloon device:

- Memory management: Adjusts memory allocation in real time based on the requirements.
- Efficiency: Reclaims unused memory from idle VMs and redistributes it to the active ones.
- Flexibility: Enables various virtualization setups to optimize resource usage.

Note

Ensure that `CONFIG_VIRTIO_BALLOON` is enabled in the guest kernel.

To use a virtio-balloon device, do the following:

1. Configure the VM for including a virtio-balloon device, specify the device in the VM configuration file (libvirt XML), or pass an argument to QEMU.

    1. To enable the virtio-balloon device in the VM, use the following QEMU command:

qemu-system-aarch64 \
            -M virt -m 2G \
            -kernel /mnt/overlay/guest/Image \
            -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
            -append "root=/dev/vda" \
            -cpu host --enable-kvm -smp 4 -nographic \
            -device virtio-balloon-pci,id=balloon0
            Copy to clipboard
    2. To launch the guest VM with the following sample XML, see Libvirt:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
              <name>simple_balloon</name>
              <memory unit='KiB'>2097152</memory>
              <vcpu placement='static'>4</vcpu>
              <resource>
                <partition>/machine</partition>
              </resource>
              <os>
                <type arch='aarch64' machine='virt-6.2'>hvm</type>
                <kernel>/mnt/overlay/guest/Image</kernel>
                <cmdline>root=/dev/vda</cmdline>
                <boot dev='hd'/>
              </os>
              <features>
                <gic version='3'/>
              </features>
              <cpu mode='host-passthrough' check='none'/>
              <devices>
                <console type='pty'>
                </console>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
                  <source file="/mnt/overlay/guest/rootfs.ext4"/>
                  <target dev="vda" bus="virtio"/>
                </disk>
                <memballoon model='virtio'/>
              </devices>
            </domain>
            Copy to clipboard

Note

Copy the XML content to `/mnt/overlay/guest/libvirt_virtio_balloon.xml` file on the host.
2. The guest OS detects the virtio-balloon device and initializes it. In this process, the guest driver
communicates with the device to set up the necessary data structures and memory management mechanisms.

root@v8a-arm64:~# lspci
        00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
        00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
        02:00.0 Unclassified device [00ff]: Red Hat, Inc. Virtio 1.0 memory balloon (rev 01)
        root@v8a-arm64:~#
        Copy to clipboard
3. After initializing, the virtio-balloon device adjusts the memory allocated to the VM. The guest OS performs memory
inflation and deflation operations, which are handled by the virtio driver, and passes it to the host for processing.

To adjust the guest memory, run the following virsh commands on the host:

- To verify the guest VM initial memory (2 GB), run the following command:

> 
> 
> root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
>     MemTotal:        1966180 kB
>     MemFree:         1807432 kB
>     MemAvailable:    1817552 kB
>     root@v8a-arm64:~#
>     Copy to clipboard

- To inflate the balloon and reduce the guest VM memory to 512 MB, run the following command:

root@qcs9100-ride-sx:~# virsh setmem simple_balloon 512M --live
        Copy to clipboard
- To verify the guest VM memory after inflation, run the following command:

root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
        MemTotal:         393316 kB
        MemFree:          235708 kB
        MemAvailable:     245836 kB
        root@v8a-arm64:~#
        Copy to clipboard
- To deflate the balloon (Guest VM memory back to 2 GB):

root@qcs9100-ride-sx:~# virsh setmem simple_balloon 2G --live
        Copy to clipboard
- To verify the guest VM memory after deflation:

root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
        MemTotal:        1966180 kB
        MemFree:         1811844 kB
        MemAvailable:    1821988 kB
        root@v8a-arm64:~#
        Copy to clipboard

##### Access host devices

You can use the enumerated devices on the host system from the guest.
The device assignment interface to the guest varies based on the device type.
Some devices act as a back end for a device emulated by QEMU, for example,
UART. Configure universal asynchronous
receiver transmitter (UART) as a character device (chardev) back end on the host.
For more information about QEMU chardev, see  [Character device options](https://www.qemu.org/docs/master/system/invocation.html#hxtool-6).

PCI and USB devices work on the kernel VFIO framework.

- PCI passthrough allows a guest VM to directly access a physical PCI device on
the host. The VFIO framework in the Linux kernel is used for the device assignment.
For more information about the VFIO, see [VFIO - Virtual Function I/O](https://docs.kernel.org/driver-api/vfio.html).
- A USB device operates in Passthrough mode, allowing the guest VM to use USB peripherals
connected to the host. QEMU emulates the USB controller and works
with libusb on the host to present USB peripherals to the guest.
For more information, see [USB emulation](https://qemu-project.gitlab.io/qemu/system/devices/usb.html).

**USB passthrough overview**

Identify the USB device that is enumerated on the host computer to assign it to the guest.
To see all the USB devices that are enumerated on the host, use the `lusb` command.
Find the device by its `vendor id` and `product id`.

In the following example, `vendor id` is 0x0781 and `product id` is 0x5567 for the USB memory stick.

sh-5.1# lsusb
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 004: ID 0781:5567 SanDisk Corp. Cruzer Blade
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Copy to clipboard

Note

Copy the following XML file on the host file system in `/mnt/overlay/guest/libvirt_usb.xml`
file and modify the XML file per `vendor id` and `product id`.

Launch a guest VM with the following sample XML and do the following:

1. After the guest VM is launched, connect to the console.
2. Verify the `lsusb` output in the guest VM.
3. Ensure that the output lists the USB device assigned to the guest.

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_usb</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <controller type='usb' index='0' model='qemu-xhci' ports='4'/>
        <hostdev mode='subsystem' type='usb' managed='yes'>
          <source><!-- Specify USB device VID/PID here -->
            <vendor id='0x0781'/>
            <product id='0x5567'/>
          </source>
        </hostdev>
      </devices>
    </domain>
    Copy to clipboard

**PCI overview**

Identify the PCI device that is enumerated on the host computer to assign it to the guest.
To see all the PCI devices that are enumerated on the host, use the `lspci` command.
Find the device by its `[domain:]bus:device.function`.
For more information about `lspci` command, see [lspci(8)—Linux manual page](https://man7.org/linux/man-pages/man8/lspci.8.html).

The following example shows supported values for domain, bus, device, and function for `Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz` device:

- Domain is 0001
- Bus is 01
- Device is 00
- Function is 0 for

sh-5.1# lspci
    0000:00:00.0 PCI bridge: Qualcomm Device 0115
    0000:01:00.0 Network controller: Qualcomm QCNFA765 Wireless Network Adapter (rev 01)
    0001:00:00.0 PCI bridge: Qualcomm Device 0115
    0001:01:00.0 Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz
    Copy to clipboard

Note

Copy the XML content to `/mnt/overlay/guest/libvirt_pci.xml` file and change the `hostdev` section in the XML file according to your device requirements.

To launch the guest VM, see Libvirt. After you launch the guest VM, connect it to the console
and verify the `lspci` output in the guest. Ensure that the output lists the PCI device assigned to the guest.

Note

The output shows different slots based on the guest PCI topology selected by QEMU and Libvirt.

When `managed` is marked as *yes* in `hostdev` in the following XML, the PCI device gets detached from the
host before it passes on to the guest, and re-attached to the host after the guest exits.
For more information, see [USB / PCI / SCSI devices](https://libvirt.org/formatdomain.html#usb-pci-scsi-devices).

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_pci</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/>
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <hostdev mode='subsystem' type='pci' managed='yes'>
          <source><!-- specify your PCI device details here -->
            <address domain='0x0001' bus='0x01' slot='0x00' function='0x0'/>
          </source>
        </hostdev>
      </devices>
    </domain>
    Copy to clipboard

**UART passthrough overview**

Identify the `/dev/ttyX` teletype (TTY) device file corresponding to the UART to use it from the guest.
Ensure that no application on the host is using this interface.

Note

Copy the XML content to `/mnt/overlay/guest/libvirt_uart.xml` file on the host and modify the TTY device file as per your device requirements.

Launch a guest VM and connect to the console. The serial interface at `/dev/virtio-ports/hostserial`
acts as a front end to the real UART on the host. Use the following XML file:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_uart</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <channel type='dev'>
          <source path='/dev/ttyMSM0'/>
          <target type='virtio' name='hostserial'/>
          <address type='virtio-serial' controller='0' bus='0' port='1'/>
        </channel>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/>
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
      </devices>
    </domain>
    Copy to clipboard

### KVM customizations

The following features allow you to modify the KVM hypervisor to meet specific requirements:

### Remote command execution

To enable the QEMU guest agent in the guest OS user space, run the remote commands on the guest VMs from the host.
For more information about `qemu-ga`, see [QEMU Guest Agent](https://qemu-project.gitlab.io/qemu/interop/qemu-ga.html).

`qemu-agent-command` is the virsh command that includes `guest-exec` and `guest-exec-status`
as the subcommands to execute and verify the status or output of the guest VMs.
For more information about how to configure `qemu-ga` through virtio-serial interface, see
[QEMU Guest Agent](https://wiki.libvirt.org/Qemu_guest_agent.html).

For more information about how `virt-exec` wraps virsh commands and provides an interface,
see [kvm-qemu/virt-exec](https://github.com/ildar-shaimordanov/my-scripts/blob/master/kvm-qemu/virt-exec).

The following example shows how to run `/proc/meminfo` on the guest VM from the host computer using a `virt-exec` utility:

sh-5.2# ./virt-exec testvm cat /proc/meminfo | grep -i total
    MemTotal:        1968056 kB
    SwapTotal:             0 kB
    VmallocTotal:   133141626880 kB
    CmaTotal:          32768 kB
    HugePages_Total:       0
    Copy to clipboard

#### Watchdog configuration

A QEMU-emulated I6300 ESB watchdog device is supported in the guest VM.
The Linux kernel has a driver for this watchdog and exposes the standard watchdog character device.
To enable the watchdog, set `CONFIG_I6300ESB_WDT` in the guest kernel configuration.
A guest user space daemon must pet the watchdog.

The guest Libvirt XML has an option to select `poweroff` or `reset` on watchdog
timeout. For more information, see [Watchdog devices](https://libvirt.org/formatdomain.html#watchdog-devices).

Add the following snippet to the guest XML to enable I6300 ESB watchdog emulation in QEMU. The
default action is `reset`, which restarts the guest.

<devices>
      <watchdog model='i6300esb'/>
    </devices>
    Copy to clipboard

#### KVM traces

To enable KVM traces, run the following command:

echo 1 > /sys/kernel/tracing/events/kvm/enable
    Copy to clipboard

The KVM guest interactions are recorded in kernel function trace (ftrace).
To inspect interactions between KVM and guest VMs, read the kernel trace buffer.

QEMU also supports trace events, which can be redirected to kernel ftrace. For more information about how to redirect QEMU trace back-end events to the ftrace buffer, see [Trace backends](https://qemu-project.gitlab.io/qemu/devel/tracing.html#trace-backends). This option is selected by default in the Qualcomm Linux release.

To launch a guest VM with virtio traces enabled in the QEMU code, run the following command:

qemu-system-aarch64 \
        -M virt -m 2G \
        -kernel /mnt/overlay/guest/Image \
        -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
        -append "root=/dev/vda" \
        -cpu host --enable-kvm -smp 4 -nographic \
        -trace "virtio*"
    Copy to clipboard

Last Published: Mar 04, 2026

Previous Topic
 
Learn Real-time (RT) kernel Next Topic

Capture the kernel logs