Message ID | 20200907150421.8106-1-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
Series | [qemu-web] Add QEMU storage overview blog post | expand |
On Mon, Sep 07, 2020 at 04:04:21PM +0100, Stefan Hajnoczi wrote: > 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 Ping? Thomas, you would you be able to merge this? > diff --git a/_posts/2020-09-07-qemu-storage-overview.md b/_posts/2020-09-07-qemu-storage-overview.md > new file mode 100644 > index 0000000..79f60c4 > --- /dev/null > +++ b/_posts/2020-09-07-qemu-storage-overview.md > @@ -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. > diff --git a/screenshots/2020-09-07-block-device-io.svg b/screenshots/2020-09-07-block-device-io.svg > new file mode 100644 > index 0000000..b1effcc > --- /dev/null > +++ b/screenshots/2020-09-07-block-device-io.svg > @@ -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> > diff --git a/screenshots/2020-09-07-lifecycle.svg b/screenshots/2020-09-07-lifecycle.svg > new file mode 100644 > index 0000000..1c10668 > --- /dev/null > +++ b/screenshots/2020-09-07-lifecycle.svg > @@ -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> > -- > 2.26.2 >
On 14/09/20 12:35, Stefan Hajnoczi wrote: >> >> 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 > Ping? Thomas, you would you be able to merge this? > I have pushed this now. Thanks, Paolo
On 14/09/2020 12.35, Stefan Hajnoczi wrote: > On Mon, Sep 07, 2020 at 04:04:21PM +0100, Stefan Hajnoczi wrote: >> 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 > > Ping? Thomas, you would you be able to merge this? Sorry, your mail successfully hid in my overcrowded inbox :-( ... thanks to Paolo for pushing it! Thomas
diff --git a/_posts/2020-09-07-qemu-storage-overview.md b/_posts/2020-09-07-qemu-storage-overview.md new file mode 100644 index 0000000..79f60c4 --- /dev/null +++ b/_posts/2020-09-07-qemu-storage-overview.md @@ -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. diff --git a/screenshots/2020-09-07-block-device-io.svg b/screenshots/2020-09-07-block-device-io.svg new file mode 100644 index 0000000..b1effcc --- /dev/null +++ b/screenshots/2020-09-07-block-device-io.svg @@ -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> diff --git a/screenshots/2020-09-07-lifecycle.svg b/screenshots/2020-09-07-lifecycle.svg new file mode 100644 index 0000000..1c10668 --- /dev/null +++ b/screenshots/2020-09-07-lifecycle.svg @@ -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