--- /dev/null
+/bindings
+/history
+/1000-loopback-mounting.d/fedora-29.img
+/2000-xz-compressed.d/Fedora-Cloud-Base-29-1.2.x86_64.raw.xz
+/3500-partitioning.d/boot.img
+/3500-partitioning.d/.root.img
+/3500-partitioning.d/root.img
+/3500-partitioning.d/swap.img
+/nbdview/error?
+/nbdview/log?
+/nbdview/sock?
\ No newline at end of file
--- /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>
+
+<div id="titlepage">
+ <p class="title">
+ Better loopback mounts with NBD — <br/>
+ <small>Take your loopback mounts to the next level with nbdkit</small>
+ </p>
+ <p><author>
+ Richard W.M. Jones <br/>
+ <small>rjones @ redhat.com</small>
+ </author></p>
+ <p>
+ <b>Loopback devices</b> let you turn a raw file into a device.
+ <b>Loopback mounts</b> let you mount filesystems from a raw file.
+ <b>Network Block Device</b> with the <b>nbdkit</b> server takes
+ this concept to the next level, elegantly solving simple problems
+ like how to mount filesystems from a compressed file, but as we
+ shall see in this talk offering far, far more ...
+ </p>
+</div>
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'sudo losetup --list'
+remember 'ls -lh fedora-29.img'
+remember 'sudo losetup /dev/loop0 fedora-29.img'
+remember 'sudo kpartx -av /dev/loop0'
+remember 'sudo mount /dev/mapper/loop0p4 /tmp/mnt'
+remember 'ls -l /tmp/mnt'
+
+echo "Loopback mounting"
+
+./restore
+pushd 1000-loopback-mounting.d >/dev/null
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls -lh Fedora-Cloud-Base-29-1.2.x86_64.raw.xz'
+remember 'nbdkit xz Fedora-Cloud-Base-29-1.2.x86_64.raw.xz'
+remember 'ps ax | grep nbdkit'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'sudo mount /dev/nbd0p1 /tmp/mnt'
+remember 'ls -l /tmp/mnt'
+
+echo "XZ compressed image"
+
+./restore
+pushd 2000-xz-compressed.d >/dev/null
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls -lh Fedora-Cloud-Base-29-1.2.x86_64.raw.xz'
+remember 'nbdkit --filter=cow xz Fedora-Cloud-Base-29-1.2.x86_64.raw.xz'
+remember 'ps ax | grep nbdkit'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'sudo mount /dev/nbd0p1 /tmp/mnt'
+remember 'ls -l /tmp/mnt'
+remember 'sudo touch /tmp/mnt/hello-fosdem'
+
+echo "XZ with a writable filter"
+
+./restore
+pushd 2000-xz-compressed.d >/dev/null
+terminal
+popd >/dev/null
--- /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>nbdkit — plugins</h1>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;">sh</code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;">xz</code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — plugins</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;"><b>file</b></code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;"><b>memory</b></code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;"><b>partitioning</b></code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;"><b>sh</b></code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;"><b>vddk</b></code>
+ <code style="position: absolute; top: 290px; left: 600px;"><b>xz</b></code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — plugins</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;"><b>lua</b></code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;"><b>ocaml</b></code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;"><b>perl</b></code>
+ <code style="position: absolute; top: 340px; left: 280px;"><b>python</b></code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;"><b>ruby</b></code>
+ <code style="position: absolute; top: 90px; left: 700px;"><b>sh</b></code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;"><b>tcl</b></code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;">xz</code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — filters</h1>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<p></p>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 2px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;
+ transform: translate(-100px,-50px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;">sh</code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;">xz</code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — filters</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;"><b>cow</b></code>
+ <code style="position: absolute; top: 140px; left: 10px;"><b>delay</b></code>
+ <code style="position: absolute; top: 180px; left: 100px;"><b>error</b></code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;"><b>log</b></code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<p></p>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 2px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;
+ transform: translate(-100px,-50px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;">sh</code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;">xz</code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — layers</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 80px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;"><b>cow</b></code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 250px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;"><b>delay</b></code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 420px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;"><b>partition</b></code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #ccf; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 595px; left: 32px;
+ width: 800px; height: 400px;
+ transform: translate(-100px,-50px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;">sh</code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;"><b>xz</b></code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
--- /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>nbdkit — layers</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 80px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;"><b>cow</b></code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 250px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;"><b>delay</b></code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #cfc; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 420px; left: 32px;
+ width: 800px; height: 220px;
+ transform: translate(-100px,-25px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;"><b>partition</b></code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
+
+<div style="background: #ccf; border: 2px solid rgb(204,0,0);
+ position: absolute; top: 595px; left: 32px;
+ width: 800px; height: 400px;
+ transform: translate(-100px,-50px) scale(0.75,0.75);">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;">data</code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;">file</code>
+ <code style="position: absolute; top: 150px; left: 10px;">floppy</code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;">iso</code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;">memory</code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;">sh</code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;"><b>xz</b></code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
+
+<pre
+style="position: absolute;
+ top: 80px;
+ left: 650px;"
+>nbdkit --filter=cow \</pre>
+<pre
+style="position: absolute;
+ top: 250px;
+ left: 650px;"
+> --filter=delay \</pre>
+<pre
+style="position: absolute;
+ top: 420px;
+ left: 650px;"
+> --filter=partition \</pre>
+<pre
+style="position: absolute;
+ top: 595px;
+ left: 650px;"
+> xz file.xz \<br/>
+ partition=1 \<br/>
+ rdelay=20ms</pre>
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls'
+remember 'LD_LIBRARY_PATH=~/tmp/vddk/vmware-vix-disklib-distrib/lib64 nbdkit vddk file=$PWD/mystery.vmdk'
+remember 'ps ax | grep nbdkit'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'ls -l /dev/nbd0*'
+remember 'sudo mount /dev/nbd0p2 /tmp/mnt'
+remember 'ls -l /tmp/mnt'
+
+echo "VMware (VDDK)"
+
+./restore
+pushd 3000-vmware.d >/dev/null
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls'
+remember 'nbdkit partitioning boot.img mbr-id=0x82 swap.img mbr-id=0x83 root.img'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'ls -l /dev/nbd0*'
+remember 'sudo fdisk -l /dev/nbd0'
+remember 'sudo mount /dev/nbd0p3 /tmp/mnt'
+remember 'ls -l /tmp/mnt'
+remember 'cat /tmp/mnt/etc/fedora-release'
+remember 'touch /tmp/mnt/hello-fosdem'
+
+echo "Create partitions"
+
+./restore
+pushd 3500-partitioning.d >/dev/null
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'nbdkit memory size=$(( 2**63 - 1 ))'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'sudo fdisk /dev/nbd0'
+remember 'sudo gdisk /dev/nbd0'
+remember 'sudo mkfs.btrfs -K /dev/nbd0p1'
+remember 'sudo mount /dev/nbd0p1 /tmp/mnt'
+remember 'df -h /tmp/mnt'
+
+echo "Giant disks"
+
+./restore
+terminal
--- /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>Useful nbdkit plugins and filters for testing filesystems</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #ccf; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 400px;">
+ <code style="position: absolute; top: 1px; left: 10px;">curl</code>
+ <code style="position: absolute; top: 50px; left: 20px;"><b>data</b></code>
+ <code style="position: absolute; top: 100px; left: 10px;">ext2</code>
+ <code style="position: absolute; top: 120px; left: 140px;"><b>file</b></code>
+ <code style="position: absolute; top: 150px; left: 10px;"><b>floppy</b></code>
+ <code style="position: absolute; top: 200px; left: 20px;">guestfs</code>
+ <code style="position: absolute; top: 250px; left: 10px;">gzip</code>
+ <code style="position: absolute; top: 280px; left: 150px;"><b>iso</b></code>
+ <code style="position: absolute; top: 350px; left: 10px;">libvirt</code>
+
+ <code style="position: absolute; top: 5px; left: 340px;">lua</code>
+ <code style="position: absolute; top: 55px; left: 380px;"><b>memory</b></code>
+ <code style="position: absolute; top: 105px; left: 340px;">nbd</code>
+ <code style="position: absolute; top: 125px; left: 450px;">null</code>
+ <code style="position: absolute; top: 155px; left: 340px;">ocaml</code>
+ <code style="position: absolute; top: 185px; left: 160px;">partitioning</code>
+ <code style="position: absolute; top: 240px; left: 380px;">pattern</code>
+ <code style="position: absolute; top: 300px; left: 320px;">perl</code>
+ <code style="position: absolute; top: 340px; left: 280px;">python</code>
+
+ <code style="position: absolute; top: 10px; left: 600px;">random</code>
+ <code style="position: absolute; top: 60px; left: 600px;">ruby</code>
+ <code style="position: absolute; top: 90px; left: 700px;"><b>sh</b></code>
+ <code style="position: absolute; top: 130px; left: 590px;">split</code>
+ <code style="position: absolute; top: 180px; left: 600px;">streaming</code>
+ <code style="position: absolute; top: 190px; left: 450px;">tar</code>
+ <code style="position: absolute; top: 230px; left: 580px;">tcl</code>
+ <code style="position: absolute; top: 260px; left: 650px;">vddk</code>
+ <code style="position: absolute; top: 290px; left: 600px;">xz</code>
+ <code style="position: absolute; top: 320px; left: 600px;">zero</code>
+</div>
+
+<p></p>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;"><b>delay</b></code>
+ <code style="position: absolute; top: 180px; left: 100px;"><b>error</b></code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;"><b>log</b></code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
--- /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>Useful nbdkit filters: the delay filter</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<pre>
+nbdkit --filter=delay <i>[...]</i> rdelay=1
+
+nbdkit --filter=delay <i>[...]</i> rdelay=100ms wdelay=50ms
+</pre>
+
+<ul>
+<li> Injects delays into requests.
+<li> Delays can be specified in seconds or milliseconds.
+<li> <code>rdelay</code>: read operations
+<li> <code>wdelay</code>: write or zero operations
+<li> Requests handled in parallel are delayed in parallel, as expected.
+</ul>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;"><b>delay</b></code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
--- /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>Useful nbdkit filters: the error filter</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<pre>
+nbdkit --filter=error <i>[...]</i> error=EIO error-rate=10%
+
+nbdkit --filter=error <i>[...]</i> error-rate=100% error-file=/tmp/inject
+</pre>
+
+<ul>
+<li> Errors can be injected randomly with a uniform distribution.
+<li> More usefully you can trigger errors from the presence of
+an error file.
+<li> NBD protocol only supports: <code>EPERM</code>, <code>EIO</code>,
+<code>ENOMEM</code>, <code>EINVAL</code>, <code>ENOSPC</code> or
+<code>ESHUTDOWN</code>.
+</ul>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;"><b>error</b></code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;">log</code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
--- /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>Useful nbdkit filters: the log filter</h1>
+
+<style>
+b {
+ border: 1px solid rgb(204,0,0);
+ background: #eef;
+ padding: 5px;
+ border-radius: 15px;
+}
+</style>
+
+<pre>
+nbdkit --filter=log <i>[...]</i> logfile=/tmp/log
+</pre>
+
+<pre>
+2018-11-16 10:55:19.411474 connection=2 Connect size=0x6400000 write=1 flush=0 rotational=0 trim=1 zero=1 fua=0
+2018-11-16 10:55:19.478631 connection=2 Read id=1 offset=0x0 count=0x200 ...
+2018-11-16 10:55:19.478664 connection=2 ...Read id=1 return=0 (Success)
+2018-11-16 10:55:20.844193 connection=2 Read id=2 offset=0x0 count=0x1000 ...
+2018-11-16 10:55:20.844234 connection=2 ...Read id=2 return=0 (Success)
+2018-11-16 10:55:20.844767 connection=2 Read id=3 offset=0x1000 count=0x1000 ...
+2018-11-16 10:55:20.844823 connection=2 ...Read id=3 return=0 (Success)
+2018-11-16 10:55:21.446872 connection=2 Read id=4 offset=0x63f0000 count=0x1000 ...
+2018-11-16 10:55:21.446930 connection=2 ...Read id=4 return=0 (Success)
+2018-11-16 10:55:21.447175 connection=2 Read id=5 offset=0x63fe000 count=0x1000 ...
+2018-11-16 10:55:21.447197 connection=2 ...Read id=5 return=0 (Success)
+</pre>
+
+<!-- note: div must have position: relative so child elements position
+ is correct -->
+<div style="background: #cfc; border: 1px solid rgb(204,0,0);
+ position:relative;
+ width: 800px; height: 220px;">
+ <code style="position: absolute; top: 1px; left: 50px;">blocksize</code>
+ <code style="position: absolute; top: 50px; left: 100px;">cache</code>
+ <code style="position: absolute; top: 80px; left: 115px;">cow</code>
+ <code style="position: absolute; top: 140px; left: 10px;">delay</code>
+ <code style="position: absolute; top: 180px; left: 100px;">error</code>
+
+ <code style="position: absolute; top: 10px; left: 400px;">fua</code>
+ <code style="position: absolute; top: 60px; left: 600px;"><b>log</b></code>
+ <code style="position: absolute; top: 90px; left: 250px;">nozero</code>
+ <code style="position: absolute; top: 130px; left: 530px;">offset</code>
+ <code style="position: absolute; top: 150px; left: 280px;">partition</code>
+ <code style="position: absolute; top: 180px; left: 480px;">truncate</code>
+</div>
--- /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>Useful nbdkit filters: the log filter</h1>
+
+<pre>
+nbdkit --filter=log <i>[...]</i> logfile=/tmp/log
+</pre>
+
+<!--<img src="4900-testing-log-2.svg" width="900" />-->
+<img src="4900-testing-log-2.svg.png" />
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="172.92917mm"
+ height="110.54569mm"
+ viewBox="0 0 172.92917 110.54569"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="4900-testing-log-2.svg">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4593"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5365"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5363"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path4596"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="350.60854"
+ inkscape:cy="252.1738"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="2048"
+ inkscape:window-height="1068"
+ inkscape:window-x="0"
+ inkscape:window-y="41"
+ inkscape:window-maximized="1"
+ fit-margin-top="10"
+ fit-margin-left="10"
+ fit-margin-right="10"
+ fit-margin-bottom="10" />
+ <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
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-4.2308027,-2.1556482)">
+ <rect
+ style="fill:#f2c4c7;fill-opacity:1;stroke:#000000;stroke-width:0.26458332"
+ id="rect4518"
+ width="49.703869"
+ height="52.349705"
+ x="14.363094"
+ y="13.328869" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:5.64444447px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="16.593153"
+ y="22.475891"
+ id="text4522"><tspan
+ sodipodi:role="line"
+ id="tspan4520"
+ x="16.593153"
+ y="22.475891"
+ style="font-size:5.64444447px;stroke-width:0.26458332">nbdkit</tspan><tspan
+ sodipodi:role="line"
+ x="16.593153"
+ y="29.531446"
+ style="font-size:5.64444447px;stroke-width:0.26458332"
+ id="tspan4524">--filter=log</tspan><tspan
+ sodipodi:role="line"
+ x="16.593153"
+ y="36.587002"
+ style="font-size:5.64444447px;stroke-width:0.26458332"
+ id="tspan4528">...</tspan><tspan
+ sodipodi:role="line"
+ x="16.593153"
+ y="43.642559"
+ style="font-size:5.64444447px;stroke-width:0.26458332"
+ id="tspan4526">logfile=/tmp/log</tspan></text>
+ <g
+ id="g4559"
+ transform="translate(2.2678572,13.266966)">
+ <ellipse
+ ry="5.7641373"
+ rx="18.142857"
+ cy="83.537949"
+ cx="88.257446"
+ id="path4542"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.26458332" />
+ <ellipse
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.26458332"
+ id="ellipse4546"
+ cx="88.257446"
+ cy="80.892113"
+ rx="18.142857"
+ ry="5.7641373" />
+ <ellipse
+ ry="5.7641373"
+ rx="18.142857"
+ cy="78.246277"
+ cx="88.257446"
+ id="ellipse4548"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.26458332" />
+ <ellipse
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.26458332"
+ id="ellipse4550"
+ cx="88.257446"
+ cy="75.600441"
+ rx="18.142857"
+ ry="5.7641373" />
+ <ellipse
+ ry="5.7641373"
+ rx="18.142857"
+ cy="72.954605"
+ cx="88.257446"
+ id="ellipse4552"
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.26458332" />
+ </g>
+ <image
+ y="12.155648"
+ x="123.39033"
+ id="image4588"
+ xlink:href="data:image/png;base64,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
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIZuIjtwAABQlJREFUJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhC
+BQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCI
+JVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhC
+BQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCI
+JVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhC
+BQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCI
+JVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhC
+BQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCI
+JVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhC
+BQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCI
+JVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQA
+gFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFhCBQCIJVQAgFjt0AMA8DMxGg09wbD6fugJfpyj
+/vt6R79/KyoAQCyhAgDEEioAQCz3qABwNH5q92gsup/I39c7CZUvvvjiXZwWAFgwR37p58svvzzq
+UwIAC+rIV1Q+++yzoz4lALCgjmxFRaAAAEftSFZUPv3009re3j6KUwEAvObxZAAgllABAGIJFQAg
+llABAGIJFQAgllABAGIJFQAgllABAGIJFQAgllABAGIJFQAgllABAGIJFQAgllABAGIJFQAgllAB
+AGIJFQAgllABAGIJFQAgllABAGK1P/SJjz5afZ9zAAALaj6fV9d1b/1cU1XV9/17HQgA4F+Zz+dV
+9TJU/v73B4MOAwDwfVtbD6vqZah899139de//m3QgQAAqqru339Qf/vbiy4ZVVV9/vnn/Xjc1Nra
+b2plZeVIf7HxeHyk5wMAcvzQvSU/Rt/31XVddV1Xjx49qjt37tTz58/rT3/602j06os+//xzN6oA
+AO9d3/c1n88Pvf74xz+Oqqr+Hwj3250mkeTYAAAAAElFTkSuQmCC
+"
+ preserveAspectRatio="none"
+ height="71.816971"
+ width="43.769638" />
+ <path
+ style="fill:none;stroke:#333333;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 62.933034,42.433036 c 0,0 4.481099,1.486883 8.228829,4.153278 3.74773,2.666395 6.76209,6.512303 8.591112,9.642851 3.678143,6.295498 6.425596,25.513394 6.425596,25.513394"
+ id="path4591"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <path
+ sodipodi:nodetypes="cssc"
+ inkscape:connector-curvature="0"
+ id="path5361"
+ d="m 126.25462,38.861163 c 0,0 -15.19673,4.66188 -18.94446,7.32828 -3.74775,2.66639 -7.423585,8.0998 -9.252619,11.23035 -3.67816,6.295489 -5.235005,24.322764 -5.235005,24.322764"
+ style="fill:none;stroke:#333333;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart)" />
+ </g>
+</svg>
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'nbdkit --filter=log --filter=delay memory size=64M logfile=/tmp/log rdelay=50ms wdelay=50ms'
+remember './nbdview.tcl /tmp/log 67108864 &'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'sudo fdisk /dev/nbd0'
+remember 'sudo mkfs -t ext4 /dev/nbd0p1'
+remember 'sudo mount /dev/nbd0p1 /tmp/mnt'
+remember 'sudo chown rjones /tmp/mnt/'
+
+echo "Visualising a single filesystem"
+
+./restore
+pushd nbdview >/dev/null
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+xfce4-terminal --disable-server \
+ -x ./5000-single-fs-next
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'i=1; rm -f sock$i; nbdkit -U sock$i --filter=error --filter=log --filter=delay memory size=64M logfile=log$i error-rate=100% error-file=error$i rdelay=50ms wdelay=50ms'
+remember './nbdraid.tcl 5 67108864 log%s error%s &'
+remember 'i=1; sudo nbd-client -unix sock$i -b 512 /dev/nbd$((i-1))'
+remember 'sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/nbd{0,1,2,3} --spare-devices=1 /dev/nbd4'
+remember 'sudo fdisk /dev/md0'
+remember 'sudo mkfs -t ext4 /dev/md0p1'
+remember 'sudo mount /dev/md0p1 /tmp/mnt'
+remember 'sudo chown rjones /tmp/mnt/'
+
+echo "Visualising RAID"
+
+./restore
+pushd nbdview >/dev/null
+rm -f sock? error? log?
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+xfce4-terminal --disable-server \
+ -x ./5500-raid-next
--- /dev/null
+# -*- shell-script -*-
+
+# Colour ls.
+if [ -f /etc/profile.d/colorls.sh ]; then . /etc/profile.d/colorls.sh; fi
+
+# Fancy prompt colours (see
+# https://wiki.archlinux.org/index.php/Color_Bash_Prompt)
+promptcol='\e[0;32m' ;# colour for the prompt
+commandcol='\e[1;31m' ;# colour for the typed command
+outputcol='\e[0m' ;# colour for command output
+
+export PS1="\n\[$promptcol\]\$ \[$commandcol\]"
+
+trap 'echo -ne "$outputcol"' DEBUG
+
+# Load key bindings (if any).
+bind -f $talkdir/bindings
--- /dev/null
+# -*- shell-script -*-
+# This creates some standard functions. See also $talkdir/bashrc
+# which runs in the same bash context as the terminal.
+
+# Place any local environment variables and settings in "local".
+if [ -f local ]; then source local; fi
+
+# Environment variables.
+export HISTFILE=$talkdir/history
+export PATH=$talkdir:$PATH
+export EDITOR="emacs -nw"
+
+# Ditch libvirt for stability :-(
+export LIBGUESTFS_BACKEND=direct
+
+# remember <command> <args ...>
+#
+# This function does two things: (1) It adds the command and arguments
+# to the shell history, so that commands can be recalled using up
+# arrow or reverse search. (2) It makes a function key recall the
+# command. The first command is assigned to F2, the second to F3 and
+# so forth.
+
+rm -f $HISTFILE
+touch $HISTFILE
+rm -f $talkdir/bindings
+touch bindings
+
+fnum=2
+keys=(- OP OQ OR OS '[15~' '[17~' '[18~' '[19~' '[20~' '[21~')
+
+remember ()
+{
+ echo "$@" >> $HISTFILE
+ echo \"\\e${keys[$fnum]}\":\"\\C-k \\C-u"$@"\" >> $talkdir/bindings
+ ((fnum++))
+}
+
+terminal ()
+{
+ chmod -w $HISTFILE
+ /bin/bash --rcfile $talkdir/bashrc "$@"
+}
--- /dev/null
+#!/bin/bash -
+# Unmount everything.
+
+sudo umount /tmp/mnt >&/dev/null
+
+sudo mdadm --stop /dev/md0 >&/dev/null
+
+sudo nbd-client -d /dev/nbd0 >&/dev/null
+sudo nbd-client -d /dev/nbd1 >&/dev/null
+sudo nbd-client -d /dev/nbd2 >&/dev/null
+sudo nbd-client -d /dev/nbd3 >&/dev/null
+sudo nbd-client -d /dev/nbd4 >&/dev/null
+
+sudo kpartx -d /dev/loop0 >&/dev/null
+sudo losetup -d /dev/loop0 >&/dev/null
+
+killall nbdkit >&/dev/null
+killall wish >&/dev/null
+
+exit 0
--- /dev/null
+#!/bin/bash -
+# Run the talk.
+
+set -e
+
+# Avoid GNOME keyring stupidity
+export GNOME_KEYRING_CONTROL=
+export GNOME_KEYRING_PID=
+
+# No proxy.
+#unset http_proxy
+#unset https_proxy
+#unset ftp_proxy
+
+# Check the files are precreated.
+if [ ! -f 1000-loopback-mounting.d/fedora-29.img ]; then
+ pushd 1000-loopback-mounting.d
+ virt-builder fedora-29
+ popd
+fi
+
+if [ ! -f 2000-xz-compressed.d/Fedora-Cloud-Base-29-1.2.x86_64.raw.xz ]; then
+ pushd 2000-xz-compressed.d
+ wget https://download.fedoraproject.org/pub/fedora/linux/releases/29/Cloud/x86_64/images/Fedora-Cloud-Base-29-1.2.x86_64.raw.xz
+ popd
+fi
+
+if [ ! -f 3500-partitioning.d/boot.img ]; then
+ guestfish --ro -a 1000-loopback-mounting.d/fedora-29.img -i <<EOF
+download /dev/sda2 3500-partitioning.d/boot.img
+download /dev/sda3 3500-partitioning.d/swap.img
+# Save to hidden file.
+download /dev/sda4 3500-partitioning.d/.root.img
+EOF
+fi
+
+# Restore original root.img before each run.
+if ! cmp -s 3500-partitioning.d/{.root.img,root.img}; then
+ cp 3500-partitioning.d/{.root.img,root.img}
+fi
+
+# Create mountpoint.
+mkdir -p /tmp/mnt
+
+# Check nbd module is loaded.
+sudo modprobe nbd
+
+# Remove any old mounts, nbdkit processes etc.
+./restore
+
+# Run techtalk.
+#techtalk-pse
+~/d/techtalk-pse/techtalk-pse
+
+./restore
--- /dev/null
+/* Red Hat red is rgb(204,0,0). */
+
+body {
+ background: url(redhat.png) no-repeat;
+ background-position: 98% 0;
+ /* font-size: 28pt; */ /* For max */
+ font-size: 20pt; /* For 1024x768 */
+ /* font-family: liberation, helvetica; */
+ font-family: helvetica;
+}
+
+body td, body th { /* why?? */
+ font-size: 24pt;
+ padding-bottom: 8px;
+}
+
+h1 {
+ color: rgb(204,0,0);
+ /*font-size: 48px;*/
+ font-size: 40px;
+ top: 8;
+ left: 0;
+ border-bottom: 2px solid rgb(204,0,0);
+}
+
+b {
+ color: rgb(204,0,0);
+}
+
+div#titlepage {
+ margin-top: 100px;
+ text-align: center;
+}
+
+div#titlepage p.title {
+ color: rgb(204,0,0);
+ font-weight: bold;
+ font-size: 48px;
+}
+
+div#titlepage author {
+ font-size: 36px;
+}
+
+/* Code */
+pre.code {
+ margin-left: 1em;
+ background: #eee;
+}
+
+code {
+ color: rgb(204,0,0);
+}
+
+/* Bullet points */
+li {
+ padding-bottom: 16px;
+}