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 <stefa...@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 >
signature.asc
Description: PGP signature