* [qemu-web PATCH] Add QEMU storage overview blog post
@ 2020-09-07 15:04 Stefan Hajnoczi
2020-09-14 10:35 ` Stefan Hajnoczi
0 siblings, 1 reply; 4+ messages in thread
From: Stefan Hajnoczi @ 2020-09-07 15:04 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Thomas Huth, qemu-block, afrosi, mreitz,
Stefan Hajnoczi, Paolo Bonzini
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
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 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.
+
+
+
+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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [qemu-web PATCH] Add QEMU storage overview blog post
2020-09-07 15:04 [qemu-web PATCH] Add QEMU storage overview blog post Stefan Hajnoczi
@ 2020-09-14 10:35 ` Stefan Hajnoczi
2020-09-14 10:46 ` Paolo Bonzini
2020-09-14 10:53 ` Thomas Huth
0 siblings, 2 replies; 4+ messages in thread
From: Stefan Hajnoczi @ 2020-09-14 10:35 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: Kevin Wolf, Thomas Huth, qemu-block, afrosi, qemu-devel, mreitz,
Paolo Bonzini
[-- Attachment #1: Type: text/plain, Size: 39266 bytes --]
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 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.
> +
> +
> +
> +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
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [qemu-web PATCH] Add QEMU storage overview blog post
2020-09-14 10:35 ` Stefan Hajnoczi
@ 2020-09-14 10:46 ` Paolo Bonzini
2020-09-14 10:53 ` Thomas Huth
1 sibling, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2020-09-14 10:46 UTC (permalink / raw)
To: Stefan Hajnoczi, Stefan Hajnoczi
Cc: Kevin Wolf, Thomas Huth, qemu-block, afrosi, qemu-devel, mreitz
[-- Attachment #1.1: Type: text/plain, Size: 665 bytes --]
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
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [qemu-web PATCH] Add QEMU storage overview blog post
2020-09-14 10:35 ` Stefan Hajnoczi
2020-09-14 10:46 ` Paolo Bonzini
@ 2020-09-14 10:53 ` Thomas Huth
1 sibling, 0 replies; 4+ messages in thread
From: Thomas Huth @ 2020-09-14 10:53 UTC (permalink / raw)
To: Stefan Hajnoczi, Stefan Hajnoczi
Cc: Kevin Wolf, qemu-block, afrosi, qemu-devel, mreitz, Paolo Bonzini
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
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-09-14 10:54 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-07 15:04 [qemu-web PATCH] Add QEMU storage overview blog post Stefan Hajnoczi
2020-09-14 10:35 ` Stefan Hajnoczi
2020-09-14 10:46 ` Paolo Bonzini
2020-09-14 10:53 ` Thomas Huth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).