From 5bc9ae236b09d7d42c09dc2dd818cd8e9ddde7bb Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 2 Feb 2012 12:44:35 +0000 Subject: [PATCH] Add FOSDEM 2012 talk. --- 2012-fosdem/.gitignore | 7 ++ 2012-fosdem/100-introduction.html | 13 ++++ 2012-fosdem/200-overview.html | 33 +++++++++ 2012-fosdem/300-guestfish.term | 12 +++ 2012-fosdem/300.d/.exists | 0 2012-fosdem/400-inspection.term | 14 ++++ 2012-fosdem/400.d/.exists | 0 2012-fosdem/500-auditing.term | 13 ++++ 2012-fosdem/500.d/.exists | 0 2012-fosdem/500.d/audit.py | 44 +++++++++++ 2012-fosdem/600-prepopulate.term | 17 +++++ 2012-fosdem/600.d/.exists | 0 2012-fosdem/600.d/prepopulate.py | 24 ++++++ 2012-fosdem/900-summary.html | 46 ++++++++++++ 2012-fosdem/arrows1.svg | 143 ++++++++++++++++++++++++++++++++++++ 2012-fosdem/arrows2.svg | 149 ++++++++++++++++++++++++++++++++++++++ 2012-fosdem/bashrc | 14 ++++ 2012-fosdem/cdrom.png | Bin 0 -> 3997 bytes 2012-fosdem/code.js | 0 2012-fosdem/disk.png | Bin 0 -> 2326 bytes 2012-fosdem/file.png | Bin 0 -> 2095 bytes 2012-fosdem/flash.png | Bin 0 -> 2919 bytes 2012-fosdem/floppy.png | Bin 0 -> 1822 bytes 2012-fosdem/functions | 41 +++++++++++ 2012-fosdem/highlight | 2 + 2012-fosdem/notes.txt | 77 ++++++++++++++++++++ 2012-fosdem/redhat.jpg | Bin 0 -> 8593 bytes 2012-fosdem/style.css | 84 +++++++++++++++++++++ 28 files changed, 733 insertions(+) create mode 100644 2012-fosdem/.gitignore create mode 100644 2012-fosdem/100-introduction.html create mode 100644 2012-fosdem/200-overview.html create mode 100755 2012-fosdem/300-guestfish.term create mode 100644 2012-fosdem/300.d/.exists create mode 100755 2012-fosdem/400-inspection.term create mode 100644 2012-fosdem/400.d/.exists create mode 100755 2012-fosdem/500-auditing.term create mode 100644 2012-fosdem/500.d/.exists create mode 100755 2012-fosdem/500.d/audit.py create mode 100755 2012-fosdem/600-prepopulate.term create mode 100644 2012-fosdem/600.d/.exists create mode 100755 2012-fosdem/600.d/prepopulate.py create mode 100644 2012-fosdem/900-summary.html create mode 100644 2012-fosdem/arrows1.svg create mode 100644 2012-fosdem/arrows2.svg create mode 100644 2012-fosdem/bashrc create mode 100644 2012-fosdem/cdrom.png create mode 100644 2012-fosdem/code.js create mode 100644 2012-fosdem/disk.png create mode 100644 2012-fosdem/file.png create mode 100644 2012-fosdem/flash.png create mode 100644 2012-fosdem/floppy.png create mode 100644 2012-fosdem/functions create mode 100755 2012-fosdem/highlight create mode 100644 2012-fosdem/notes.txt create mode 100644 2012-fosdem/redhat.jpg create mode 100644 2012-fosdem/style.css diff --git a/2012-fosdem/.gitignore b/2012-fosdem/.gitignore new file mode 100644 index 0000000..226f62f --- /dev/null +++ b/2012-fosdem/.gitignore @@ -0,0 +1,7 @@ +bindings +history +300.d/disk.img +400.d/disk.img +500.d/rhel6.img +500.d/win7.img +600.d/libguestfs-1.16.2.tar.gz diff --git a/2012-fosdem/100-introduction.html b/2012-fosdem/100-introduction.html new file mode 100644 index 0000000..f9ecd30 --- /dev/null +++ b/2012-fosdem/100-introduction.html @@ -0,0 +1,13 @@ + + + +
+

+ libguestfs

+ tools for viewing and modifying
virtual machine disk images +

+

+Richard W.M. Jones
Red Hat
+rjones @ redhat.com +

