Start 2019 FOSDEM talk about NBD.
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 15 Nov 2018 11:30:09 +0000 (11:30 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Fri, 16 Nov 2018 16:03:24 +0000 (16:03 +0000)
37 files changed:
2019-fosdem/.gitignore [new file with mode: 0644]
2019-fosdem/0000-introduction.html [new file with mode: 0644]
2019-fosdem/1000-loopback-mounting.d/.stamp [new file with mode: 0644]
2019-fosdem/1000-loopback-mounting.term [new file with mode: 0755]
2019-fosdem/2000-xz-compressed.d/.stamp [new file with mode: 0644]
2019-fosdem/2000-xz-compressed.term [new file with mode: 0755]
2019-fosdem/2100-xz-writable.term [new file with mode: 0755]
2019-fosdem/2500-about-nbdkit.html [new file with mode: 0644]
2019-fosdem/2510-about-nbdkit-today.html [new file with mode: 0644]
2019-fosdem/2520-about-nbdkit-langs.html [new file with mode: 0644]
2019-fosdem/2530-about-nbdkit-filters.html [new file with mode: 0644]
2019-fosdem/2540-about-nbdkit-filters-today.html [new file with mode: 0644]
2019-fosdem/2550-about-nbdkit-layers.html [new file with mode: 0644]
2019-fosdem/2560-about-nbdkit-layers-command.html [new file with mode: 0644]
2019-fosdem/3000-vmware.d/mystery.vmdk [new file with mode: 0755]
2019-fosdem/3000-vmware.term [new file with mode: 0755]
2019-fosdem/3500-partitioning.d/.stamp [new file with mode: 0644]
2019-fosdem/3500-partitioning.term [new file with mode: 0755]
2019-fosdem/4000-giant.term [new file with mode: 0755]
2019-fosdem/4500-testing.html [new file with mode: 0644]
2019-fosdem/4600-testing-delay.html [new file with mode: 0644]
2019-fosdem/4700-testing-error.html [new file with mode: 0644]
2019-fosdem/4800-testing-log.html [new file with mode: 0644]
2019-fosdem/4900-testing-log-2.html [new file with mode: 0644]
2019-fosdem/4900-testing-log-2.svg [new file with mode: 0644]
2019-fosdem/4900-testing-log-2.svg.png [new file with mode: 0644]
2019-fosdem/5000-single-fs-next [new file with mode: 0755]
2019-fosdem/5000-single-fs.sh [new file with mode: 0755]
2019-fosdem/5500-raid-next [new file with mode: 0755]
2019-fosdem/5500-raid.sh [new file with mode: 0755]
2019-fosdem/NOTES [new file with mode: 0644]
2019-fosdem/bashrc [new file with mode: 0644]
2019-fosdem/code.js [new file with mode: 0644]
2019-fosdem/functions [new file with mode: 0644]
2019-fosdem/restore [new file with mode: 0755]
2019-fosdem/run [new file with mode: 0755]
2019-fosdem/style.css [new file with mode: 0644]

diff --git a/2019-fosdem/.gitignore b/2019-fosdem/.gitignore
new file mode 100644 (file)
index 0000000..4148a9c
--- /dev/null
@@ -0,0 +1,11 @@
+/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
diff --git a/2019-fosdem/0000-introduction.html b/2019-fosdem/0000-introduction.html
new file mode 100644 (file)
index 0000000..671e7be
--- /dev/null
@@ -0,0 +1,22 @@
+<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 &mdash; <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>
diff --git a/2019-fosdem/1000-loopback-mounting.d/.stamp b/2019-fosdem/1000-loopback-mounting.d/.stamp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2019-fosdem/1000-loopback-mounting.term b/2019-fosdem/1000-loopback-mounting.term
new file mode 100755 (executable)
index 0000000..9302414
--- /dev/null
@@ -0,0 +1,18 @@
+#!/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
diff --git a/2019-fosdem/2000-xz-compressed.d/.stamp b/2019-fosdem/2000-xz-compressed.d/.stamp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2019-fosdem/2000-xz-compressed.term b/2019-fosdem/2000-xz-compressed.term
new file mode 100755 (executable)
index 0000000..f73a32e
--- /dev/null
@@ -0,0 +1,18 @@
+#!/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
diff --git a/2019-fosdem/2100-xz-writable.term b/2019-fosdem/2100-xz-writable.term
new file mode 100755 (executable)
index 0000000..41816bb
--- /dev/null
@@ -0,0 +1,19 @@
+#!/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
diff --git a/2019-fosdem/2500-about-nbdkit.html b/2019-fosdem/2500-about-nbdkit.html
new file mode 100644 (file)
index 0000000..b403f01
--- /dev/null
@@ -0,0 +1,42 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2510-about-nbdkit-today.html b/2019-fosdem/2510-about-nbdkit-today.html
new file mode 100644 (file)
index 0000000..6bde71e
--- /dev/null
@@ -0,0 +1,51 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2520-about-nbdkit-langs.html b/2019-fosdem/2520-about-nbdkit-langs.html
new file mode 100644 (file)
index 0000000..11f6033
--- /dev/null
@@ -0,0 +1,51 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2530-about-nbdkit-filters.html b/2019-fosdem/2530-about-nbdkit-filters.html
new file mode 100644 (file)
index 0000000..36f2583
--- /dev/null
@@ -0,0 +1,64 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2540-about-nbdkit-filters-today.html b/2019-fosdem/2540-about-nbdkit-filters-today.html
new file mode 100644 (file)
index 0000000..5a508e6
--- /dev/null
@@ -0,0 +1,73 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2550-about-nbdkit-layers.html b/2019-fosdem/2550-about-nbdkit-layers.html
new file mode 100644 (file)
index 0000000..9b114f6
--- /dev/null
@@ -0,0 +1,104 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/2560-about-nbdkit-layers-command.html b/2019-fosdem/2560-about-nbdkit-layers-command.html
new file mode 100644 (file)
index 0000000..c8f477e
--- /dev/null
@@ -0,0 +1,127 @@
+<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 &mdash; 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>
diff --git a/2019-fosdem/3000-vmware.d/mystery.vmdk b/2019-fosdem/3000-vmware.d/mystery.vmdk
new file mode 100755 (executable)
index 0000000..8790aba
Binary files /dev/null and b/2019-fosdem/3000-vmware.d/mystery.vmdk differ
diff --git a/2019-fosdem/3000-vmware.term b/2019-fosdem/3000-vmware.term
new file mode 100755 (executable)
index 0000000..5524760
--- /dev/null
@@ -0,0 +1,19 @@
+#!/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
diff --git a/2019-fosdem/3500-partitioning.d/.stamp b/2019-fosdem/3500-partitioning.d/.stamp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2019-fosdem/3500-partitioning.term b/2019-fosdem/3500-partitioning.term
new file mode 100755 (executable)
index 0000000..4f216dc
--- /dev/null
@@ -0,0 +1,21 @@
+#!/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
diff --git a/2019-fosdem/4000-giant.term b/2019-fosdem/4000-giant.term
new file mode 100755 (executable)
index 0000000..b55eafb
--- /dev/null
@@ -0,0 +1,17 @@
+#!/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
diff --git a/2019-fosdem/4500-testing.html b/2019-fosdem/4500-testing.html
new file mode 100644 (file)
index 0000000..a4cd003
--- /dev/null
@@ -0,0 +1,72 @@
+<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>
diff --git a/2019-fosdem/4600-testing-delay.html b/2019-fosdem/4600-testing-delay.html
new file mode 100644 (file)
index 0000000..e0ba6c5
--- /dev/null
@@ -0,0 +1,47 @@
+<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>
diff --git a/2019-fosdem/4700-testing-error.html b/2019-fosdem/4700-testing-error.html
new file mode 100644 (file)
index 0000000..36e90f1
--- /dev/null
@@ -0,0 +1,48 @@
+<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>
diff --git a/2019-fosdem/4800-testing-log.html b/2019-fosdem/4800-testing-log.html
new file mode 100644 (file)
index 0000000..13f3f1a
--- /dev/null
@@ -0,0 +1,51 @@
+<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>
diff --git a/2019-fosdem/4900-testing-log-2.html b/2019-fosdem/4900-testing-log-2.html
new file mode 100644 (file)
index 0000000..d32a407
--- /dev/null
@@ -0,0 +1,12 @@
+<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" />
diff --git a/2019-fosdem/4900-testing-log-2.svg b/2019-fosdem/4900-testing-log-2.svg
new file mode 100644 (file)
index 0000000..bb3e6ee
--- /dev/null
@@ -0,0 +1,657 @@
+<?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>
diff --git a/2019-fosdem/4900-testing-log-2.svg.png b/2019-fosdem/4900-testing-log-2.svg.png
new file mode 100644 (file)
index 0000000..95daba5
Binary files /dev/null and b/2019-fosdem/4900-testing-log-2.svg.png differ
diff --git a/2019-fosdem/5000-single-fs-next b/2019-fosdem/5000-single-fs-next
new file mode 100755 (executable)
index 0000000..9375f8d
--- /dev/null
@@ -0,0 +1,19 @@
+#!/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
diff --git a/2019-fosdem/5000-single-fs.sh b/2019-fosdem/5000-single-fs.sh
new file mode 100755 (executable)
index 0000000..be1bfd4
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/bash -
+
+xfce4-terminal --disable-server \
+               -x ./5000-single-fs-next
diff --git a/2019-fosdem/5500-raid-next b/2019-fosdem/5500-raid-next
new file mode 100755 (executable)
index 0000000..2c3d135
--- /dev/null
@@ -0,0 +1,21 @@
+#!/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
diff --git a/2019-fosdem/5500-raid.sh b/2019-fosdem/5500-raid.sh
new file mode 100755 (executable)
index 0000000..d333b36
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/bash -
+
+xfce4-terminal --disable-server \
+               -x ./5500-raid-next
diff --git a/2019-fosdem/NOTES b/2019-fosdem/NOTES
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2019-fosdem/bashrc b/2019-fosdem/bashrc
new file mode 100644 (file)
index 0000000..4c6a3c6
--- /dev/null
@@ -0,0 +1,17 @@
+# -*- 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
diff --git a/2019-fosdem/code.js b/2019-fosdem/code.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2019-fosdem/functions b/2019-fosdem/functions
new file mode 100644 (file)
index 0000000..d5347e7
--- /dev/null
@@ -0,0 +1,43 @@
+# -*- 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 "$@"
+}
diff --git a/2019-fosdem/restore b/2019-fosdem/restore
new file mode 100755 (executable)
index 0000000..ee22354
--- /dev/null
@@ -0,0 +1,20 @@
+#!/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
diff --git a/2019-fosdem/run b/2019-fosdem/run
new file mode 100755 (executable)
index 0000000..fe4a70e
--- /dev/null
@@ -0,0 +1,55 @@
+#!/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
diff --git a/2019-fosdem/style.css b/2019-fosdem/style.css
new file mode 100644 (file)
index 0000000..aa57add
--- /dev/null
@@ -0,0 +1,58 @@
+/* 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;
+}