qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [qemu-web PATCH] Add QEMU storage overview blog post


From: Stefan Hajnoczi
Subject: Re: [qemu-web PATCH] Add QEMU storage overview blog post
Date: Mon, 14 Sep 2020 11:35:07 +0100

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
> 

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]