/2200-partitioning.d/.root.img
/2200-partitioning.d/root.img
/2200-partitioning.d/swap.img
+/6500-shell.d/tar2iso.sh
/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>
+
+<h1>Writing 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>Writing plugins in C?</h1>
+
+<style>
+pre {
+ column-count: 3;
+ font-size: 50%;
+}
+</style>
+
+<pre>
+/* The size of disk in bytes (initialized by
+ size=<SIZE> parameter). */
+static int64_t size = 0;
+
+/* Debug directory operations
+ (-D memory.dir=1). */
+int memory_debug_dir;
+
+static struct sparse_array *sa;
+
+static void
+memory_load (void)
+{
+ sa = alloc_sparse_array (memory_debug_dir);
+ if (sa == NULL) {
+ perror ("malloc");
+ exit (EXIT_FAILURE);
+ }
+}
+
+static void
+memory_unload (void)
+{
+ free_sparse_array (sa);
+}
+
+static int
+memory_config (const char *key,
+ const char *value)
+{
+ if (strcmp (key, "size") == 0) {
+ size = nbdkit_parse_size (value);
+ if (size == -1)
+ return -1;
+ }
+ else {
+ nbdkit_error
+ ("unknown parameter '%s'", key);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+memory_config_complete (void)
+{
+ if (size == 0) {
+ nbdkit_error ("you must specify "
+ "size=<SIZE> on the "
+ "command line");
+ return -1;
+ }
+ return 0;
+}
+
+#define memory_config_help \
+ "size=<SIZE> (required)"
+ " Size of the backing disk"
+
+/* Create the per-connection handle. */
+static void *
+memory_open (int readonly)
+{
+ /* Used only as a handle pointer. */
+ static int mh;
+
+ return &mh;
+}
+
+#define THREAD_MODEL \
+NBDKIT_THREAD_MODEL_SERIALIZE_ALL_REQUESTS
+
+/* Get the disk size. */
+static int64_t
+memory_get_size (void *handle)
+{
+ return (int64_t) size;
+}
+
+/* Read data. */
+static int
+memory_pread (void *handle, void *buf,
+ uint32_t count, uint64_t offset)
+{
+ sparse_array_read (sa, buf, count, offset);
+ return 0;
+}
+
+/* Write data. */
+static int
+memory_pwrite (void *handle,
+ const void *buf,
+ uint32_t count, uint64_t offset)
+{
+ return sparse_array_write (sa,
+ buf, count, offset);
+}
+
+/* Zero. */
+static int
+memory_zero (void *handle,
+ uint32_t count,
+ uint64_t offset, int may_trim)
+{
+ sparse_array_zero (sa, count, offset);
+ return 0;
+}
+
+/* Trim (same as zero). */
+static int
+memory_trim (void *handle,
+ uint32_t count, uint64_t offset)
+{
+ sparse_array_zero (sa, count, offset);
+ return 0;
+}
+
+static struct nbdkit_plugin plugin = {
+ .name = "memory",
+ .version = PACKAGE_VERSION,
+ .load = memory_load,
+ .unload = memory_unload,
+ .config = memory_config,
+ .config_complete = memory_config_complete,
+ .config_help = memory_config_help,
+ .open = memory_open,
+ .get_size = memory_get_size,
+ .pread = memory_pread,
+ .pwrite = memory_pwrite,
+ .zero = memory_zero,
+ .trim = memory_trim,
+ /* In this plugin, errno is preserved
+ * properly along error return
+ * paths from failed system calls.
+ */
+ .errno_is_preserved = 1,
+};
+
+NBDKIT_REGISTER_PLUGIN(plugin)
+</pre>
--- /dev/null
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<h1>Writing plugins in other languages</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>Writing plugins in shell script</h1>
+
--- /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>Writing plugins in shell script</h1>
+
+<p>
+(Or <u>any</u> language).
+We only need to write a few callbacks ...
+</p>
+
+<ul>
+<li> <code>config</code>
+<li> <code>config_complete</code>
+<li> <code>open</code>
+<li> <code>get_size</code>
+<li> <code>pread</code>
+<li> <code>pwrite</code>
+</ul>
+
+<p>
+Almost all callbacks are optional.
+</p>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="192" height="192" viewBox="0 0 144 144">
+ <linearGradient id="c" x1="15.193" x2="120.855" y1="77.313" y2="77.313" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#fff"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <linearGradient id="d" x1="30.131" x2="101.383" y1="114.274" y2="39.161" gradientUnits="userSpaceOnUse">
+ <stop offset=".011" stop-color="#98aff2"/>
+ <stop offset=".096" stop-color="#9db3f3"/>
+ <stop offset=".199" stop-color="#acbff5"/>
+ <stop offset=".31" stop-color="#c4d2f8"/>
+ <stop offset=".428" stop-color="#e6ecfc"/>
+ <stop offset=".5" stop-color="#fff"/>
+ <stop offset=".519" stop-color="#f7f9fe"/>
+ <stop offset=".611" stop-color="#d5defa"/>
+ <stop offset=".704" stop-color="#bacaf6"/>
+ <stop offset=".799" stop-color="#a7bbf4"/>
+ <stop offset=".897" stop-color="#9cb2f2"/>
+ <stop offset="1" stop-color="#98aff2"/>
+ </linearGradient>
+ <linearGradient id="a">
+ <stop offset=".011" stop-color="#b1caff"/>
+ <stop offset=".111" stop-color="#b6cdff"/>
+ <stop offset=".232" stop-color="#c5d8ff"/>
+ <stop offset=".363" stop-color="#dde8ff"/>
+ <stop offset=".5" stop-color="#fff"/>
+ <stop offset=".526" stop-color="#f8faff"/>
+ <stop offset=".64" stop-color="#dde6ff"/>
+ <stop offset=".755" stop-color="#cad8ff"/>
+ <stop offset=".874" stop-color="#bfd0ff"/>
+ <stop offset="1" stop-color="#bbcdff"/>
+ </linearGradient>
+ <linearGradient id="e" x1="1065.43" x2="1158.018" y1="95.011" y2="2.423" gradientTransform="matrix(.849 -.5284 .5284 .849 -910.0727 618.7241)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="f" x1="1073.158" x2="1164.618" y1="102.772" y2="11.311" gradientTransform="matrix(.849 -.5284 .5284 .849 -910.0727 618.7241)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="g" x1="75.36" x2="167.626" y1="92.327" y2="241.508" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#fff"/>
+ <stop offset="1" stop-color="#9195f2"/>
+ </linearGradient>
+ <linearGradient id="b">
+ <stop offset="0" stop-color="#9ab1ff"/>
+ <stop offset="1" stop-color="#444973"/>
+ </linearGradient>
+ <linearGradient id="h" x1="14.187" x2="117.257" y1="76.693" y2="76.693" gradientUnits="userSpaceOnUse" xlink:href="#b"/>
+ <linearGradient id="i" x1="57.506" x2="73.948" y1="76.751" y2="76.751" gradientUnits="userSpaceOnUse" xlink:href="#b"/>
+ <linearGradient id="j" x1="49.926" x2="81.527" y1="76.751" y2="76.751" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#9ab1ff"/>
+ <stop offset="1" stop-color="#626aa4"/>
+ </linearGradient>
+ <g fill="#fff" stroke-width="0">
+ <path fill="none" d="m144 144h-144v-144h144z"/>
+ <path fill="#000" d="m103.995 122.896c0 8.636-23.175 15.634-51.762 15.634-28.588 0-51.764-6.999-51.764-15.634 0-8.633 23.175-15.633 51.764-15.633 28.587 0 51.762 7 51.762 15.633z" opacity=".2"/>
+ <path fill="url(#c)" d="m35.905 25.71c-23.226 14.456-27.676 49.278-9.936 77.78 17.738 28.5 50.945 39.883 74.173 25.426 23.228-14.458 27.677-49.276 9.938-77.778s-50.946-39.886-74.175-25.428zm36.384 58.455c-3.084 1.919-7.494.405-9.848-3.376-2.353-3.783-1.761-8.403 1.32-10.322 3.084-1.92 7.49-.41 9.845 3.374 2.354 3.783 1.766 8.406-1.317 10.325z" opacity=".2"/>
+ <path fill="url(#d)" d="m33.609 25.148c-23.228 14.458-27.678 49.28-9.939 77.78 17.737 28.497 50.947 39.884 74.175 25.426 23.227-14.456 27.677-49.281 9.939-77.778-17.739-28.501-50.949-39.886-74.175-25.428zm36.38 58.452c-3.083 1.918-7.492.408-9.847-3.374-2.354-3.783-1.762-8.408 1.32-10.325 3.083-1.92 7.491-.408 9.846 3.377 2.354 3.781 1.763 8.403-1.32 10.322z"/>
+ <path fill="url(#e)" d="m60.142 80.226c-.219-.352-.398-.709-.572-1.072l-30.372 31.511c10.303 12.641 23.903 20.736 37.559 23.17l-1.525-49.653c-1.94-.536-3.815-1.908-5.09-3.956z"/>
+ <path fill="url(#f)" d="m68.212 70.19 30.373-31.514c-10.144-10.669-22.765-17.367-35.34-19.245l1.526 49.652c1.161.063 2.342.445 3.441 1.107z"/>
+ <path d="m60.142 80.226c-.219-.352-.398-.709-.572-1.072l-30.372 31.511c10.303 12.641 23.903 20.736 37.559 23.17l-1.525-49.653c-1.94-.536-3.815-1.908-5.09-3.956z" opacity=".8"/>
+ <path d="m68.212 70.19 30.373-31.514c-10.144-10.669-22.765-17.367-35.34-19.245l1.526 49.652c1.161.063 2.342.445 3.441 1.107z" opacity=".8"/>
+ <g opacity=".4">
+ <path d="m61.361 81.637c-.281-.3-.538-.609-.775-.93l-20.802 40.32c12.423 9.997 26.838 14.469 40.005 13.19l-12.82-49.967c-1.914-.011-3.964-.887-5.608-2.614z" opacity=".8"/>
+ <path d="m66.504 69.235 20.8-40.325c-11.819-8.038-25.014-11.367-37.055-9.814l12.821 49.96c1.087-.254 2.27-.188 3.434.18z" opacity=".8"/>
+ </g>
+ <g opacity=".68">
+ <path d="m67.781 83.536c-.334.072-.675.1-1.016.111l24.713 46.987c12.397-5.098 21.108-15.822 24.788-29.236l-44.396-21.445c-.692 1.82-2.125 3.177-4.088 3.583z" opacity=".9"/>
+ <path d="m59.734 70.282-24.716-46.993c-10.626 5.847-17.984 16.178-21.045 28.698l44.397 21.445c.182-1.209.657-2.291 1.365-3.15z" opacity=".9"/>
+ </g>
+ <path fill="url(#g)" d="m24.177 102.612c17.497 28.113 50.368 39.383 73.28 25.122 22.91-14.259 27.316-48.731 9.819-76.844-17.497-28.111-50.372-39.381-73.282-25.122-22.912 14.261-27.314 48.732-9.817 76.844zm80.552-50.136c16.623 26.707 12.649 59.326-8.857 72.711-8.838 5.501-19.872 7.095-31.069 4.489-15.048-3.502-28.927-13.944-38.079-28.649-16.623-26.707-12.65-59.326 8.856-72.711s52.526-2.547 69.149 24.161z"/>
+ <path fill="url(#h)" d="m68.213 17.691c16.652 3.875 31.943 15.32 41.952 31.401 18.448 29.642 13.523 66.165-10.979 81.416-24.503 15.251-59.448 3.543-77.898-26.098-7.343-11.796-11.192-25.042-11.192-37.835 0-4.646.508-9.231 1.54-13.667 2.996-12.874 10.323-23.498 20.632-29.914 10.307-6.416 23.072-8.299 35.945-5.303zm28.86 109.421c22.625-14.083 26.978-48.139 9.697-75.906-17.284-27.769-49.76-38.9-72.387-24.815-22.631 14.086-26.983 48.138-9.698 75.906 17.282 27.766 49.757 38.901 72.388 24.815z"/>
+ <path fill="url(#i)" d="m59.133 80.857c2.776 4.459 7.994 6.249 11.631 3.986 3.636-2.263 4.336-7.736 1.561-12.197-2.779-4.462-7.998-6.253-11.635-3.989-3.636 2.264-4.334 7.736-1.556 12.2zm9.795-6.098c1.557 2.502 1.427 5.627-.277 6.688-1.705 1.061-4.565-.203-6.122-2.703-.73-1.174-1.09-2.486-1.09-3.658 0-1.325.46-2.47 1.365-3.034 1.704-1.061 4.566.205 6.125 2.707z"/>
+ <path fill="url(#j)" d="m53.051 84.642c5.338 8.575 15.368 12.014 22.356 7.663 6.991-4.35 8.331-14.866 2.994-23.44-5.337-8.577-15.365-12.018-22.354-7.667-6.99 4.352-8.333 14.871-2.996 23.445zm3.895-2.424c-3.699-5.942-2.769-13.229 2.073-16.244 4.843-3.013 11.79-.63 15.488 5.313 3.698 5.94 2.767 13.225-2.074 16.239-4.843 3.014-11.792.631-15.487-5.308z" opacity=".5"/>
+ </g>
+</svg>
--- /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>What shell script?</h1>
+
+<img src="6450-tarfile.svg" width="300">
+
+<img src="6450-cd.svg" width="300">
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="48"
+ height="48"
+ id="svg4297">
+ <defs
+ id="defs4299">
+ <radialGradient
+ cx="5"
+ cy="41.5"
+ r="5"
+ fx="5"
+ fy="41.5"
+ id="radialGradient3314"
+ xlink:href="#linearGradient3681"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5938225,0,0,1.5366531,41.140892,-103.93618)" />
+ <linearGradient
+ id="linearGradient3703">
+ <stop
+ id="stop3705"
+ style="stop-color:black;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop3711"
+ style="stop-color:black;stop-opacity:1"
+ offset="0.5" />
+ <stop
+ id="stop3707"
+ style="stop-color:black;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="17.554192"
+ y1="46.000275"
+ x2="17.554192"
+ y2="34.999718"
+ id="linearGradient3312"
+ xlink:href="#linearGradient3703"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7570316,0,0,1.3969574,-17.394014,-16.411698)" />
+ <linearGradient
+ id="linearGradient3681">
+ <stop
+ id="stop3683"
+ style="stop-color:black;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3685"
+ style="stop-color:black;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="5"
+ cy="41.5"
+ r="5"
+ fx="5"
+ fy="41.5"
+ id="radialGradient3310"
+ xlink:href="#linearGradient3681"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5938225,0,0,1.5366531,-6.6594735,-103.93618)" />
+ <linearGradient
+ id="linearGradient3295">
+ <stop
+ id="stop3297"
+ style="stop-color:#c9af8b;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3299"
+ style="stop-color:#ad8757;stop-opacity:1"
+ offset="0.23942046" />
+ <stop
+ id="stop3301"
+ style="stop-color:#c2a57f;stop-opacity:1"
+ offset="0.27582464" />
+ <stop
+ id="stop3303"
+ style="stop-color:#9d7d53;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="15.464298"
+ y1="7.9756851"
+ x2="15.464298"
+ y2="45.04248"
+ id="linearGradient3293"
+ xlink:href="#linearGradient3295"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3199">
+ <stop
+ id="stop3201"
+ style="stop-color:#dac197;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3203"
+ style="stop-color:#c1a581;stop-opacity:1"
+ offset="0.23942046" />
+ <stop
+ id="stop3205"
+ style="stop-color:#dbc298;stop-opacity:1"
+ offset="0.27582464" />
+ <stop
+ id="stop3207"
+ style="stop-color:#a68b60;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="24.822832"
+ y1="15.377745"
+ x2="24.996943"
+ y2="37.27668"
+ id="linearGradient3197"
+ xlink:href="#linearGradient3199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2822251,0,0,1.5572619,-6.0701918,-15.290756)" />
+ <linearGradient
+ id="linearGradient4559">
+ <stop
+ id="stop4561"
+ style="stop-color:white;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop4563"
+ style="stop-color:white;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="23.451576"
+ y1="30.554907"
+ x2="43.00663"
+ y2="45.934479"
+ id="linearGradient2659"
+ xlink:href="#linearGradient4559"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2822251,0,0,1.1746872,-6.0701918,-5.3031677)" />
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ style="stop-color:white;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4295"
+ style="stop-color:white;stop-opacity:1"
+ offset="0.3021296" />
+ <stop
+ id="stop4293"
+ style="stop-color:white;stop-opacity:0.6901961"
+ offset="0.34361121" />
+ <stop
+ id="stop3832"
+ style="stop-color:white;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="26"
+ y1="22"
+ x2="26"
+ y2="8"
+ id="linearGradient3834"
+ xlink:href="#linearGradient3827"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3275">
+ <stop
+ id="stop3277"
+ style="stop-color:white;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop3283"
+ style="stop-color:white;stop-opacity:1"
+ offset="0.245" />
+ <stop
+ id="stop3285"
+ style="stop-color:white;stop-opacity:1"
+ offset="0.77350003" />
+ <stop
+ id="stop3279"
+ style="stop-color:white;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="44.994774"
+ y1="17.5"
+ x2="3.0052247"
+ y2="17.5"
+ id="linearGradient3281"
+ xlink:href="#linearGradient3275"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect" />
+ </defs>
+ <g
+ id="layer1">
+ <g
+ transform="matrix(0.9926623,0,0,0.9761474,0.2751901,1.2929634)"
+ id="g3305"
+ style="opacity:0.4;display:inline">
+ <rect
+ width="2.9601951"
+ height="15.366531"
+ x="-3.6903627"
+ y="-47.848343"
+ transform="scale(-1,-1)"
+ id="rect2484"
+ style="fill:url(#radialGradient3310);fill-opacity:1;stroke:none" />
+ <rect
+ width="40.41172"
+ height="15.366531"
+ x="3.6903627"
+ y="32.481812"
+ id="rect2486"
+ style="fill:url(#linearGradient3312);fill-opacity:1;stroke:none" />
+ <rect
+ width="2.9601951"
+ height="15.366531"
+ x="44.110001"
+ y="-47.848343"
+ transform="scale(1,-1)"
+ id="rect3444"
+ style="fill:url(#radialGradient3314);fill-opacity:1;stroke:none;display:inline" />
+ </g>
+ <path
+ d="m 9.010725,8.5 29.497723,0 c 1.721985,0 2.496922,-0.2865505 2.991552,1 l 3.001734,8 0,25.673912 c 0,1.553304 0.10293,1.315976 -1.619063,1.315976 l -37.7653422,0 c -1.7219924,0 -1.6190635,0.237328 -1.6190635,-1.315976 L 3.4982653,17.5 6.5,9.5 c 0.4808316,-1.2605622 0.7887325,-1 2.510725,-1 z"
+ id="path2488"
+ style="fill:url(#linearGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3293);stroke-width:0.99420077;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" />
+ <path
+ d="m 9.948194,9.5129459 27.652872,0 c 1.614293,0 2.61338,0.5565361 3.289521,2.0860281 l 2.32894,6.419721 0,23.144557 c 0,1.460676 -0.818759,2.196085 -2.433056,2.196085 l -33.7332031,0 c -1.6142934,0 -2.2727761,-0.808827 -2.2727761,-2.269504 l 0,-23.071138 2.2538109,-6.55736 C 7.4850649,10.275943 8.3338968,9.5129459 9.948194,9.5129459 z"
+ id="path2490"
+ style="opacity:0.50549454;fill:none;stroke:url(#linearGradient2659);stroke-width:0.74211526;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" />
+ <path
+ d="m 22,8 c 1.333333,0 2.666667,0 4,0 0,4.666667 0,9.333333 0,14 -0.393729,0 -0.787458,0 -1.181187,0 -0.403125,0 -0.80625,0 -1.209375,0 -0.324529,0 -0.649057,0 -0.973585,0 C 22.423902,22 22.211951,22 22,22 22,17.333333 22,12.666667 22,8 z"
+ id="rect3326"
+ style="opacity:0.4;fill:url(#linearGradient3834);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 8.8577805,41 c 0.5320002,0 1.0640004,0 1.5960005,0 0,-1.732 0,-3.463999 0,-5.195999 0.350387,-0.08546 1.120394,0.248701 0.96,-0.347539 -0.102171,-0.33549 0.226561,-1.101884 -0.208523,-1.104461 -0.485647,0.0498 -0.932764,0.06107 -0.751477,-0.556062 0,-0.554647 0,-1.109293 0,-1.663939 -0.5320001,0 -1.0640003,0 -1.5960005,0 0,0.74 0,1.480001 0,2.220001 -0.4271961,-0.005 -0.9818294,-0.137459 -0.7799998,0.486555 0.085799,0.351863 -0.2490168,1.124339 0.3475392,0.965445 0.6265813,-0.204397 0.3964847,0.447885 0.4324606,0.834094 0,1.453968 0,2.907937 0,4.361905 z M 18.959156,34.352001 c -0.488,0 -0.976,0 -1.464001,0 0.0024,0.555388 0.107596,1.227788 -0.437249,0.416063 -1.636804,-1.296088 -4.374285,-0.300099 -4.92452,1.689976 -0.661604,1.81115 0.300763,4.17561 2.285367,4.595045 1.094162,0.292268 2.36525,0.0092 3.076403,-0.917085 0.04748,0.379533 -0.208965,1.062996 0.417046,0.864 0.308688,-0.109805 1.075603,0.238618 1.046954,-0.208523 0,-2.146492 0,-4.292984 0,-6.439476 z m -3.468,1.307999 c 1.580814,-0.09128 2.457037,1.889634 1.6725,3.144 -0.780128,1.464019 -3.38279,1.034012 -3.57968,-0.649758 -0.2612,-1.205372 0.595891,-2.550989 1.90718,-2.494242 z M 20.149031,41 c 0.532,0 1.064,0 1.596,0 0.02695,-1.40671 -0.05762,-2.820653 0.04952,-4.222235 -0.03929,-1.150281 1.695641,-0.622862 1.378482,-1.671335 0.04606,-0.582734 0.107656,-1.301403 -0.765469,-0.817407 -0.801504,0.592003 -0.68196,0.734239 -0.933546,0.06298 -0.441662,0 -0.883324,0 -1.324985,0 0,2.216 0,4.431999 0,6.647999 z m 4.059749,0 c 0.532001,0 1.064001,0 1.596001,0 0,-0.512 0,-1.024 0,-1.535999 -0.532,0 -1.064,0 -1.596001,0 0,0.511999 0,1.023999 0,1.535999 z m 8.295565,-6.647999 c -0.003,0.513942 0.117021,1.189699 -0.411938,0.400875 -1.628193,-1.253571 -4.301621,-0.305806 -4.845656,1.666025 -0.659185,1.848746 0.330662,4.308171 2.388984,4.669669 1.042827,0.237804 2.216921,-0.0832 2.868608,-0.96457 0.169849,1.428755 -1.238328,2.555123 -2.59132,2.036038 -0.634102,-0.357712 -1.131566,-0.786701 -1.909789,-0.620038 -0.627191,-0.06916 -1.188855,-0.02657 -0.462605,0.689528 1.391779,1.957394 5.010526,1.964288 6.118152,-0.290715 0.591171,-1.493473 0.298261,-3.134065 0.369562,-4.701095 0,-0.961906 0,-1.923811 0,-2.885717 -0.507999,0 -1.015999,0 -1.523998,0 z M 30.512344,35.66 c 1.457805,-0.09191 2.302931,1.617593 1.784062,2.857499 -0.50064,1.638565 -3.249057,1.530402 -3.556995,-0.183606 -0.348044,-1.205308 0.365878,-2.744812 1.772932,-2.673893 l 10e-7,0 z M 34.858219,41 c 1.688,0 3.376,0 5.063999,0 0,-0.476 0,-0.952001 0,-1.428001 -1.051999,0 -2.103998,0 -3.155998,0 0.975999,-1.264 1.951998,-2.528 2.927998,-3.792 0,-0.475999 0,-0.951999 0,-1.427998 -1.5,0 -3,0 -4.5,0 0,0.475999 0,0.951999 0,1.427998 0.863999,0 1.727999,0 2.591999,0 -0.975999,1.264 -1.951999,2.528 -2.927998,3.792 0,0.476 0,0.952001 0,1.428001 z"
+ id="text3329"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:0.4;fill:black;fill-opacity:1;stroke:none;display:inline;font-family:URW Gothic L;-inkscape-font-specification:URW Gothic L Semi-Bold" />
+ <path
+ d="m 3.5052248,17.5 40.9895502,0"
+ id="path3273"
+ style="opacity:0.4;fill:none;stroke:url(#linearGradient3281);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ </g>
+</svg>
--- /dev/null
+#!/bin/bash -
+
+source functions
+
+# Title.
+export title="Writing tar2iso.sh"
+
+# History.
+remember 'emacs tar2iso.sh &'
+remember 'nbdkit sh ./tar2iso.sh file=~/nbdkit-1.9.0.tar.gz'
+remember 'sudo nbd-client -b 512 localhost /dev/nbd0'
+remember 'sudo mount /dev/nbd0 /tmp/mnt'
+
+./restore
+pushd 6500-shell.d >/dev/null
+rm -f tar2iso.sh
+echo '#!/bin/bash' > tar2iso.sh
+echo >> tar2iso.sh
+chmod +x tar2iso.sh
+terminal
+popd >/dev/null
--- /dev/null
+#!/bin/bash -
+
+xfce4-terminal --disable-server \
+ -x ./6500-shell-next
--- /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>In summary</h1>
+
+<ul>
+<li> Loopback mounts — don't do much.
+<li> Loopback mounts with NBD and nbdkit — infinitely flexible.
+<li> Lots of plugins, or write your own.
+<li> nbdkit 1.8 now available in all major Linux distros.
+<li> <a href="https://github.com/libguestfs/nbdkit">https://github.com/libguestfs/nbdkit</a>
+<li> This talk: <a href="http://git.annexia.org/?p=libguestfs-talks.git">http://git.annexia.org/?p=libguestfs-talks.git</a>
+<li> This presentation software: Tech Talk PSE 1.2
+</ul>
+
+<h2>Any Questions?</h2>
border-bottom: 2px solid rgb(204,0,0);
}
+h2 {
+ color: rgb(204,0,0);
+ font-size: 32px;
+ font-style: italic;
+ border-bottom: 2px solid rgb(204,0,0);
+}
+
b {
color: rgb(204,0,0);
}
--- /dev/null
+#!/bin/bash
+
+case "$1" in
+ config)
+ [ "$2" = "file" ] && ln -sf "$3" $tmpdir/tarfile ;;
+ config_complete)
+ tar zxf $tmpdir/tarfile -C $tmpdir
+ rm $tmpdir/tarfile
+ mkisofs -JrT -o $tmpdir/iso $tmpdir ;;
+ open) ;;
+ get_size)
+ stat -c '%s' $tmpdir/iso ;;
+ pread)
+ dd iflag=skip_bytes,count_bytes skip=$4 count=$3 if=$tmpdir/iso ;;
+ *) exit 2 ;;
+esac