--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>Benchmark A: copying</h1>
+
+<style>
+table#bench {
+ width: 90%;
+}
+table#bench th {
+ vertical-align: top;
+}
+</style>
+
+<table id="bench">
+<tr>
+<th> scp </th>
+<td> <pre style="font-size: 60%">scp remote:fedora-33.img local.img</pre> </td>
+<td> </td>
+</tr>
+
+<tr>
+<th> qemu-img only </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐ ┌───────────┐
+│ fedora-33.img │───▶│ qcow2 file │───▶ qemu-img convert ────▶│ local.img │
+└───────────────┘ └────────────┘ └───────────┘
+</pre>
+</td>
+<td> </td>
+</tr>
+
+<tr>
+<th> sparsify + qemu-img </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐
+│ fedora-33.img │───▶│ qcow2 file │◀─── virt-sparsify --in-place
+└───────────────┘ └────────────┘ ┌───────────┐
+ ───▶ qemu-img convert ────▶│ local.img │
+ └───────────┘
+</pre>
+</td>
+<td> </td>
+</tr>
+
+<tr>
+<th> nbdkit + nbdcopy </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐
+│ fedora-33.img │───▶│ nbdkit cow │◀─── virt-sparsify --in-place
+└───────────────┘ └────────────┘ ┌───────────┐
+ ───▶ nbdcopy ────▶ │ local.img │
+ └───────────┘
+</pre>
+</td>
+<td> </td>
+</tr>
+</table>
--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>Benchmark A: copying — results</h1>
+
+<style>
+table#bench {
+ width: 90%;
+}
+table#bench th {
+ vertical-align: top;
+}
+table#bench td.result {
+ text-align: right;
+}
+</style>
+
+<table id="bench">
+<tr>
+<th> scp </th>
+<td> <pre style="font-size: 60%">scp remote:fedora-33.img local.img</pre> </td>
+<td class="result"> 48m40 </td>
+</tr>
+
+<tr>
+<th> qemu-img only </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐ ┌───────────┐
+│ fedora-33.img │───▶│ qcow2 file │───▶ qemu-img convert ────▶│ local.img │
+└───────────────┘ └────────────┘ └───────────┘
+</pre>
+</td>
+<td class="result"> 59m39 </td>
+</tr>
+
+<tr>
+<th> sparsify + qemu-img </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐
+│ fedora-33.img │───▶│ qcow2 file │◀─── virt-sparsify --in-place
+└───────────────┘ └────────────┘ ┌───────────┐
+ ───▶ qemu-img convert ────▶│ local.img │
+ └───────────┘
+</pre>
+</td>
+<td class="result"> 2m21 </td>
+</tr>
+
+<tr>
+<th> nbdkit + nbdcopy </th>
+<td>
+<pre style="font-size: 40%">
+┌───────────────┐ssh ┌────────────┐
+│ fedora-33.img │───▶│ nbdkit cow │◀─── virt-sparsify --in-place
+└───────────────┘ └────────────┘ ┌───────────┐
+ ───▶ nbdcopy ────▶ │ local.img │
+ └───────────┘
+</pre>
+</td>
+<td class="result"> 3m49 </td>
+</tr>
+</table>
--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>OVA files</h1>
+
+<pre>
+
+┌───guest.ova──────────┐
+│ guest.ovf │
+│ │
+│ disk1.raw (or .vmdk) │
+│ │
+└──────────────────────┘
+</pre>
+
+<pre>
+tar file = header - file - header - file ...
+</pre>
+
+<pre>
+ nbdkit tar
+┌──────────┐filter┌────────────┐
+│ test.ova │─────▶│ qcow2 file │◀─── virt-sparsify --in-place
+└──────────┘ └────────────┘ ┌───────────┐
+ ───▶ qemu-img convert ────▶│ local.img │
+ └───────────┘
+</pre>
--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>Benchmark B: local OVA file</h1>
+
+<style>
+table#bench {
+ width: 90%;
+}
+table#bench th {
+ vertical-align: top;
+}
+</style>
+
+<table id="bench">
+<tr>
+<th> cp </th>
+<td> <pre style="font-size: 60%">cp test.ova test2.ova</pre> </td>
+<td> </td>
+</tr>
+
+<tr>
+<th> tar </th>
+<td> <pre style="font-size: 60%">tar xf test.ova fedora-33.img</pre> </td>
+<td> </td>
+</tr>
+
+<tr>
+<th> nbdkit <br/>
++ sparsify <br/>
++ qemu-img </th>
+<td>
+<pre style="font-size: 40%">
+ nbdkit tar
+┌──────────┐filter┌────────────┐
+│ test.ova │─────▶│ qcow2 file │◀─── virt-sparsify --in-place
+└──────────┘ └────────────┘ ┌───────────┐
+ ───▶ qemu-img convert ────▶│ local.img │
+ └───────────┘
+</pre>
+</td>
+<td> </td>
+</tr>
+</table>
--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>Benchmark B: local OVA file — results</h1>
+
+<style>
+table#bench {
+ width: 90%;
+}
+table#bench th {
+ vertical-align: top;
+}
+table#bench td.result {
+ text-align: right;
+}
+</style>
+
+<table id="bench">
+<tr>
+<th> cp </th>
+<td> <pre style="font-size: 60%">cp test.ova test2.ova</pre> </td>
+<td class="result"> 40s </td>
+</tr>
+
+<tr>
+<th> tar </th>
+<td> <pre style="font-size: 60%">tar xf test.ova fedora-33.img</pre> </td>
+<td class="result"> 43s </td>
+</tr>
+
+<tr>
+<th> nbdkit <br/>
++ sparsify <br/>
++ qemu-img </th>
+<td>
+<pre style="font-size: 40%">
+ nbdkit tar
+┌──────────┐filter┌────────────┐
+│ test.ova │─────▶│ qcow2 file │◀─── virt-sparsify --in-place
+└──────────┘ └────────────┘ ┌───────────┐
+ ───▶ qemu-img convert ────▶│ local.img │
+ └───────────┘
+</pre>
+</td>
+<td class="result"> 7.6s </td>
+</tr>
+</table>
Benchmark A
----------------------------------------------------------------------
-Now you might think this is all a bit obscure, but how does it apply
-to copying disk images. In this first benchmark, I've compared
-copying a disk in several different ways to see which is fastest. All
-of the copying happens between two idle machines, over a slow network.
+Now you might think this is all a bit obscure, but is it any good?
+In this first benchmark, I've compared copying a disk in several
+different ways to see which is fastest. All of the copying happens
+between two idle machines, over a slow network.
The full methodology is in the background notes that accompany this
talk, which I'll link at the end.