+
diff --git a/2012-fosdem/200-overview.html b/2012-fosdem/200-overview.html new file mode 100644 index 0000000..596e2eb --- /dev/null +++ b/2012-fosdem/200-overview.html @@ -0,0 +1,33 @@ + + + + +

Library, API, tools

+ + + + + + + +

libguestfs.so

+ + + +

C

+ +

Python

+ +

Ruby

+ +

shell

+ +

· · ·

+ +

virt-resize

+ +

virt-df

+ +

guestfish

+ +

· · ·

diff --git a/2012-fosdem/300-guestfish.term b/2012-fosdem/300-guestfish.term new file mode 100755 index 0000000..438550d --- /dev/null +++ b/2012-fosdem/300-guestfish.term @@ -0,0 +1,12 @@ +#!/bin/bash - + +source functions + +remember 'ls -l -h' +remember 'file disk.img' +remember 'guestfish --ro -i -a disk.img' + +echo "Example: Modify a disk image" + +cd 300.d +terminal diff --git a/2012-fosdem/300.d/.exists b/2012-fosdem/300.d/.exists new file mode 100644 index 0000000..e69de29 diff --git a/2012-fosdem/400-inspection.term b/2012-fosdem/400-inspection.term new file mode 100755 index 0000000..d22a24e --- /dev/null +++ b/2012-fosdem/400-inspection.term @@ -0,0 +1,14 @@ +#!/bin/bash - + +source functions + +echo "Example: Inspection" + +remember 'ls -l -h' +remember 'file disk.img' +remember 'virt-df -h -a disk.img' +remember 'virt-filesystems -a disk.img --all --long -h' +remember 'virt-inspector -a disk.img | highlight | less -r' + +cd 400.d +terminal diff --git a/2012-fosdem/400.d/.exists b/2012-fosdem/400.d/.exists new file mode 100644 index 0000000..e69de29 diff --git a/2012-fosdem/500-auditing.term b/2012-fosdem/500-auditing.term new file mode 100755 index 0000000..94c0df1 --- /dev/null +++ b/2012-fosdem/500-auditing.term @@ -0,0 +1,13 @@ +#!/bin/bash - + +source functions + +echo "Example: Auditing" + +remember 'ls -l -h' +remember 'emacs -nw audit.py' +remember './audit.py win7.img' +remember './audit.py rhel6.img' + +cd 500.d +terminal diff --git a/2012-fosdem/500.d/.exists b/2012-fosdem/500.d/.exists new file mode 100644 index 0000000..e69de29 diff --git a/2012-fosdem/500.d/audit.py b/2012-fosdem/500.d/audit.py new file mode 100755 index 0000000..8cdaec5 --- /dev/null +++ b/2012-fosdem/500.d/audit.py @@ -0,0 +1,44 @@ +#!/usr/bin/python + +import re +import sys +import guestfs + +def mount_disk (g, root): + mps = g.inspect_get_mountpoints (root) + def compare (a, b): + if len(a[0]) > len(b[0]): + return 1 + elif len(a[0]) == len(b[0]): + return 0 + else: + return -1 + mps.sort (compare) + for mp_dev in mps: + try: + g.mount_ro (mp_dev[1], mp_dev[0]) + except RuntimeError as msg: + print "%s (ignored)" % msg + +if len (sys.argv) != 2: + raise (Error ("disk [image]")) +disk = sys.argv[1] + +g = guestfs.GuestFS () +g.add_drive_opts (disk, readonly=1) + +g.launch () + +roots = g.inspect_os () +if len (roots) == 0: + raise (Error ("inspect_vm: no operating systems found")) + +for root in roots: + mount_disk (g, root) + + apps = g.inspect_list_applications (root) + for app in apps: + if re.search ('firefox', app['app_name'], re.IGNORECASE): + print ("%s: Firefox version %s" % (disk, app['app_version'])) + + g.umount_all () diff --git a/2012-fosdem/600-prepopulate.term b/2012-fosdem/600-prepopulate.term new file mode 100755 index 0000000..392d8dc --- /dev/null +++ b/2012-fosdem/600-prepopulate.term @@ -0,0 +1,17 @@ +#!/bin/bash - + +source functions + +echo "Example: Prepopulate a disk image" + +remember 'emacs -nw prepopulate.py' +remember './prepopulate.py' +remember 'ls -l -h' +remember 'virt-df -h -a disk.img' +remember 'guestfish -a disk.img -m /dev/sda1 --ro' + +cd 600.d + +rm -f disk.img + +terminal diff --git a/2012-fosdem/600.d/.exists b/2012-fosdem/600.d/.exists new file mode 100644 index 0000000..e69de29 diff --git a/2012-fosdem/600.d/prepopulate.py b/2012-fosdem/600.d/prepopulate.py new file mode 100755 index 0000000..9e528e8 --- /dev/null +++ b/2012-fosdem/600.d/prepopulate.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +import os +import guestfs + +input = "libguestfs-1.16.2.tar.gz" +output = "disk.img" + +g = guestfs.GuestFS () + +f = open (output, "w") +f.truncate (512 * 1024 * 1024) +f.close () + +g.add_drive_opts (output, format = "raw", readonly = 0) + +g.launch () + +g.part_disk ("/dev/sda", "mbr") +g.mkfs ("ext4", "/dev/sda1") +g.mount ("/dev/sda1", "/") +g.tgz_in (input, "/") + +g.close () diff --git a/2012-fosdem/900-summary.html b/2012-fosdem/900-summary.html new file mode 100644 index 0000000..8c6ed16 --- /dev/null +++ b/2012-fosdem/900-summary.html @@ -0,0 +1,46 @@ + + + + +

