Clarify that we no longer support i586 but require i686+
[grml.org.git] / kantan / index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
2     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
4 <head>\r
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
6 <meta name="generator" content="AsciiDoc 8.6.4" />\r
7 <title>kantan(8)</title>\r
8 <style type="text/css">\r
9 /* Sans-serif font. */\r
10 h1, h2, h3, h4, h5, h6,\r
11 div.title, caption.title,\r
12 thead, p.table.header,\r
13 div#toctitle,\r
14 span#author, span#revnumber, span#revdate, span#revremark,\r
15 div#footer {\r
16   font-family: Arial,Helvetica,sans-serif;\r
17 }\r
18 \r
19 /* Serif font. */\r
20 div.sectionbody {\r
21   font-family: Georgia,"Times New Roman",Times,serif;\r
22 }\r
23 \r
24 /* Monospace font. */\r
25 tt {\r
26   font-size: inherit;\r
27 }\r
28 \r
29 body {\r
30   margin: 1em 5% 1em 5%;\r
31 }\r
32 \r
33 a {\r
34   color: blue;\r
35   text-decoration: underline;\r
36 }\r
37 a:visited {\r
38   color: fuchsia;\r
39 }\r
40 \r
41 em {\r
42   font-style: italic;\r
43   color: navy;\r
44 }\r
45 \r
46 strong {\r
47   font-weight: bold;\r
48   color: #083194;\r
49 }\r
50 \r
51 tt {\r
52   font-size: inherit;\r
53   color: navy;\r
54 }\r
55 \r
56 h1, h2, h3, h4, h5, h6 {\r
57   color: #527bbd;\r
58   margin-top: 1.2em;\r
59   margin-bottom: 0.5em;\r
60   line-height: 1.3;\r
61 }\r
62 \r
63 h1, h2, h3 {\r
64   border-bottom: 2px solid silver;\r
65 }\r
66 h2 {\r
67   padding-top: 0.5em;\r
68 }\r
69 h3 {\r
70   float: left;\r
71 }\r
72 h3 + * {\r
73   clear: left;\r
74 }\r
75 \r
76 div.sectionbody {\r
77   margin-left: 0;\r
78 }\r
79 \r
80 hr {\r
81   border: 1px solid silver;\r
82 }\r
83 \r
84 p {\r
85   margin-top: 0.5em;\r
86   margin-bottom: 0.5em;\r
87 }\r
88 \r
89 ul, ol, li > p {\r
90   margin-top: 0;\r
91 }\r
92 ul > li     { color: #aaa; }\r
93 ul > li > * { color: black; }\r
94 \r
95 pre {\r
96   padding: 0;\r
97   margin: 0;\r
98 }\r
99 \r
100 span#author {\r
101   color: #527bbd;\r
102   font-weight: bold;\r
103   font-size: 1.1em;\r
104 }\r
105 span#email {\r
106 }\r
107 span#revnumber, span#revdate, span#revremark {\r
108 }\r
109 \r
110 div#footer {\r
111   font-size: small;\r
112   border-top: 2px solid silver;\r
113   padding-top: 0.5em;\r
114   margin-top: 4.0em;\r
115 }\r
116 div#footer-text {\r
117   float: left;\r
118   padding-bottom: 0.5em;\r
119 }\r
120 div#footer-badges {\r
121   float: right;\r
122   padding-bottom: 0.5em;\r
123 }\r
124 \r
125 div#preamble {\r
126   margin-top: 1.5em;\r
127   margin-bottom: 1.5em;\r
128 }\r
129 div.tableblock, div.imageblock, div.exampleblock, div.verseblock,\r
130 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
131 div.admonitionblock {\r
132   margin-top: 1.0em;\r
133   margin-bottom: 1.5em;\r
134 }\r
135 div.admonitionblock {\r
136   margin-top: 2.0em;\r
137   margin-bottom: 2.0em;\r
138   margin-right: 10%;\r
139   color: #606060;\r
140 }\r
141 \r
142 div.content { /* Block element content. */\r
143   padding: 0;\r
144 }\r
145 \r
146 /* Block element titles. */\r
147 div.title, caption.title {\r
148   color: #527bbd;\r
149   font-weight: bold;\r
150   text-align: left;\r
151   margin-top: 1.0em;\r
152   margin-bottom: 0.5em;\r
153 }\r
154 div.title + * {\r
155   margin-top: 0;\r
156 }\r
157 \r
158 td div.title:first-child {\r
159   margin-top: 0.0em;\r
160 }\r
161 div.content div.title:first-child {\r
162   margin-top: 0.0em;\r
163 }\r
164 div.content + div.title {\r
165   margin-top: 0.0em;\r
166 }\r
167 \r
168 div.sidebarblock > div.content {\r
169   background: #ffffee;\r
170   border: 1px solid #dddddd;\r
171   border-left: 4px solid #f0f0f0;\r
172   padding: 0.5em;\r
173 }\r
174 \r
175 div.listingblock > div.content {\r
176   border: 1px solid #dddddd;\r
177   border-left: 5px solid #f0f0f0;\r
178   background: #f8f8f8;\r
179   padding: 0.5em;\r
180 }\r
181 \r
182 div.quoteblock, div.verseblock {\r
183   padding-left: 1.0em;\r
184   margin-left: 1.0em;\r
185   margin-right: 10%;\r
186   border-left: 5px solid #f0f0f0;\r
187   color: #777777;\r
188 }\r
189 \r
190 div.quoteblock > div.attribution {\r
191   padding-top: 0.5em;\r
192   text-align: right;\r
193 }\r
194 \r
195 div.verseblock > pre.content {\r
196   font-family: inherit;\r
197   font-size: inherit;\r
198 }\r
199 div.verseblock > div.attribution {\r
200   padding-top: 0.75em;\r
201   text-align: left;\r
202 }\r
203 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
204 div.verseblock + div.attribution {\r
205   text-align: left;\r
206 }\r
207 \r
208 div.admonitionblock .icon {\r
209   vertical-align: top;\r
210   font-size: 1.1em;\r
211   font-weight: bold;\r
212   text-decoration: underline;\r
213   color: #527bbd;\r
214   padding-right: 0.5em;\r
215 }\r
216 div.admonitionblock td.content {\r
217   padding-left: 0.5em;\r
218   border-left: 3px solid #dddddd;\r
219 }\r
220 \r
221 div.exampleblock > div.content {\r
222   border-left: 3px solid #dddddd;\r
223   padding-left: 0.5em;\r
224 }\r
225 \r
226 div.imageblock div.content { padding-left: 0; }\r
227 span.image img { border-style: none; }\r
228 a.image:visited { color: white; }\r
229 \r
230 dl {\r
231   margin-top: 0.8em;\r
232   margin-bottom: 0.8em;\r
233 }\r
234 dt {\r
235   margin-top: 0.5em;\r
236   margin-bottom: 0;\r
237   font-style: normal;\r
238   color: navy;\r
239 }\r
240 dd > *:first-child {\r
241   margin-top: 0.1em;\r
242 }\r
243 \r
244 ul, ol {\r
245     list-style-position: outside;\r
246 }\r
247 ol.arabic {\r
248   list-style-type: decimal;\r
249 }\r
250 ol.loweralpha {\r
251   list-style-type: lower-alpha;\r
252 }\r
253 ol.upperalpha {\r
254   list-style-type: upper-alpha;\r
255 }\r
256 ol.lowerroman {\r
257   list-style-type: lower-roman;\r
258 }\r
259 ol.upperroman {\r
260   list-style-type: upper-roman;\r
261 }\r
262 \r
263 div.compact ul, div.compact ol,\r
264 div.compact p, div.compact p,\r
265 div.compact div, div.compact div {\r
266   margin-top: 0.1em;\r
267   margin-bottom: 0.1em;\r
268 }\r
269 \r
270 div.tableblock > table {\r
271   border: 3px solid #527bbd;\r
272 }\r
273 thead, p.table.header {\r
274   font-weight: bold;\r
275   color: #527bbd;\r
276 }\r
277 tfoot {\r
278   font-weight: bold;\r
279 }\r
280 td > div.verse {\r
281   white-space: pre;\r
282 }\r
283 p.table {\r
284   margin-top: 0;\r
285 }\r
286 /* Because the table frame attribute is overriden by CSS in most browsers. */\r
287 div.tableblock > table[frame="void"] {\r
288   border-style: none;\r
289 }\r
290 div.tableblock > table[frame="hsides"] {\r
291   border-left-style: none;\r
292   border-right-style: none;\r
293 }\r
294 div.tableblock > table[frame="vsides"] {\r
295   border-top-style: none;\r
296   border-bottom-style: none;\r
297 }\r
298 \r
299 \r
300 div.hdlist {\r
301   margin-top: 0.8em;\r
302   margin-bottom: 0.8em;\r
303 }\r
304 div.hdlist tr {\r
305   padding-bottom: 15px;\r
306 }\r
307 dt.hdlist1.strong, td.hdlist1.strong {\r
308   font-weight: bold;\r
309 }\r
310 td.hdlist1 {\r
311   vertical-align: top;\r
312   font-style: normal;\r
313   padding-right: 0.8em;\r
314   color: navy;\r
315 }\r
316 td.hdlist2 {\r
317   vertical-align: top;\r
318 }\r
319 div.hdlist.compact tr {\r
320   margin: 0;\r
321   padding-bottom: 0;\r
322 }\r
323 \r
324 .comment {\r
325   background: yellow;\r
326 }\r
327 \r
328 .footnote, .footnoteref {\r
329   font-size: 0.8em;\r
330 }\r
331 \r
332 span.footnote, span.footnoteref {\r
333   vertical-align: super;\r
334 }\r
335 \r
336 #footnotes {\r
337   margin: 20px 0 20px 0;\r
338   padding: 7px 0 0 0;\r
339 }\r
340 \r
341 #footnotes div.footnote {\r
342   margin: 0 0 5px 0;\r
343 }\r
344 \r
345 #footnotes hr {\r
346   border: none;\r
347   border-top: 1px solid silver;\r
348   height: 1px;\r
349   text-align: left;\r
350   margin-left: 0;\r
351   width: 20%;\r
352   min-width: 100px;\r
353 }\r
354 \r
355 div.colist td {\r
356   padding-right: 0.5em;\r
357   padding-bottom: 0.3em;\r
358   vertical-align: top;\r
359 }\r
360 div.colist td img {\r
361   margin-top: 0.3em;\r
362 }\r
363 \r
364 @media print {\r
365   div#footer-badges { display: none; }\r
366 }\r
367 \r
368 div#toc {\r
369   margin-bottom: 2.5em;\r
370 }\r
371 \r
372 div#toctitle {\r
373   color: #527bbd;\r
374   font-size: 1.1em;\r
375   font-weight: bold;\r
376   margin-top: 1.0em;\r
377   margin-bottom: 0.1em;\r
378 }\r
379 \r
380 div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
381   margin-top: 0;\r
382   margin-bottom: 0;\r
383 }\r
384 div.toclevel2 {\r
385   margin-left: 2em;\r
386   font-size: 0.9em;\r
387 }\r
388 div.toclevel3 {\r
389   margin-left: 4em;\r
390   font-size: 0.9em;\r
391 }\r
392 div.toclevel4 {\r
393   margin-left: 6em;\r
394   font-size: 0.9em;\r
395 }\r
396 \r
397 span.aqua { color: aqua; }\r
398 span.black { color: black; }\r
399 span.blue { color: blue; }\r
400 span.fuchsia { color: fuchsia; }\r
401 span.gray { color: gray; }\r
402 span.green { color: green; }\r
403 span.lime { color: lime; }\r
404 span.maroon { color: maroon; }\r
405 span.navy { color: navy; }\r
406 span.olive { color: olive; }\r
407 span.purple { color: purple; }\r
408 span.red { color: red; }\r
409 span.silver { color: silver; }\r
410 span.teal { color: teal; }\r
411 span.white { color: white; }\r
412 span.yellow { color: yellow; }\r
413 \r
414 span.aqua-background { background: aqua; }\r
415 span.black-background { background: black; }\r
416 span.blue-background { background: blue; }\r
417 span.fuchsia-background { background: fuchsia; }\r
418 span.gray-background { background: gray; }\r
419 span.green-background { background: green; }\r
420 span.lime-background { background: lime; }\r
421 span.maroon-background { background: maroon; }\r
422 span.navy-background { background: navy; }\r
423 span.olive-background { background: olive; }\r
424 span.purple-background { background: purple; }\r
425 span.red-background { background: red; }\r
426 span.silver-background { background: silver; }\r
427 span.teal-background { background: teal; }\r
428 span.white-background { background: white; }\r
429 span.yellow-background { background: yellow; }\r
430 \r
431 span.big { font-size: 2em; }\r
432 span.small { font-size: 0.6em; }\r
433 </style>\r
434 <script type="text/javascript">\r
435 /*<![CDATA[*/\r
436 window.onload = function(){asciidoc.footnotes(); asciidoc.toc(2);}\r
437 var asciidoc = {  // Namespace.\r
438 \r
439 /////////////////////////////////////////////////////////////////////\r
440 // Table Of Contents generator\r
441 /////////////////////////////////////////////////////////////////////\r
442 \r
443 /* Author: Mihai Bazon, September 2002\r
444  * http://students.infoiasi.ro/~mishoo\r
445  *\r
446  * Table Of Content generator\r
447  * Version: 0.4\r
448  *\r
449  * Feel free to use this script under the terms of the GNU General Public\r
450  * License, as long as you do not remove or alter this notice.\r
451  */\r
452 \r
453  /* modified by Troy D. Hanson, September 2006. License: GPL */\r
454  /* modified by Stuart Rackham, 2006, 2009. License: GPL */\r
455 \r
456 // toclevels = 1..4.\r
457 toc: function (toclevels) {\r
458 \r
459   function getText(el) {\r
460     var text = "";\r
461     for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
462       if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.\r
463         text += i.data;\r
464       else if (i.firstChild != null)\r
465         text += getText(i);\r
466     }\r
467     return text;\r
468   }\r
469 \r
470   function TocEntry(el, text, toclevel) {\r
471     this.element = el;\r
472     this.text = text;\r
473     this.toclevel = toclevel;\r
474   }\r
475 \r
476   function tocEntries(el, toclevels) {\r
477     var result = new Array;\r
478     var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');\r
479     // Function that scans the DOM tree for header elements (the DOM2\r
480     // nodeIterator API would be a better technique but not supported by all\r
481     // browsers).\r
482     var iterate = function (el) {\r
483       for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
484         if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
485           var mo = re.exec(i.tagName);\r
486           if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
487             result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
488           }\r
489           iterate(i);\r
490         }\r
491       }\r
492     }\r
493     iterate(el);\r
494     return result;\r
495   }\r
496 \r
497   var toc = document.getElementById("toc");\r
498   var entries = tocEntries(document.getElementById("content"), toclevels);\r
499   for (var i = 0; i < entries.length; ++i) {\r
500     var entry = entries[i];\r
501     if (entry.element.id == "")\r
502       entry.element.id = "_toc_" + i;\r
503     var a = document.createElement("a");\r
504     a.href = "#" + entry.element.id;\r
505     a.appendChild(document.createTextNode(entry.text));\r
506     var div = document.createElement("div");\r
507     div.appendChild(a);\r
508     div.className = "toclevel" + entry.toclevel;\r
509     toc.appendChild(div);\r
510   }\r
511   if (entries.length == 0)\r
512     toc.parentNode.removeChild(toc);\r
513 },\r
514 \r
515 \r
516 /////////////////////////////////////////////////////////////////////\r
517 // Footnotes generator\r
518 /////////////////////////////////////////////////////////////////////\r
519 \r
520 /* Based on footnote generation code from:\r
521  * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
522  */\r
523 \r
524 footnotes: function () {\r
525   var cont = document.getElementById("content");\r
526   var noteholder = document.getElementById("footnotes");\r
527   var spans = cont.getElementsByTagName("span");\r
528   var refs = {};\r
529   var n = 0;\r
530   for (i=0; i<spans.length; i++) {\r
531     if (spans[i].className == "footnote") {\r
532       n++;\r
533       // Use [\s\S] in place of . so multi-line matches work.\r
534       // Because JavaScript has no s (dotall) regex flag.\r
535       note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
536       noteholder.innerHTML +=\r
537         "<div class='footnote' id='_footnote_" + n + "'>" +\r
538         "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
539         n + "</a>. " + note + "</div>";\r
540       spans[i].innerHTML =\r
541         "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
542         "' title='View footnote' class='footnote'>" + n + "</a>]";\r
543       var id =spans[i].getAttribute("id");\r
544       if (id != null) refs["#"+id] = n;\r
545     }\r
546   }\r
547   if (n == 0)\r
548     noteholder.parentNode.removeChild(noteholder);\r
549   else {\r
550     // Process footnoterefs.\r
551     for (i=0; i<spans.length; i++) {\r
552       if (spans[i].className == "footnoteref") {\r
553         var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
554         href = href.match(/#.*/)[0];  // Because IE return full URL.\r
555         n = refs[href];\r
556         spans[i].innerHTML =\r
557           "[<a href='#_footnote_" + n +\r
558           "' title='View footnote' class='footnote'>" + n + "</a>]";\r
559       }\r
560     }\r
561   }\r
562 }\r
563 \r
564 }\r
565 /*]]>*/\r
566 </script>\r
567 </head>\r
568 <body class="article">\r
569 <div id="header">\r
570 <h1>kantan(8)</h1>\r
571 <div id="toc">
572   <div id="toctitle">Table of Contents</div>
573   <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
574 </div>\r
575 </div>\r
576 <div id="content">\r
577 <div class="sect1">\r
578 <h2 id="_name">1. Name</h2>\r
579 <div class="sectionbody">\r
580 <div class="paragraph"><p>kantan - simple test suite for autotesting software using Grml and KVM</p></div>\r
581 </div>\r
582 </div>\r
583 <div class="sect1">\r
584 <h2 id="synopsis">2. Synopsis</h2>\r
585 <div class="sectionbody">\r
586 <div class="paragraph"><p>For the server (main) instance:</p></div>\r
587 <div class="literalblock">\r
588 <div class="content">\r
589 <pre><tt>kantan server &lt;disk.img&gt; &lt;grml.iso&gt; &lt;/mnt/point/of/iso/&gt; [kvm_arguments]</tt></pre>\r
590 </div></div>\r
591 <div class="paragraph"><p>or for client(s):</p></div>\r
592 <div class="literalblock">\r
593 <div class="content">\r
594 <pre><tt>kantan client &lt;disk.img&gt; &lt;name&gt; [kvm_arguments]</tt></pre>\r
595 </div></div>\r
596 <div class="paragraph"><p>For further details please see section <a href="#options">[options]</a> and <a href="#setup">[setup]</a>.</p></div>\r
597 </div>\r
598 </div>\r
599 <div class="sect1">\r
600 <h2 id="options">3. Options</h2>\r
601 <div class="sectionbody">\r
602 <div class="paragraph"><p>Options for <em>kantan server</em>:</p></div>\r
603 <div class="literalblock">\r
604 <div class="content">\r
605 <pre><tt>&lt;disk.img&gt; &lt;grml.iso&gt; &lt;/mnt/point/of/iso/&gt; [kvm_arguments]</tt></pre>\r
606 </div></div>\r
607 <div class="paragraph"><p>where <em>disk.img</em> is an existing image file (created e.g. via <em>qemu-img create\r
608 disk.img 3G</em>), grml.iso is an a Grml ISO (<a href="http://grml.org/">http://grml.org/</a>),\r
609 /mnt/point/of/iso/ refers to the mount point where the specified Grml ISO is\r
610 mounted to (e.g. <em>mount -o loop grml-medium_sid_latest.iso /mnt/test</em>) and\r
611 <em>kvm_arguments</em> are optional and can be used to add additional arguments to the\r
612 KVM commandline, like <em>vga=791</em>.</p></div>\r
613 <div class="admonitionblock">\r
614 <table><tr>\r
615 <td class="icon">\r
616 <img src="./images/icons/tip.png" alt="Tip" />\r
617 </td>\r
618 <td class="content">The &lt;/mnt/point/of/iso/&gt; doesn&#8217;t necessarily need to be a real mountpoint.\r
619 It&#8217;s fine if you just copy linux26 and initrd.gz from /boot/* of the Grml\r
620 ISO to &lt;/path/to/foobar/boot/&gt; and specify &lt;/path/to/foobar/&gt; as mountpoint\r
621 directory then.</td>\r
622 </tr></table>\r
623 </div>\r
624 <div class="paragraph"><p>Options for <em>kantan client</em>:</p></div>\r
625 <div class="literalblock">\r
626 <div class="content">\r
627 <pre><tt>&lt;disk.img&gt; &lt;name&gt; [kvm_arguments]</tt></pre>\r
628 </div></div>\r
629 <div class="paragraph"><p>where <em>disk.img</em> is an existing image file (created e.g. via <em>qemu-img create\r
630 disk.img 3G</em>), <em>name</em> assigns the virtual instance a name (for reading\r
631 /etc/kantan/name.cfg iff the file exists). The <em>kvm_arguments</em> are optional and\r
632 can be used to add additional arguments to the KVM commandline, like <em>-boot d</em>\r
633 for booting from the ISO.</p></div>\r
634 </div>\r
635 </div>\r
636 <div class="sect1">\r
637 <h2 id="description">4. Description</h2>\r
638 <div class="sectionbody">\r
639 <div class="paragraph"><p><span class="image">\r
640 <a class="image" href="kantan-screenshot.png">\r
641 <img src="kantan-screenshot.jpg" alt="kantan-screenshot.jpg" />\r
642 </a>\r
643 </span></p></div>\r
644 <div class="paragraph"><p>Kantan is a set of scripts to automatically test software using KVM\r
645 (<a href="http://www.linux-kvm.org/">http://www.linux-kvm.org/</a>) and the Debian based Linux live system Grml\r
646 (<a href="http://grml.org/">http://grml.org/</a>). You don&#8217;t have to set up neither tons of software packages\r
647 nor a complex environment but just follow some simple <a href="#setup">setup instructions</a>.</p></div>\r
648 <div class="paragraph"><p>It was originally developed to provide a simple way for autotesting specific\r
649 versions of FAI (<a href="http://fai-project.org/">http://fai-project.org/</a>) but is expected to provide a\r
650 simple-to-use test suite for autotesting any Linux based software.</p></div>\r
651 <div class="paragraph"><p>The concept of Kantan is to boot one virtual machine (the main instance, <em>kantan\r
652 server &#8230;</em>) which is supposed to be able to serve as installation server for\r
653 further virtual machines if needed. This concept for example allows to\r
654 automatically set up a <a href="http://fai-project.org/">FAI</a> server which then\r
655 deploys further started virtual machines (the clients, <em>kantan client &#8230;</em>).</p></div>\r
656 <div class="paragraph"><p>Kantan is meant to be a prototype implementation to show how automated testing\r
657 could be realised. In the long run the author would like to get a suite to\r
658 automatically test:</p></div>\r
659 <div class="ulist"><ul>\r
660 <li>\r
661 <p>\r
662 complete Debian installations\r
663 </p>\r
664 </li>\r
665 <li>\r
666 <p>\r
667 testing Debian packages within current state of Debian suites\r
668 </p>\r
669 </li>\r
670 <li>\r
671 <p>\r
672 software configurations that are required to run on more than one host\r
673 (installation procedures with dependencies between different systems during\r
674 installation, cluster + HA setups,&#8230;)\r
675 </p>\r
676 </li>\r
677 <li>\r
678 <p>\r
679 live systems with their flexible boot options, specific features and services\r
680 </p>\r
681 </li>\r
682 <li>\r
683 <p>\r
684 kernel versions\r
685 </p>\r
686 </li>\r
687 <li>\r
688 <p>\r
689 software packages that provide unit tests\r
690 </p>\r
691 </li>\r
692 <li>\r
693 <p>\r
694 low-level tools like partitioning, LVM, mdadm,&#8230;\r
695 </p>\r
696 </li>\r
697 <li>\r
698 <p>\r
699 filesystems (crash, repair, mount,&#8230;)\r
700 </p>\r
701 </li>\r
702 </ul></div>\r
703 <div class="admonitionblock">\r
704 <table><tr>\r
705 <td class="icon">\r
706 <img src="./images/icons/caution.png" alt="Caution" />\r
707 </td>\r
708 <td class="content">This software is WIP, though released in an early stage to gain feedback,\r
709 testers and developers. It&#8217;s a prototype implementation mainly in shellscript\r
710 but is expected to be rewritten in a real scripting language like python.</td>\r
711 </tr></table>\r
712 </div>\r
713 </div>\r
714 </div>\r
715 <div class="sect1">\r
716 <h2 id="requirements">5. Requirements</h2>\r
717 <div class="sectionbody">\r
718 <div class="paragraph"><p>What you need to be able to use Kantan:</p></div>\r
719 <div class="ulist"><ul>\r
720 <li>\r
721 <p>\r
722 a Debian (based) system (any other Linux system might do it as well, but\r
723   the scripts and docs are optimised for Debian (based) systems for now)\r
724 </p>\r
725 </li>\r
726 <li>\r
727 <p>\r
728 a system running i386 or amd64 architecture (to smoothly use KVM)\r
729 </p>\r
730 </li>\r
731 <li>\r
732 <p>\r
733 at least 2GB of RAM are recommended\r
734 </p>\r
735 </li>\r
736 <li>\r
737 <p>\r
738 at least 4GB of harddisk space for &gt;=2 virtual disk images\r
739 </p>\r
740 </li>\r
741 <li>\r
742 <p>\r
743 a Grml ISO (see instructions below)\r
744 </p>\r
745 </li>\r
746 </ul></div>\r
747 </div>\r
748 </div>\r
749 <div class="sect1">\r
750 <h2 id="setup">6. Setup and Usage Instructions</h2>\r
751 <div class="sectionbody">\r
752 <div class="paragraph"><p>Install the kantan Debian package, which for now is available from\r
753 <a href="http://people.debian.org/~mika/kantan/">http://people.debian.org/~mika/kantan/</a></p></div>\r
754 <div class="paragraph"><p>Grab a Grml ISO and mount it somewhere:</p></div>\r
755 <div class="literalblock">\r
756 <div class="content">\r
757 <pre><tt>% wget download.grml.org/grml64-medium_2010.04.iso\r
758 % wget download.grml.org/grml64-medium_2010.04.iso.md5\r
759 % md5sum -c grml64-medium_2010.04.iso.md5\r
760 % sudo mount -o loop grml64-medium_2010.04.iso /mnt/test</tt></pre>\r
761 </div></div>\r
762 <div class="paragraph"><p>If necessary adjust /etc/kantan/server.cfg according to your needs.</p></div>\r
763 <div class="paragraph"><p>Create image files for use as /srv within FAI server and as harddisk for the FAI\r
764 client (qemu-img is available from qemu-utils):</p></div>\r
765 <div class="literalblock">\r
766 <div class="content">\r
767 <pre><tt>% qemu-img create fai-server.img 3G\r
768 % qemu-img create fai-client.img 3G</tt></pre>\r
769 </div></div>\r
770 <div class="paragraph"><p>If you want to provide any local Debian packages to the FAI server instance\r
771 (like for example a specific version of FAI you&#8217;d like to test) just create the\r
772 directory <em>debs</em> in the current working directory (being the one where you&#8217;ll\r
773 invoke kantan later on), like for example:</p></div>\r
774 <div class="literalblock">\r
775 <div class="content">\r
776 <pre><tt>% mkdir debs\r
777 % dget -u -d http://fai-project.org/download/squeeze/fai_3.4.4_amd64.changes\r
778 % mv fai*.deb debs/</tt></pre>\r
779 </div></div>\r
780 <div class="paragraph"><p>Finally execute the kantan script as $USER for the server instance, providing\r
781 the path to the generated image file, the Grml-ISO and the mountpoint where the\r
782 Grml ISO is mounted on:</p></div>\r
783 <div class="literalblock">\r
784 <div class="content">\r
785 <pre><tt>% kantan server fai-server.img grml64-medium_2010.04.iso /mnt/test</tt></pre>\r
786 </div></div>\r
787 <div class="paragraph"><p>Finally start the FAI client instance (the one that should be installed by the\r
788 kantan server VM), specifying <em>grml</em> as client name (so /etc/kantan/grml.cfg\r
789 would be read if it exists) and "-boot d" as boot option for KVM so it uses the\r
790 PXE ISO for booting (just drop "-boot d" then when installation of client has\r
791 finished):</p></div>\r
792 <div class="literalblock">\r
793 <div class="content">\r
794 <pre><tt>% kantan client fai-client.img grml "-boot d"</tt></pre>\r
795 </div></div>\r
796 <div class="paragraph"><p>That&#8217;s it! :) Further usage scenarious and tests will follow.</p></div>\r
797 </div>\r
798 </div>\r
799 <div class="sect1">\r
800 <h2 id="faq">7. FAQ</h2>\r
801 <div class="sectionbody">\r
802 <div class="sect2">\r
803 <h3 id="why_kantan">7.1. Why Kantan?</h3>\r
804 <div class="paragraph"><p>The author of Kantan thinks that lack of proper Q/A is one of the most annoying\r
805 issues in the open source world. So let&#8217;s do something against that.</p></div>\r
806 </div>\r
807 <div class="sect2">\r
808 <h3 id="what_does_kantan_mean">7.2. What does Kantan mean?</h3>\r
809 <div class="paragraph"><p>The author of Kantan is a friend of the\r
810 <a href="http://en.wikipedia.org/wiki/Kanban">Kanban</a> concept and created the word\r
811 Kantan based on "the Kanban of testing".  Amusingly according to\r
812 <a href="http://www.cjvlang.com/Writing/writjpn/signs/kantan.html">http://www.cjvlang.com/Writing/writjpn/signs/kantan.html</a> "Kantan is a\r
813 Chinese-style compound (on-reading) meaning <em>simple</em>." which represents the idea\r
814 of Kantan: provide a <em>simple</em> method for testing software.</p></div>\r
815 </div>\r
816 <div class="sect2">\r
817 <h3 id="kantan_vs_chroot">7.3. Why use a VM and not just a chroot?</h3>\r
818 <div class="paragraph"><p>Chroots provide a nice way for testing stuff like package installations. But\r
819 they are limited to some restricted actions. Chroots don&#8217;t properly support\r
820 testing kernel versions, bootoptions, partitioning tools, LVM, mdadm,&#8230; in a\r
821 reasonable environment.</p></div>\r
822 </div>\r
823 <div class="sect2">\r
824 <h3 id="external_system">7.4. How can I use Kantan with physical machines?</h3>\r
825 <div class="paragraph"><p>By default Kantan uses vde_switch for network configuration. This provides a\r
826 working network setup between the server and the client(s) machines without\r
827 having to configure anything. But if you want to use external, physical machines\r
828 this does not work any longer.  Instead just set up tap devices so you can\r
829 install clients on real[tm] hardware.</p></div>\r
830 <div class="paragraph"><p>Assume the following setup: the Kantan server is the server where you&#8217;re executing\r
831 "kantan server &#8230;". The test client is the machine where you want to boot\r
832 the system which would be corresponding to "kantan client &#8230;" (but instead of\r
833 executing "kantan client &#8230;" as virtual guest you&#8217;re running it on physical\r
834 machine). NIC eth0 is providing internet access (WAN). NIC eth1 is the network\r
835 link between the server and the client machine.</p></div>\r
836 <div class="literalblock">\r
837 <div class="content">\r
838 <pre><tt>+----------------+\r
839 | Kantan   ,-----|----- eth0 ----- [ Internet/WAN ]\r
840 | Server   |     |\r
841 |        [tap1]  |\r
842 |          |     |\r
843 |          `-----|----- eth1 ----- [ Test client ]\r
844 +----------------+</tt></pre>\r
845 </div></div>\r
846 <div class="paragraph"><p>Then the following configuration should do the trick for you:</p></div>\r
847 <div class="literalblock">\r
848 <div class="content">\r
849 <pre><tt># example config for /etc/network/interfaces\r
850 iface vnet inet static\r
851       post-up tunctl -u grml -g grml -t tap1 ; brctl addif vnet tap1 ; ip link set up dev tap1\r
852       post-up brctl addif vnet eth1\r
853       pre-down ip link set down dev tap1 ; tunctl -d tap1\r
854       bridge_ports none\r
855       address 192.168.10.2\r
856       netmask 255.255.255.0</tt></pre>\r
857 </div></div>\r
858 <div class="paragraph"><p>Configure /etc/kantan/server.cfg:</p></div>\r
859 <div class="literalblock">\r
860 <div class="content">\r
861 <pre><tt>VLAN1_DEVICE='tap1'</tt></pre>\r
862 </div></div>\r
863 <div class="paragraph"><p>Then execute:</p></div>\r
864 <div class="literalblock">\r
865 <div class="content">\r
866 <pre><tt>ifup vnet\r
867 echo 1 &gt; /proc/sys/net/ipv4/ip_forward\r
868 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</tt></pre>\r
869 </div></div>\r
870 <div class="paragraph"><p>To forward DNS requests from the clients to the physical net use dnsmasq:</p></div>\r
871 <div class="literalblock">\r
872 <div class="content">\r
873 <pre><tt>/etc/init.d/dnsmasq start || apt-get install dnsmasq</tt></pre>\r
874 </div></div>\r
875 </div>\r
876 </div>\r
877 </div>\r
878 <div class="sect1">\r
879 <h2 id="todos">8. TODOs</h2>\r
880 <div class="sectionbody">\r
881 <div class="sect2">\r
882 <h3 id="_known_todos">8.1. Known todos</h3>\r
883 <div class="ulist"><ul>\r
884 <li>\r
885 <p>\r
886 provide test features and tests from\r
887   <a href="http://git.grml.org/?p=grml-unittests.git;a=summary">grml-unittests</a>\r
888 </p>\r
889 </li>\r
890 <li>\r
891 <p>\r
892 better logging and data sharing support to collect data and status report\r
893   and control data flow between different virtual machines\r
894 </p>\r
895 </li>\r
896 <li>\r
897 <p>\r
898 make sure vnc and serial console display the same things during\r
899   execution within Grml\r
900 </p>\r
901 </li>\r
902 <li>\r
903 <p>\r
904 netscript.sh:\r
905 </p>\r
906 <div class="ulist"><ul>\r
907 <li>\r
908 <p>\r
909 support svn/git/&#8230; config space retrieval\r
910 </p>\r
911 </li>\r
912 <li>\r
913 <p>\r
914 improve arch and suite support through base.tgz\r
915 </p>\r
916 </li>\r
917 <li>\r
918 <p>\r
919 support canceling the script and getting a debugshell\r
920 </p>\r
921 </li>\r
922 </ul></div>\r
923 </li>\r
924 </ul></div>\r
925 </div>\r
926 <div class="sect2">\r
927 <h3 id="_checkout">8.2. Checkout</h3>\r
928 <div class="ulist"><ul>\r
929 <li>\r
930 <p>\r
931 use kvm&#8217;s monitor support for sharing/controlling data?\r
932 </p>\r
933 </li>\r
934 <li>\r
935 <p>\r
936 investigate and combine/merge features/ideas/approaches from:\r
937 </p>\r
938 <div class="ulist"><ul>\r
939 <li>\r
940 <p>\r
941 <a href="http://kvm.et.redhat.com/page/KVM-Autotest">http://kvm.et.redhat.com/page/KVM-Autotest</a>\r
942 </p>\r
943 </li>\r
944 <li>\r
945 <p>\r
946 <a href="http://lizards.opensuse.org/2010/05/25/automated-opensuse-testing/">http://lizards.opensuse.org/2010/05/25/automated-opensuse-testing/</a>\r
947 </p>\r
948 </li>\r
949 <li>\r
950 <p>\r
951 <a href="http://git.grml.org/?p=grml-unittests.git;a=summary">http://git.grml.org/?p=grml-unittests.git;a=summary</a>\r
952 </p>\r
953 </li>\r
954 <li>\r
955 <p>\r
956 <a href="http://www.mozilla.org/projects/testopia/">http://www.mozilla.org/projects/testopia/</a>\r
957 </p>\r
958 </li>\r
959 <li>\r
960 <p>\r
961 <a href="https://wiki.ubuntu.com/AutomatedTesting">https://wiki.ubuntu.com/AutomatedTesting</a>\r
962 </p>\r
963 </li>\r
964 <li>\r
965 <p>\r
966 <a href="https://wiki.ubuntu.com/AutomatedTestingDeployment">https://wiki.ubuntu.com/AutomatedTestingDeployment</a>\r
967 </p>\r
968 </li>\r
969 <li>\r
970 <p>\r
971 <a href="https://wiki.ubuntu.com/Testing/ISO/Procedures">https://wiki.ubuntu.com/Testing/ISO/Procedures</a>\r
972 </p>\r
973 </li>\r
974 <li>\r
975 <p>\r
976 <a href="https://wiki.edubuntu.org/VirtFeatureVerification">https://wiki.edubuntu.org/VirtFeatureVerification</a>\r
977 </p>\r
978 </li>\r
979 <li>\r
980 <p>\r
981 <a href="http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking#Dump_or_Monitor_switch_traffic">http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking#Dump_or_Monitor_switch_traffic</a>\r
982 </p>\r
983 </li>\r
984 <li>\r
985 <p>\r
986 <a href="http://developer.amd.com/zones/opensource/AMDTapper/Pages/default.aspx">http://developer.amd.com/zones/opensource/AMDTapper/Pages/default.aspx</a>\r
987 </p>\r
988 </li>\r
989 </ul></div>\r
990 </li>\r
991 <li>\r
992 <p>\r
993 tools that might help in automated testing:\r
994 </p>\r
995 <div class="ulist"><ul>\r
996 <li>\r
997 <p>\r
998 <a href="http://ldtp.freedesktop.org/wiki/">GNU LDTP</a>\r
999 </p>\r
1000 </li>\r
1001 <li>\r
1002 <p>\r
1003 <a href="http://seleniumhq.org/">Selenium</a>\r
1004 </p>\r
1005 </li>\r
1006 <li>\r
1007 <p>\r
1008 <a href="http://shunit.sourceforge.net/">ShUnit</a>\r
1009 </p>\r
1010 </li>\r
1011 <li>\r
1012 <p>\r
1013 <a href="http://groups.csail.mit.edu/uid/sikuli/">Sikuli</a>\r
1014 </p>\r
1015 </li>\r
1016 <li>\r
1017 <p>\r
1018 <a href="http://synflood.at/programs.html">Tuitest</a>\r
1019 </p>\r
1020 </li>\r
1021 <li>\r
1022 <p>\r
1023 <a href="http://hoopajoo.net/projects/xautomation.html">Xautomation</a>\r
1024 </p>\r
1025 </li>\r
1026 <li>\r
1027 <p>\r
1028 <a href="http://pythonpaste.org/webtest/">WebTest</a>\r
1029 </p>\r
1030 </li>\r
1031 <li>\r
1032 <p>\r
1033 <a href="http://en.wikipedia.org/wiki/List_of_GUI_testing_tools">http://en.wikipedia.org/wiki/List_of_GUI_testing_tools</a>\r
1034 </p>\r
1035 </li>\r
1036 </ul></div>\r
1037 </li>\r
1038 </ul></div>\r
1039 </div>\r
1040 </div>\r
1041 </div>\r
1042 <div class="sect1">\r
1043 <h2 id="bugs">9. Bugs</h2>\r
1044 <div class="sectionbody">\r
1045 <div class="paragraph"><p>Probably. We just need a test suite for Kantan for testing.</p></div>\r
1046 </div>\r
1047 </div>\r
1048 <div class="sect1">\r
1049 <h2 id="author">10. Author</h2>\r
1050 <div class="sectionbody">\r
1051 <div class="paragraph"><p>Michael Prokop &lt;<a href="mailto:mika@grml.org">mika@grml.org</a>&gt;</p></div>\r
1052 </div>\r
1053 </div>\r
1054 </div>\r
1055 <div id="footnotes"><hr /></div>\r
1056 <div id="footer">\r
1057 <div id="footer-text">\r
1058 Last updated 2011-04-18 15:29:52 CEST\r
1059 </div>\r
1060 </div>\r
1061 </body>\r
1062 </html>\r