new file mode 100644
@@ -0,0 +1,122 @@
+---
+layout: post
+title: "An Overview of QEMU Storage Features"
+date: 2020-09-07 07:00:00 +0000
+categories: [storage]
+---
+This article introduces QEMU storage concepts including disk images, emulated
+storage controllers, block jobs, the qemu-img utility, and qemu-storage-daemon.
+If you are new to QEMU or want an overview of storage functionality in QEMU
+then this article explains how things fit together.
+
+## Storage technologies
+Persistently storing data and retrieving it later is the job of storage devices
+such as hard disks, solid state drives (SSDs), USB flash drives, network
+attached storage, and many others. Technologies vary in their storage capacity
+(disk size), access speed, price, and other factors but most of them follow the
+same block device model.
+
+![Block device I/O](/screenshots/2020-09-07-block-device-io.svg)
+
+Block devices are accessed in storage units called blocks. It is not possible
+to access individual bytes, instead an entire block must be transferred. Block
+sizes vary between devices with 512 bytes and 4KB block sizes being the most
+common.
+
+As an emulator and virtualizer of computer systems, QEMU naturally has to offer
+block device functionality. QEMU is capable of emulating hard disks, solid
+state drives (SSDs), USB flash drives, SD cards, and more.
+
+## Storage for virtual machines
+There is more to storage than just persisting data on behalf of a virtual
+machine. The lifecycle of a disk image includes several operations that are
+briefly covered below.
+
+![Block device I/O](/screenshots/2020-09-07-lifecycle.svg)
+
+Virtual machines consist of device configuration (how much RAM, which
+graphics card, etc) and the contents of their disks. Transferring virtual
+machines either to migrate them between hosts or to distribute them to users is
+an important workflow that QEMU and its utilities support.
+
+Much like ISO files are used to distribute operating system installer images,
+QEMU supports disk image file formats that are more convenient for transferring
+disk images than the raw contents of a disk. In fact, disk image file formats
+offer many other features such as the ability to import/export disks from other
+hypervisors, snapshots, and instantiating new disk images from a backing file.
+
+Finally, managing disk images also involves the ability to take backups and
+restore them should it be necessary to roll back after the current disk
+contents have been lost or corrupted.
+
+## Emulated storage controllers
+
+The virtual machine accesses block devices through storage controllers. These
+are the devices that the guest talks to in order to read or write blocks. Some
+storage controllers facilitate access to multiple block devices, such as a SCSI
+Host Bus Adapter that provides access to many SCSI disks.
+
+Storage controllers vary in their features, performance, and guest operating
+system support. They expose a storage interface such as virtio-blk, NVMe, or
+SCSI. Virtual machines program storage controller registers to transfer data
+between memory buffers in RAM and block devices. Modern storage controllers
+support multiple request queues so that I/O can processed in parallel at high
+rates.
+
+The most common storage controllers in QEMU are virtio-blk, virtio-scsi, AHCI
+(SATA), IDE for legacy systems, and SD Card controllers on embedded or smaller
+boards.
+
+## Disk image file formats
+
+Disk image file formats handle the layout of blocks within a host file or
+device. The simplest format is the raw format where each block is located at
+its Logical Block Address (LBA) in the host file. This simple scheme does not
+offer much in the way of features.
+
+QEMU's native disk image format is QCOW2 and it offers a number of features:
+* Compactness - the host file grows as blocks are written so a sparse disk image can be much smaller than the virtual disk size.
+* Backing files - disk images can be based on a parent image so that a master image can be shared by virtual machines.
+* Snapshots - the state of the disk image can be saved and later reverted.
+* Compression - block compression reduces the image size.
+* Encryption - the disk image can be encrypted to protect data at rest.
+* Dirty bitmaps - backup applications can track changed blocks so that efficient incremental backups are possible.
+
+A number of other disk image file formats are available for importing/exporting
+disk images for use with other software including VMware and Hyper-V.
+
+## Block jobs
+
+Block jobs are background operations that manipulate disk images:
+* Commit - merging backing files to shorten a backing file chain.
+* Backup - copying out a point-in-time snapshot of a disk.
+* Mirror - copying an image to a new destination while the virtual machine can still write to it.
+* Stream - populating a disk image from its backing file.
+* Create - creating new disk image files.
+
+These background operations are powerful tools for building storage migration
+and backup workflows.
+
+Some operations like mirror and stream can take a long time because they copy
+large amounts of data. Block jobs support throttling to limit the performance
+impact on virtual machines.
+
+## qemu-img and qemu-storage-daemon
+
+The [qemu-img utility](https://www.qemu.org/docs/master/interop/qemu-img.html) manipulates disk images. It can create, resize, snapshot,
+repair, and inspect disk images. It has both human-friendly and JSON output
+formats, making it suitable for manual use as well as scripting.
+
+qemu-storage-daemon exposes QEMU's storage functionality in a server process
+without running a virtual machine. It can export disk images over the Network
+Block Device (NBD) protocol as well as run block jobs and other storage
+commands. This makes qemu-storage-daemon useful for applications that want to
+automate disk image manipulation.
+
+## Conclusion
+
+QEMU presents block devices to virtual machines via emulated storage
+controllers. On the host side the disk image file format, block jobs, and
+qemu-img/qemu-storage-daemon utilities provide functionality for working with
+disk images. Future blog posts will dive deeper into some of these areas and
+describe best practices for configuring storage.
new file mode 100644
@@ -0,0 +1,366 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="block-device-io.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 211.66667 105.83334"
+ height="400"
+ width="800">
+ <defs
+ id="defs2">
+ <rect
+ id="rect3368"
+ height="12.31036"
+ width="21.572843"
+ y="87.814795"
+ x="5.0839274" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart">
+ <path
+ transform="scale(0.6) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#5f9857;stroke-opacity:1;fill:#5f9857;fill-opacity:1"
+ id="path975" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1Sstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Sstart">
+ <path
+ transform="scale(0.2) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#a02e2e;stroke-width:1pt;stroke-opacity:1;fill:#a02e2e;fill-opacity:1"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path963" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="Arrow2Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#a02e2e;stroke-opacity:1;fill:#a02e2e;fill-opacity:1"
+ id="path978" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="marker1287"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path1285" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path966" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="Arrow1Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path960" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="Arrow1Lend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path954" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path978-2"
+ style="fill:#a02e2e;fill-opacity:1;fill-rule:evenodd;stroke:#a02e2e;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-maximized="1"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ units="px"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="mm"
+ inkscape:cy="200"
+ inkscape:cx="400"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-5-2-0"
+ width="14.319539"
+ height="14.319539"
+ x="151.85484"
+ y="43.375652" />
+ <rect
+ y="43.375652"
+ x="57.398544"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-5-2"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="72.115448"
+ x="8.5989037"
+ height="17.248669"
+ width="191.44061"
+ id="rect12"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.325756;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="73.802719"
+ x="10.188523"
+ height="14.319539"
+ width="14.319539"
+ id="rect837"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-3"
+ width="14.319539"
+ height="14.319539"
+ x="25.974277"
+ y="73.802719" />
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-6"
+ width="14.319539"
+ height="14.319539"
+ x="41.760025"
+ y="73.802719" />
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-7"
+ width="14.319539"
+ height="14.319539"
+ x="57.545776"
+ y="73.802719" />
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-5"
+ width="14.319539"
+ height="14.319539"
+ x="73.331528"
+ y="73.802719" />
+ <rect
+ y="73.802719"
+ x="89.117271"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-3-3"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="73.802719"
+ x="120.68877"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-7-6"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="rect837-2"
+ width="14.319539"
+ height="14.319539"
+ x="136.47447"
+ y="73.802719" />
+ <rect
+ y="73.802719"
+ x="152.26022"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-3-9"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="73.802719"
+ x="168.04596"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-6-1"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="73.802719"
+ x="183.83174"
+ height="14.319539"
+ width="14.319539"
+ id="rect837-7-2"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <ellipse
+ ry="1.3585734"
+ rx="1.4722615"
+ cy="80.826599"
+ cx="107.49885"
+ id="path926"
+ style="fill:#000000;stroke:none;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1" />
+ <ellipse
+ style="fill:#000000;stroke:none;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="path926-6"
+ cx="111.95774"
+ cy="80.826599"
+ rx="1.4722615"
+ ry="1.3585734" />
+ <ellipse
+ style="fill:#000000;stroke:none;stroke-width:0.329999;stroke-linejoin:round;stroke-opacity:1"
+ id="path926-0"
+ cx="116.41663"
+ cy="80.826599"
+ rx="1.4722615"
+ ry="1.3585734" />
+ <path
+ id="path949"
+ d="M 64.210031,52.265547 V 81.761421"
+ style="fill:none;fill-rule:evenodd;stroke:#a02e2e;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#5f9857;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart)"
+ d="M 159.26959,53.777385 V 83.273259"
+ id="path949-6" />
+ <text
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.2889px;line-height:125%;font-family:FreeSans;-inkscape-font-specification:FreeSans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect3368);fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+ id="text3366"
+ xml:space="preserve"><tspan
+ style="visibility:hidden"
+ x="5.0839844"
+ y="110.11303"><tspan
+ dx="0 6.89571 7.1547813 3.1364193 5.8814716 3.5884151 3.1364193 5.8814735 3.5884132 6.9177589 3.5884171 4.4262619 6.9453201 5.8814697"
+ style="fill:none">This is a test</tspan></tspan></text>
+ <text
+ id="text3386"
+ y="99.211525"
+ x="13.573332"
+ style="font-size:9.87778px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:9.87778px;fill:#000000;stroke-width:0.264583px"
+ y="99.211525"
+ x="13.573332"
+ id="tspan3384"
+ sodipodi:role="line">0 1 2 3 4 5 </tspan></text>
+ <text
+ id="text3390"
+ y="98.842552"
+ x="113.57343"
+ style="font-size:7.7611px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';fill:#000000;stroke-width:0.264583px"
+ y="98.842552"
+ x="113.57343"
+ id="tspan3388"
+ sodipodi:role="line">Logical Block Address</tspan></text>
+ <text
+ id="text3394"
+ y="36.814297"
+ x="51.45319"
+ style="font-size:9.87778px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:9.87778px;fill:#000000;stroke-width:0.264583px"
+ y="36.814297"
+ x="51.45319"
+ id="tspan3392"
+ sodipodi:role="line">Write</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="145.80954"
+ y="36.814297"
+ id="text3394-9"><tspan
+ sodipodi:role="line"
+ id="tspan3392-4"
+ x="145.80954"
+ y="36.814297"
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px">Read</tspan></text>
+ <text
+ id="text3428"
+ y="18.429882"
+ x="40.263172"
+ style="font-size:16.9333px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:16.9333px;fill:#000000;stroke-width:0.264583px"
+ y="18.429882"
+ x="40.263172"
+ id="tspan3426"
+ sodipodi:role="line">Block Device I/O</tspan></text>
+ </g>
+</svg>
new file mode 100644
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="516.87274"
+ height="455.98318"
+ viewBox="0 0 136.75591 120.64555"
+ version="1.1"
+ id="svg8"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="2020-09-07-lifecycle.svg">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path879"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path882"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 41.270551 : 1"
+ inkscape:vp_y="0 : 999.99999 : 0"
+ inkscape:vp_z="2.7936278 : 120.44608 : 1"
+ inkscape:persp3d-origin="79.374998 : 14.812218 : 1"
+ id="perspective833" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mend-3"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path882-6" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mend-5"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path882-3" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mstart-5"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path879-6" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mend-1"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path882-2" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart-5-0"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path879-6-2"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend-1-7"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path882-2-5"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart-5-2"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path879-6-28"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow2Mstart-5-0-9"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path879-6-2-7" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ fit-margin-bottom="12"
+ fit-margin-right="12"
+ fit-margin-left="12"
+ fit-margin-top="12"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="360.2843"
+ inkscape:cy="268.52474"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ inkscape:document-rotation="0"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-10.508113,-3.0361619)"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:0.329999;stroke-linejoin:round"
+ id="rect851"
+ width="20.53208"
+ height="20.53208"
+ x="69.127571"
+ y="52.292423" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-5)"
+ d="m 93.304199,66.781605 c 7.939251,8.629964 30.888561,19.336224 50.433181,0"
+ id="path853-7-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path853-70"
+ d="M 79.412848,76.366728 V 107.04289"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend-1)"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:9.87778px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="23.73085"
+ y="42.474926"
+ id="text1501"><tspan
+ sodipodi:role="line"
+ id="tspan1499"
+ x="23.73085"
+ y="42.474926"
+ style="font-size:9.87778px;fill:#000000;stroke-width:0.264583px">Import</tspan></text>
+ <text
+ id="text1501-9"
+ y="88.298172"
+ x="23.458694"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px"
+ y="88.298172"
+ x="23.458694"
+ sodipodi:role="line"
+ id="tspan1521">Export</tspan></text>
+ <text
+ id="text1501-6"
+ y="43.217697"
+ x="101.97588"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px"
+ y="43.217697"
+ x="101.97588"
+ id="tspan1499-0"
+ sodipodi:role="line">Backup</tspan></text>
+ <text
+ id="text1501-62"
+ y="88.846954"
+ x="101.04363"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px"
+ y="88.846954"
+ x="101.04363"
+ id="tspan1499-6"
+ sodipodi:role="line">Restore</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="61.443283"
+ y="118.31977"
+ id="text1501-62-1"><tspan
+ sodipodi:role="line"
+ id="tspan1499-6-8"
+ x="61.443283"
+ y="118.31977"
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px">Migrate</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:9.87777px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="64.39402"
+ y="13.674611"
+ id="text1501-62-7"><tspan
+ sodipodi:role="line"
+ id="tspan1499-6-9"
+ x="64.39402"
+ y="13.674611"
+ style="font-size:9.87777px;fill:#000000;stroke-width:0.264583px">Create</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ id="path853-7-9-3"
+ d="m 142.86514,59.598947 c -7.93926,-8.629964 -30.88858,-19.336225 -50.433199,0"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-5-0)" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend-1-7)"
+ d="m 79.894559,18.186064 v 29.58986"
+ id="path853-70-9" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path853-7-9-36"
+ d="m 14.907024,66.297581 c 7.939251,8.629963 30.888562,19.336224 50.433176,0"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-5-2)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart-5-0-9)"
+ d="m 64.467963,59.114923 c -7.939257,-8.629965 -30.888578,-19.336226 -50.433197,0"
+ id="path853-7-9-3-1"
+ sodipodi:nodetypes="cc" />
+ <text
+ id="text933"
+ y="60.612328"
+ x="79.368111"
+ style="font-style:italic;font-size:5.64444px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';letter-spacing:0px;word-spacing:0px;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:5.64444px;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583px"
+ y="60.612328"
+ x="79.368111"
+ id="tspan931"
+ sodipodi:role="line">Disk</tspan><tspan
+ id="tspan935"
+ style="font-size:5.64444px;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583px"
+ y="67.667877"
+ x="79.368111"
+ sodipodi:role="line">Image</tspan></text>
+ </g>
+</svg>
I want to kick of a series of posts about storage. The first post covers high-level concepts, features, and utilities in QEMU. Later posts will discuss configuration details, architecture, and performance. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- _posts/2020-09-07-qemu-storage-overview.md | 122 +++++++ screenshots/2020-09-07-block-device-io.svg | 366 +++++++++++++++++++++ screenshots/2020-09-07-lifecycle.svg | 328 ++++++++++++++++++ 3 files changed, 816 insertions(+) create mode 100644 _posts/2020-09-07-qemu-storage-overview.md create mode 100644 screenshots/2020-09-07-block-device-io.svg create mode 100644 screenshots/2020-09-07-lifecycle.svg