libguestfs.org

+ +

+ Languages: + C/C++, Perl, Python, Ruby, OCaml, Java, PHP, Erlang, shell script +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

guestfish

virt-copy-out

virt-inspector

virt-sparsify

guestmount

virt-df

virt-ls

virt-tar-in

virt-alignment-scan

virt-edit

virt-make-fs

virt-tar-out

virt-cat

virt-filesystems

virt-rescue

virt-win-reg

virt-copy-in

virt-format

virt-resize

+ +

+ Aeolus, OpenStack Essex, Boxgrinder, Oz, virt-manager, virt-v2v, virt-p2v +

diff --git a/2012-fosdem/arrows1.svg b/2012-fosdem/arrows1.svg new file mode 100644 index 0000000..7582b01 --- /dev/null +++ b/2012-fosdem/arrows1.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/2012-fosdem/arrows2.svg b/2012-fosdem/arrows2.svg new file mode 100644 index 0000000..d73e054 --- /dev/null +++ b/2012-fosdem/arrows2.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/2012-fosdem/bashrc b/2012-fosdem/bashrc new file mode 100644 index 0000000..e8fcde3 --- /dev/null +++ b/2012-fosdem/bashrc @@ -0,0 +1,14 @@ +# -*- shell-script -*- + +# 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/2012-fosdem/cdrom.png b/2012-fosdem/cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..9c241cdf896c9954b322d98903da3f9850acc4e3 GIT binary patch literal 3997 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 DR#}s% literal 0 HcmV?d00001 diff --git a/2012-fosdem/code.js b/2012-fosdem/code.js new file mode 100644 index 0000000..e69de29 diff --git a/2012-fosdem/disk.png b/2012-fosdem/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..087810c7c911b50706c36158acda9fe6ae90bb21 GIT binary patch literal 2326 zcmV+x3F-EUP)bY*F7Wpd{G_b&hd03&ooSaefwb#h~60BCe{a5^t9bYX61Z!TtXWo2Y# zb8B>Oa4v6hXMM7arvLy5C`m*?RA}DqS=(zAR~SEY+50A&8z$x+vq?14HkuSsYmK4= zN&}6wFYSxf5^HTKR;>C^2-wSm|3csURwxvT4>qNbz6b_;38h-dWpmeDc9Yp;r{C}F zeCye9XGyV8r90$fW@pZv^ZR}GGtmYH2E_Ax=+8C!5`hwd5`hwd5`m{Z%y~CjKY;$u{tgo+&NF*ZfudS`g`WS5W22QZ~%(y zSS*$s$73NYD=T7ZYD$DcA*rDCjg(Qox_XwDx=yn7kAm0%F9}?|da;?n^v23#Qk#p5 zixLPl56$5W0YIq@BINh`B>~H_#Ky)(jxc~h!wU-wVt#&J%Ixf{n3%jX7aKH5s(FwrP~HPWJcrS8m$^%0RO% zzU#f+o!x$D5EHV0Lfi0Pkm8^#D=W(jXchQ&iC|9FKIVZEI^&(%-o1O?c5oJq1-(GA zGFn?(BLTl}u)4ZNgHK~ZxC62ff)m*U3#b`I%|@Jw;M*VuP+r7Tw}EAGhCo4my)XMi z;qV7ew%nErN%t8(KRgg`?~+9eX%G{SkB^J$>gv2Yz`_LJ_i!UvgwrV84uq?!s-(rd ztOL*>4U1z=tXp4SPxAyDPn{av%falng6VP}h*7s=$N7$UhY#)oU=tG)qN1WA=bx-G z)eWFA5M_ey`T#-N#Css*_Wv2U=oRhw1}5G!D1}PW=Ia*-Q60k@n&OV zW2jI{)m;`a4;*;qoqaF$8fyB3X;n?CZo>j#eSLlM844bP5=DzsD?kyLCo+`VjUZT? z)3jljqN}UZ*VEJUdZCnRD%zLs6OKmCG&i^C&^~7$m>llJxmtCfyjIdlr3}a&*lyCQ zg)k>qV^r*>rY3m}@<)!m>i_lE-#(@#zIC@2x}tsK%w^oZ{tZoVfr2%- z__*Vs7>Qy;02E1rdnRNoCd6Y79Xe!mbaV_miAQ%^KquA#^1z{ZyhG-DRkI8X+F@71 zB3O_!lUHzi5n*>js%&m<&NYdwd3GmmNe&)7s8dZjt<(f*1!iLmzA<>RwWTe z7Ubt_aAo%f002-3c<%4jP8IWDECkmmY$$L@mnf3RG#ICjaSJfj)zyibnwsdbW5#3=ps_dv_s~XjI}LDfHC%%X$Z=MK z6`=&&XV9uJVLsoxcTal6@#Dt@^+kTdca4_+8T};Sum#M`&8^*76w=$!I7X zZ;Qi+4^!Ul%Jnmt1X^GMyc5e4pD7HzuqK%#N>;{+4R*8Ko>)x+@;6=6?=;$Sngi~$ zu&^j@jsA%DfSEQtVja1J2?VWlS{wi4cd@#*BJPge6?1d5qN%Y->>>?(`T1AEqP=Qa zv`j>z5vf7A2?7o&H$Va{p?ZhIA^AH%?t|wjMA*nD*OD~%nk;gO#Ee*^0tXVgnxUrE zO!l|?Xrpwh**44{Bw2-FIgOfWE3HK&u&~e_KbNJR{wR0^_67MLJ{}h@)}DN*$(usH zYUh8!u$`(7i@7`0$MVDyxuc#eL6+4V3m6;&@*oS?V7|1pDA}8)PZ;DLI=KerU>St| zfM057VR1qBJlS@cgk1%0L*q@-x^yE)r29GDrjIO>wcwhhl>OY|SV24{@kHB9@7LDu z5Q*u@i~~N`jpBxtN~UIJXXonc8+M8sw9Qnw$|;axqoYTUX8U>~&*0LVX^|pQ76rIv z(Z-(KA)B2w2}q8G0%$zG2gxrLo`#%RU z(ovFH=4+O<@x_A&f7N^SI>q+1yvgTH3=3y0waD=o3&enXhgRgUXJ-;q5ANUpjINg* z+_vUe0cirBpej)G~B4HDO?I5=uZ6_~Z zzU;qon+a07*qoM6N<$f~fCGw*UYD literal 0 HcmV?d00001 diff --git a/2012-fosdem/file.png b/2012-fosdem/file.png new file mode 100644 index 0000000000000000000000000000000000000000..beff2d45fb2e7bb2269d7b5ad75eaebc35ba117c GIT binary patch literal 2095 zcmV+~2+;S5P)fFDZ*Bm0X>@2HVIW9V zM@1lLWo&RDW^!+BAWC6tbz+882eSYG2RKPYK~!ko)mlrB6jc=d&b`&uJ#R)}FhE2G z32}Is7#6yc7)>;p1sfK|AK)J`G10vXVhk9K7!pVX#3--0AZ`o>)G&njh~YgCr>A*L zch@~G>fWkzZ&mjUJu?d`RM)-LkNVCz-}l|eK+KG1`B2X^dH_+UH!fZJ?)e1Khs@@E zX08E1SgmgTw8`OniPq|tVf>yX$@ggM&n71)AFU(+>O`S)7temWZ_leAjBVVsYE^0{ zZ8V#UXe`um>)xFwcW>Wm8MHnbsIL3yz<~qpRSn>W^Jf>{e)FBdR=Wu{Y;(zJCK+IG zmgV#}(th4fzmtAGZ)>Gdt=6EmMx#;3-~ayg%{^YGQ6~7S(DWHf|VGyI0(vtzHF;pLruGl-&tOi$lOq&2E>6~iOLn3&kzPgxY0lfCd9(wLk=D zt)Z31%|CDA%CEoR`t|FWotp&!YW|surJ7BwBkK3e282a zK`Dh+tBFRVfra`48jS|}`uebE-(I{pKHfh&Kld?!W1SwoLpy9^mrjpRs$-#L(>Q%s~JrpDF-mBRK5R zY9CGx2zdxO04Yae79+C@kBAV*G2%D|1_nGWO#o=Nn&5;1&>KAuWP&XoKXUge(?(e@ zoK%Eu%3ht&E0q}Q*Ka_(-QIfm@Zm~N1DSlhbR3yk_8>S~Q8`9;g3^BuF##k#K(-fG zVlaR>j`dS&03~x8k^~8uo$}fXjlz6W9y~F?uFpj&5kO3cqDlwvG%6k;v{ zr+^TY&uu6Jz@8CNMlJ!6UFhruCXGS{VT=LvQwG4sl&33f5pux>{K%5XW9xISA`<~wM5I_Milt(Q`38&IfK}0T^aNH1vVF2Ktr>sC?f&^2_4hqU2(94-1 z*mqK7Zb>Cd5@q2WKFccgssRo`5?SR_P#yAL6+Bbztm1s3!(PS&nb>s5|8h0J-5eyh z$%3170o~b%?No(V$%RNv;7MLX(2^eAz*BL4RM1qore^LWfo>Jx+#bmXPE-U-8I_kP3c!=CN|fzRTY-VnQs?09Jl$C#aX$EP8EER_I(`+y061YxO-ZE_2XJj&-hq>yf2 z!~psMi~tw~FbJS#gVpv*<&M3g!{IhI!!3J00Z<1p1E2xmvAu7YnPmWuLJnkXuaUS< z!g|+&S1iuN24gI3TH-X$jl93q2TmkQ7M^Q)a7i#Mf?;W;h5u?m;W*#Dy_Nx#1q2QN Z{|{8awT7$TF;D;i002ovPDHLkV1l{9vWfrz literal 0 HcmV?d00001 diff --git a/2012-fosdem/flash.png b/2012-fosdem/flash.png new file mode 100644 index 0000000000000000000000000000000000000000..8e625ccadcceb7edaded0571f8c72baf7a54b51f GIT binary patch literal 2919 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 RGfV&g002ovPDHLkV1h9!uR8z$ literal 0 HcmV?d00001 diff --git a/2012-fosdem/floppy.png b/2012-fosdem/floppy.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfd7184ea7c71b9370cc4c00dac28adeecd5719 GIT binary patch literal 1822 zcmV+(2jTdMP)RA}Da zTFq-6RTMvWzLMt4ki?2;)99umw7L{pC{aw?MK>Pqu~4n0TB#Nhb)hAnVjCNiw0U_mbFb%|xp!vXyi76!I z$BUzsf?N4;ZfWcPw*dC+dF)XM;;?0jLAt*>I|mE*?62IowqM4eyR#h>eu5wz2O*w1 zb@J5bYXVSc{LsdYgMEDic%$IL#qZ(C$G24u;O$r6fjidUi6%%`xV|_zcWw4CR&QJr zfI!dp_umdjKKU4A7(yTgT>R}?8WYhyYC4I{18GZiw7~K*U^_oSwf;^Au3?s{(a<2 zG$UX&6apX#DZX^>>$AYagoq#rVO48Bc6<8t7wpWfTem?N7Gxkqq!jtWvOo|6ngYy9 zP&EQ_nusW1y9xr3{DLLuRcr*L22e2r_#vl}3do_MEGi*p0AdEn6MtWy<5Dq#6a!>e zQ3(-J!vNC=a9d|D3=FKV%=W8S|HOVX43v>jngIbOh^vhOq5I_i6%+@+=_1|RAx)2hqDAvjp|g-`ly)HrrDLFF_EQYtha;d21EC(sk}MP99uL7qU;%Ef$q)@IQZJ3IJntM`XX|c%BfE- z%GR@Sj#hx~Lzb10$-!-HE_hx~Om9-64o#jmbt?Lks?XG^$ZT^BsrF1eNnON%D#HLt zNE#h#7UIsdHkC+&pu)AfUOSTN3<#0baeNsNe5=1yk+-Az#yVb+m0Hj!naKzdkp8|t z*z&+;q}R!?QM4qUzj0#;&YbxYW~QejkEi-^T^G8#I>EMWJ(&^ZB&6iZo4)tmzX`TH zxS2PcY|91_i=78xkEs(_mA`i@xte7z8l$#|+bV_UyR^InhyDUWTQm zB?QqGtqP&cbXq17${uZAJFm>XyL28r*MpgfE8y4t1~2#Y^uYG*+u2Y*@cA6*v$^*? z4+ifZ(hHVk;398R8y)M`L2aoPuSxRu(DNBka>W;dFyP>JYzJxfpjNBFkxx%FNNv}S zhxxgXOUNbAXDT+nOKe5$g|rjc7%!B@~}3E43NbWa}5K9eUMGTfYLvJ+@V69ys{C=n#P z5+Zj(R$f9uMncShZDKGbp?v8O19YZwmL$~707}RfT%X>V`&T5y9wP}kk%Z{pZDL?` z=@X%6;YdoG1ymj>0(G$Zvca3z+&CPM%&dWjr0|N*)Xcz~2dwW-v z4uN2BG_dKkoD5_U6v{qgWd zCy#%&X=LY!Ydk^nplQP3T|?|Ssl7-n_*7691fY&*`i^HYmenxLsMnWSiV?^VIyyS| zS+n~lF@bn)8_t3~l(Eb89;q?uiqjRD&Daft;iJqY5%$;pYmZ@n>g zuX*6v=bnLA4!m4!;wIOAhGOi4_di;5frG}+qw(+JWoKGBSpZU_t6`yE^`?D49MjU` z& +# +# 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/2012-fosdem/highlight b/2012-fosdem/highlight new file mode 100755 index 0000000..e36a1ec --- /dev/null +++ b/2012-fosdem/highlight @@ -0,0 +1,2 @@ +#!/bin/sh - +source-highlight -s xml -o STDOUT -f esc diff --git a/2012-fosdem/notes.txt b/2012-fosdem/notes.txt new file mode 100644 index 0000000..21a3c59 --- /dev/null +++ b/2012-fosdem/notes.txt @@ -0,0 +1,77 @@ +[20 minutes + 5 for questions] + +!!!!! DISPLAY RESOLUTION !!!!! + +[BEFORE: + guestfish -a /dev/null run + ~/d/techtalk-pse/techtalk-pse +] + +[Audience is: + - cloud developers + - general interest + + What do they want to do with images: + - file injection + - inspection for auditing + - creation of blank / prepopulated + - resizing + - use it from languages like Python, C, Ruby, Perl, Java + + Adoption / find out more: + - website +] + +[website: + +libguestfs is a set of tools for accessing and modifying virtual +machine (VM) disk images. You can use this to inject files, resize, +rescue, create, view or audit disks. libguestfs is also a library that +you can link to management programs written in C, Perl, Python, Ruby, +Java and other languages. In this talk, Richard Jones will introduce +the tools and give live demonstrations. He also talks about how they +work behind the scenes. +] + + +100 INTRODUCTION + + - website + - my email address + +200 OVERVIEW + +C library, API and a set of tools + +(just a few are shown here) + +full time development for 3 years, > 300,000 lines of code + +using kernel + qemu code, so can handle qcow2, all sorts of filesystems + +300 GUESTFISH + + + +400 INSPECTION + + + +500 AUDITING + + + +600 PREPOPULATED DISK IMAGE + + + +900 SUMMARY + + - summary page + tools (all of them here) + used in OpenStack + used in Aeolus + used in Boxgrinder + used in Oz + used in virt-manager + used in virt-v2v, virt-p2v diff --git a/2012-fosdem/redhat.jpg b/2012-fosdem/redhat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36016a3583ef15f6b3d51f564edd3a44a992986c GIT binary patch literal 8593 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 yE3457q@G*4ulH&$fuTg`-J!