<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog/shl@INTERDOSE &#187; Shells &amp; Scripting</title>
	<atom:link href="http://blogs.interdose.com/sebastian/topics/shells-scripting/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.interdose.com/sebastian</link>
	<description>Interdose Ltd. &#38; Co KG</description>
	<lastBuildDate>Wed, 17 Mar 2010 22:58:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#8220;Things&#8221; per git und der iDisk syncen</title>
		<link>http://blogs.interdose.com/sebastian/2010/02/24/things-per-git-und-der-idisk-syncen/</link>
		<comments>http://blogs.interdose.com/sebastian/2010/02/24/things-per-git-und-der-idisk-syncen/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 09:33:40 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[getting things done]]></category>
		<category><![CDATA[GTD]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=2677</guid>
		<description><![CDATA[Things ist ein großartiges Produkt. (Punkt! Dem ist nichts hinzuzufügen!)
Nutzer von .Mac bzw. MobileMe können mit der Hilfe der iDisk und etwas git-Magie™ allerdings noch ein Stückchen mehr awesome bauen, nämlich ein Sync der Things-Datenbank über mehrere Macs.
Vorgeplänkel:

Wenn Du Things auf mehr als einem Mac nutzen möchtest, dann kaufe bitte eine entsprechende Anzahl von Lizenzen. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://culturedcode.com/things/">Things</a> ist ein großartiges Produkt. (<strong>Punkt!</strong> Dem ist nichts hinzuzufügen!)<br />
Nutzer von <a href="http://www.apple.com/de/mobileme/">.Mac</a> bzw. <a href="http://www.apple.com/de/mobileme/">MobileMe</a> können mit der Hilfe der <a href="http://www.apple.com/mobileme/features/idisk.html">iDisk</a> und etwas <a href="http://git-scm.com/">git</a>-Magie™ allerdings noch ein Stückchen mehr <em>awesome</em> bauen, nämlich ein Sync der Things-Datenbank über mehrere Macs.</p>
<p><strong>Vorgeplänkel:</strong></p>
<ul>
<li>Wenn Du Things auf mehr als einem Mac nutzen möchtest, dann kaufe bitte eine entsprechende Anzahl von <a href="http://sites.fastspring.com/culturedcode/product/main">Lizenzen</a>. </li>
<li>Ja, ich meine das ernst &#8211; die Buben aus <a href="http://culturedcode.com/about/">Stuttgart</a> haben wahnsinnig gute Arbeit geleistet, sowas muß man einfach würdigen.</li>
<li>Ich gehe davon aus, daß Du ein lauffähiges <a href="http://git-scm.com/">git</a> auf Deinem Mac hast, <a href="http://www.google.de/search?q=git+osx">Anleitungen hierzu gibt es genug im Netz</a>.</li>
<li>Ich habe vor langer Zeit den symlink <code>/Volumes/iDisk</code> erstellt, um einen generischen Zugriffspfad zu haben. In den kompletten Zeilen weiter unten referenziere ich diesen Pfad. Der Name Deiner iDisk ist Dein Benutzername, ersetze also entsprechend <code>iDisk</code> mit <code>$Du</code>.</li>
</ul>
<p><strong>Let&#8217;s get dirty!</strong><br />
Auf dem Mac mit installiertem und genutztem Things erstellen wir ein git-Repository. Things legt seine Datenbank als XML in <code>~/Library/Application Support/Cultured Code/Things</code> ab, und damit das Setup einfach bleibt, nutzen wir auch genau diesen Pfad für das Repository.<br />
<code>cd ~/Library/Application\ Support/Cultured\ Code/Things<br />
git init<br />
git add .<br />
git commit -a -m "initial commit"</code></p>
<p>Sobald das neu erstellte Repository existiert und mit den bisherigen Daten gefüllt ist, erstellen wir erst ein neues Repository auf der iDisk (<code>--bare</code> weil wir in diesem Repository nicht arbeiten wollen, sondern es nur als &#8220;Server&#8221; benutzt wird) und pushen die Daten dort hin.<br />
<code>git clone --bare . /Volumes/iDisk/Repository/things.git<br />
git remote add idisk /Volumes/iDisk/Repository/things.git<br />
git push idisk master</code><br />
Der Name &#8220;iDisk&#8221; für das remote-Repository ist hierbei frei gewählt.</p>
<p>Das folgende Shell-Script wird in Zukunft die oben angesprochene Magie™ für uns übernehmen, daher bitte einmal copy&#038;paste, <code>chmod +x</code> und mit dem gewünschten Zeitpunkt in die <code>crontab</code> des eigenen Users eintragen.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #007800;">DATE</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>Cultured\ Code<span style="color: #000000; font-weight: bold;">/</span>Things
git pull idisk master
git commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Auto Sync - <span style="color: #007800;">$DATE</span>&quot;</span>
git push idisk master</pre></td></tr></table></div>

<p>Bis hier haben wir ein Backup-System mit Versionshistorie, aber von einem zweiten Mac war bisher noch nicht die Rede, oder? Also&#8230;</p>
<p><strong>Schickt die Clone herrein!</strong></p>
<p>Auf dem zweiten oder <em>siebzenten</em> Mac Things installieren und mit der leeren Datenbank beenden.</p>
<p><code>cd ~/Library/Application\ Support/Cultured\ Code<br />
mv Things Things.dist<br />
git clone /Volumes/iDisk/Repository/things.git<br />
</code></p>
<p>Und auch auf diesem Apfel lassen wir das obige Shell-Script per <code>cron</code> laufen. Ich empfehle hier die Zeitpunkte nicht zu nah aneinander zu legen, so daß Kollisionen bestmöglich vermieden werden.</p>
<p><strong>Kollisionen:</strong><br />
Auch wenn <a href="http://git-scm.com/">git</a> mit Kollisionen umgehen kann, dieser Weg sollte nur so weit als Sicher bezeichnet werden, als das nur ein Mensch an einem Mac parallel arbeitet. Mit etwas mehr Magie™ läßt sich sicherlich ein Weg finden, die Things Datenbank bei Änderungen aus mehreren Quellen entsprechend zu mergen, aber diese Anforderung stellte sich bei der Motivation dieser Anleitung nicht. Für Vorschläge bin ich immer offen. <img src='http://blogs.interdose.com/sebastian/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Egal was Du tust, sichere Deine Daten! Ich bin zwar kein Fießling, und absichtlich werden hier niemals Fehler zu finden sein, aber wer blind ein <code>rm -rf /</code> abtippt, dem ist nicht mehr zu helfen. <strong>Sichere Deine Daten, denke nach was Du tust, teste was man testen kann.</strong></p>
<p>Inspiriert von:</p>
<ul>
<li><a href="http://culturedcode.com/things/wiki/index.php/Syncing_Things_with_git_and_Launchd">Syncing Things with git and Launchd</a></li>
<li><a href="http://www.komprovisation.de/news/show/3">Git, iDisk und so</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2010/02/24/things-per-git-und-der-idisk-syncen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSolaris: git help &#8211;web</title>
		<link>http://blogs.interdose.com/sebastian/2010/01/26/opensolaris-git-help-web/</link>
		<comments>http://blogs.interdose.com/sebastian/2010/01/26/opensolaris-git-help-web/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 15:37:01 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[(Open)Solaris]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[OpenSolaris]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=2354</guid>
		<description><![CDATA[Um die Web-Hilfe von git auf OpenSolaris nutzen zu koennen ist leider etwas Handarbeit noetig.
git clone git://git.kernel.org/pub/scm/git/git.git
cd git
make quick-install-html
pfexec mkdir -p /usr/share/doc/git-doc
cd /usr/share/doc/git-doc
pfexec mv ~/share/doc/git-doc/* .
Nun funktioniert z.B. git help --web init wie erwartet, und der Browser wird geoeffent um die Hilfe-Seite anzuzeigen.
Wenn das git-Repository sonst nicht mehr benoetigt wird kann es natuerlich anschliessend wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Um die Web-Hilfe von git auf OpenSolaris nutzen zu koennen ist leider etwas Handarbeit noetig.</p>
<p><code>git clone git://git.kernel.org/pub/scm/git/git.git<br />
cd git<br />
make quick-install-html<br />
pfexec mkdir -p /usr/share/doc/git-doc<br />
cd /usr/share/doc/git-doc<br />
pfexec mv ~/share/doc/git-doc/* .</code></p>
<p>Nun funktioniert z.B. <code>git help --web init</code> wie erwartet, und der Browser wird geoeffent um die Hilfe-Seite anzuzeigen.<br />
Wenn das git-Repository sonst nicht mehr benoetigt wird kann es natuerlich anschliessend wieder geloescht werden. Ebenso <code>~/share</code>, <strong>sofern</strong> keine anderen Daten dort gelagert werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2010/01/26/opensolaris-git-help-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsync vs. zfs send&#124;zfs receive</title>
		<link>http://blogs.interdose.com/sebastian/2010/01/20/zfs-send-receive-statt-rsync/</link>
		<comments>http://blogs.interdose.com/sebastian/2010/01/20/zfs-send-receive-statt-rsync/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 09:57:38 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[(Open)Solaris]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=2319</guid>
		<description><![CDATA[Problemstellung:

die Daten eines auf MacOS X erstellten ZPools sollen auf eine OpenSolaris-Maschine uebertragen werden.

Gedankengang #1:
Es war schon spaet abends, wirklich nachgedacht wurde nicht, klein Sebastian startet ein rsync und denkt &#8220;so lang wird das schon nicht dauern&#8221;. Problematik dabei ist bzw. war allerdings, dass auf dem Pool u.A. auch diverse OpenSource-Projekte und -Sammlungen im Quelltext [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Problemstellung:</strong></p>
<ul>
<li>die Daten eines auf <a href="http://blogs.interdose.com/sebastian/2009/10/25/unofficial-fork-zfs-for-macos-x/">MacOS X erstellten ZPool</a>s sollen auf eine <a href="http://www.opensolaris.org">OpenSolaris</a>-Maschine uebertragen werden.</li>
</ul>
<p><strong>Gedankengang #1:</strong><br />
Es war schon spaet abends, wirklich nachgedacht wurde nicht, klein Sebastian startet ein <a href="http://samba.anu.edu.au/rsync/">rsync</a> und denkt &#8220;so lang wird das schon nicht dauern&#8221;. Problematik dabei ist bzw. war allerdings, dass auf dem Pool u.A. auch diverse OpenSource-Projekte und -Sammlungen im Quelltext vorlagen, so z.B. <a href="http://www.netbsd.org/docs/software/packages.html">pkgsrc</a>, was ohne mit der Wimper zu zucken zu mehreren Millionen kleinen Files fuehrt. Ebenfalls kam der kleine Sebastian nicht auf die Idee fuer das rsync ein LAN-Kabel anzuschliessen und schickte den kompletten Datenstrom ueber WLAN durch die Luft. (Immerhin zwar <em>n</em>, aber im Vergleich zu Gigabit-Ethernet immernoch langsam.) Einigen wir uns auf <em>keine so gute Idee</em>, auch wenn sie zum Ziel gefuehrt hat.</p>
<p><code>rsync -avzP -e "ssh -p 22" /Volumes/tank/* shl@&lt;ziel&gt;:/tank/transfer</code> </p>
<p><strong>Gedankengang #2:</strong> (ein paar Tage spaeter)<br />
Die Daten sind auf dem neuen Pool angekommen &#8211; so weit so gut. Und damit es noch einen Lern-Erfolg gibt, machen wir das jetzt nochmal <em>in richtig</em>. Damit ich den &#8211; in diesem Falle &#8211; ueberfluessigen Layer Netzwerk los werde, schliesse ich die USB-Platten vom Mac direkt an die OpenSolaris-Box an. Hierfuer muss der Pool allerdings erst umbenannt werden, da eine Maschine nicht zwei Pools des gleichen Namens mounten kann. </p>
<p><code>sudo zpool export tank<br />
sudo zpool import oldtank tank<br />
sudo zpool export oldtank</code></p>
<p>Die Schritte im Detail: wir exportieren den Pool, damit wir ihn per import &lt;neu&gt; &lt;alt&gt; umbenennen koennen und exportieren ihn nochmals, damit wir ihn an die andere Kiste anschliessen koennen. Hier noch ein </p>
<p><code>pfexec zpool import oldtank</code></p>
<p>und zumindest das erste Problem ist gegessen.</p>
<p><a href="http://hub.opensolaris.org/bin/view/Community+Group+zfs/">ZFS</a> bietet von Haus aus eine durchdachte Moeglichkeit an um Daten von A nach B zu schieben, naemlich <code>zfs send | zfs receive</code>. Durch die Pipe (<code>|</code>) kann man hier auch prima z.B. <a href="http://www.openssh.com/">ssh</a> als Transport-Medium nutzen. Allerdings kann <code>zfs send</code> nur Snapshots uebertragen &#8211; aber bei einem Filesystem was effektiv still steht (hier <em>oldtank</em>) tut das ja nun wirklich nicht weh.</p>
<p>Das folgende Script habe ich die letzten Monate auf meinem Mac zum snapshot&#8217;en benutzt. In groben Zuegen basiert es auf <a href="http://jeffhigham.blogspot.com/2008/10/jeffs-zfs-snapshot-script-zfs.html">Jeff&#8217;s Snapshot-Script</a>, allerdings erstellen wir hier keinen Timestamp sondern einen hoffentlich eindeutigen String fuer die Snapshots die wir kopieren moechten, in diesem Falle &#8220;<em>NOWITSTHETIME</em>&#8220;.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">FS</span>=<span style="color: #000000; font-weight: bold;">`</span>zfs list <span style="color: #660033;">-t</span> filesystem <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> oldtank <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'/^[a-z0-9]+\//{ print $1}'</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #666666; font-style: italic;">#NOW=`date +%Y-%m-%d`</span>
<span style="color: #007800;">NOW</span>=NOWITSTHETIME
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> I <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$FS</span>; <span style="color: #000000; font-weight: bold;">do</span>
 <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Snapshot'ing <span style="color: #007800;">${I}</span>@<span style="color: #007800;">$NOW</span> ...&quot;</span>
 zfs snapshot <span style="color: #800000;">${I}</span><span style="color: #000000; font-weight: bold;">@</span><span style="color: #007800;">$NOW</span>
 <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> = <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;success!&quot;</span>
 <span style="color: #000000; font-weight: bold;">else</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;failed ($?)!&quot;</span>
 <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></td></tr></table></div>

<p>Im naechsten Script &#8211; ich entschuldige mich im Vorfeld fuer die massive und z.T. unnoetige Nutzung von <a href="http://www.gnu.org/software/grep/">grep</a>, aber mir gefaellt das halt so <img src='http://blogs.interdose.com/sebastian/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  &#8211; schicken wir die eben erstellten Snapshots nach <code>tank/transfer2</code> (vorher natuerlich anlegen, sonst wird das nix&#8230;):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span>zfs list <span style="color: #660033;">-rH</span> <span style="color: #660033;">-t</span> snapshot <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> oldtank <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> tank<span style="color: #000000; font-weight: bold;">/</span>transfer2<span style="color: #000000; font-weight: bold;">/</span>oldtank <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> NOWITSTHETIME<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;sending Snapshot&quot;</span> <span style="color: #007800;">$i</span> <span style="color: #ff0000;">&quot;to transfer2&quot;</span>
pfexec zfs send <span style="color: #007800;">$i</span> <span style="color: #000000; font-weight: bold;">|</span> pfexec zfs receive tank<span style="color: #000000; font-weight: bold;">/</span>transfer2<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></td></tr></table></div>

<p>Fragt sich nun natuerlich: <strong>was haben wir gewonnen?</strong><br />
<code>zfs send</code> serialisiert den Datenstrom, was z.B. dazu fuehrt, dass es vollkommen egal ist, ob wir mit Millionen von kleinen Dateien oder drei grossen 1TB-Files arbeiten. Ebenfalls koennen wir uns den kompletten Weg der Daten sicher ueber deren Zustand sein, denn wir vertrauen durchweg auf die Integritaetschecks von ZFS. Wenn gewuenscht (ich habe nicht wirklich einen Sinn darin gesehen) kann man durch die Pipes noch z.B. <a href="http://www.gzip.org/">gzip</a> einbauen, oder eben Transport-Mechanismen wir <a href="http://www.openssh.org">ssh</a> oder sonstwas nutzen. Konstrukte wie </p>
<p><code> zfs send tank@BRIEFTAUBE &gt; file</code><br />
<em><a href="http://de.wikipedia.org/wiki/Monkey_Island">Benutze</a> <code>file</code> mit Brieftaube</em><br />
<code> cat file | zfs receive tank@BRIEFTAUBE</code></p>
<p>sind genauso moeglich. Und auch die Nutzung als Backup ist durchaus eine Ueberlegung wert.<br />
Um zur urspruenglichen Problemstellung zurueck zu kommen: im Vergleich zur Methode #1 ist die Loesung mit <code>zfs send</code> eindeutig schneller. Und &#8211; <em>zumindest ich</em> &#8211; habe damit ein besseres Gefuehl.</p>
<p>Beide Scripte sind per <a href="http://git-scm.com/">git</a> auf <a href="http://github.com/shl/zfssnapsend">github</a> verfuegbar.<br />
(<code>git clone git://github.com/shl/<a href="http://github.com/shl/zfssnapsend">zfssnapsend</a>.git</code>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2010/01/20/zfs-send-receive-statt-rsync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IP-based ACLs in OpenAFS</title>
		<link>http://blogs.interdose.com/sebastian/2009/10/02/ip-based-acls-in-openafs/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/10/02/ip-based-acls-in-openafs/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 16:57:35 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[OpenAFS]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=1700</guid>
		<description><![CDATA[Wiedermal hat mich Jakob auf die richtige Idee gebracht. ACLs innerhalb einer AFS-Zelle können auch IP-basiert genutzt werden.
Was bedeutet das nun:
Hier wird nicht der User bzw. Kerberos-Prinzipal mit ACLs versehen, sondern die Quell-IP des anfragenden Systems. 
Anstatt 
pts createuser JohnDoe
pts adduser JohnDoe Marketing
fs setacl $foo $bar $baz
wird für eine einzelne IP (z.B. einen dedizierten Server [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.interdose.com/sebastian/2009/09/28/video-stream-zum-openafs-workshop-in-rom/">Wie</a><a href="http://blogs.interdose.com/sebastian/2009/05/26/quota-consistency-check-for-afs/">der</a><a href="http://blogs.interdose.com/sebastian/2008/08/08/ro-vs-rw/">mal</a> hat mich <a href="http://blogs.noname-ev.de/sur5r">Jakob</a> auf die richtige Idee gebracht. <strong>ACLs innerhalb einer <a href="http://blogs.interdose.com/sebastian/tags/openafs/">AFS</a>-Zelle können auch IP-basiert genutzt werden.</strong></p>
<p><strong>Was bedeutet das nun:<br />
</strong>Hier wird nicht der User bzw. <a href="http://blogs.interdose.com/sebastian/tags/kerberos/">Kerberos</a>-Prinzipal mit ACLs versehen, sondern die Quell-IP des anfragenden Systems. </p>
<p>Anstatt </p>
<p><code>pts createuser <em>JohnDoe</em><br />
pts adduser <em>JohnDoe Marketing</em><br />
fs setacl <em>$foo $bar $baz</em></code></p>
<p>wird für eine einzelne IP (z.B. einen dedizierten Server für einen Dienst, der sich nicht wirklich <em>kerberisieren</em> lässt)</p>
<p><code>pts creategroup <em>HardToKerberize</em><br />
pts createuser <em><a href="http://blogs.interdose.com/sebastian/2008/02/05/ipv4-subnetze-ohne-schmerzen/">172.23.42.</a><a href="http://blogs.interdose.com/sebastian/2008/07/19/kleiner-hinweis/">666</a></em><br />
pts adduser <em><a href="http://blogs.interdose.com/sebastian/2008/02/05/ipv4-subnetze-ohne-schmerzen/">172.23.42.</a><a href="http://blogs.interdose.com/sebastian/2008/07/19/kleiner-hinweis/">666</a></em> <em>HardToKerberize</em><br />
fs setacl <em>$foo $bar $baz</em></code></p>
<p>Um die Übersicht zu behalten bietet es sich an, neben exzessiver Dokumentation der eigenen Zelle (ja, das war ein <strong>Zaunpfahl</strong>), für IPs Gruppen zu erstellen, allein schon weil <a href="http://www.openafs.org">OpenAFS</a> nicht mit der <a href="http://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing">CIDR</a>-Notation klar kommt. </p>
<p>Und bevor nun jemand ganze IP-Ranges von Hand eintippt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># encoding: utf-8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;pts creategroup LAN-172.31&quot;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">256</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">256</span><span style="color: black;">&#41;</span>:
      <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;pts createuser 172.31.&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;.&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;pts adduser 172.31.&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;.&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; LAN-172.31&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Natürlich &#8211; wie immer &#8211; erst denken, dann anpassen, dann abtippen, dann ausführen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/10/02/ip-based-acls-in-openafs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spaß zwischendurch: Tetris in der Z-Shell</title>
		<link>http://blogs.interdose.com/sebastian/2009/08/07/spas-zwischendurch-tetris-in-der-z-shell/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/08/07/spas-zwischendurch-tetris-in-der-z-shell/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 08:05:21 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=1423</guid>
		<description><![CDATA[Bekannt, daß die Z-Shell Tetris kann?
autoload -U tetris
zle -N tetris
bindkey "^Xt" tetris
Ein beherzter Druck auf [CTRL]-[X]-[T] und los geht der Spaß!

Danke Stefan.  
]]></description>
			<content:encoded><![CDATA[<p><strong>Bekannt, daß die Z-Shell <a href="http://de.wikipedia.org/wiki/Tetris">Tetris</a> kann?</strong></p>
<p><code>autoload -U tetris<br />
zle -N tetris<br />
bindkey "^Xt" tetris</code></p>
<p>Ein beherzter Druck auf [CTRL]-[X]-[T] und los geht der Spaß!<br />
<a href="http://upload.blogs.interdose.com/sebastian//2009/08/Picture-5.PNG"><img src="http://upload.blogs.interdose.com/sebastian//2009/08/Picture-5-300x229.PNG" alt="Picture 5" title="Picture 5" width="300" height="229" class="aligncenter size-medium wp-image-1424" /></a></p>
<p>Danke <a href="http://www.xxzz.de/">Stefan</a>. <img src='http://blogs.interdose.com/sebastian/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/08/07/spas-zwischendurch-tetris-in-der-z-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kleine Hilfestellung</title>
		<link>http://blogs.interdose.com/sebastian/2009/06/30/kleine-hilfestellung/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/06/30/kleine-hilfestellung/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 15:30:47 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[allgemeines]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/2009/06/30/kleine-hilfestellung/</guid>
		<description><![CDATA[Wenn auf unixoiden Systemen etwas nicht auf Anhieb funktioniert, dann lohnt sich immer ein Blick in die Log-Dateien. Z.B. /var/log/syslog und /var/log/messages ggf. auch unter /var/adm/log zu finden. 
Ich kann das gar nicht oft genug betonen.
]]></description>
			<content:encoded><![CDATA[<p>Wenn auf unixoiden Systemen etwas nicht auf Anhieb funktioniert, dann lohnt sich <strong>immer</strong> ein Blick in die Log-Dateien. Z.B. <code>/var/log/syslog</code> und <code>/var/log/messages</code> ggf. auch unter <code>/var/adm/log</code> zu finden. </p>
<p><font size="+2">Ich kann das gar nicht oft genug betonen.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/06/30/kleine-hilfestellung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Z-Shell mit growl-Notification</title>
		<link>http://blogs.interdose.com/sebastian/2009/06/17/z-shell-mit-growl-notification/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/06/17/z-shell-mit-growl-notification/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 19:31:14 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Shells & Scripting]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=1162</guid>
		<description><![CDATA[Andreas hat sich die Mühe gemacht die grml.org Z-Shell Config um eine kleine aber tolle Funktion zu erweitern: growl notifications.
Mit diesem Patch (Download vom lokaler Mirror) wird bei einer definierbaren Gruppe von Befehlen eine Growl-Notification versendet, sobald die Ausführung abgeschlossen ist. 
In der Zeile 2011 wird die Liste der growlifizierten Kommandos definiert. 
GROWL_COMMANDS=(rsync scp cp [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.kungi.org">Andreas</a> hat sich die Mühe gemacht die <a href="http://www.grml.org">grml.org</a> <a href="http://michael-prokop.at/blog/2007/12/22/make-console-work-comfortable/">Z-Shell Config</a> um eine kleine aber tolle Funktion zu erweitern: <strong>growl notifications</strong>.</p>
<p>Mit diesem <a href="http://upload.blogs.interdose.com/sebastian/manual/media/patches/zsh-growl.patch">Patch</a> (Download vom lokaler Mirror) wird bei einer definierbaren Gruppe von Befehlen eine <a href="http://growl.info/">Growl</a>-Notification versendet, sobald die Ausführung abgeschlossen ist. </p>
<p>In der Zeile <a href="http://git.kungi.org/git/dotfiles/tree/zsh/zshrc#n2011">2011</a> wird die Liste der <i>growlifizierten</i> Kommandos definiert. </p>
<pre>GROWL_COMMANDS=(rsync scp cp sleep svn git)</pre>
<p>Diese Zeile entsprechend erweitern oder kürzen, ganz nach eigenem Geschmack. <code>sleep</code> ist praktisch zum testen. </p>
<p>Danke, <a href="http://blog.kungi.org">Andreas</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/06/17/z-shell-mit-growl-notification/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>quota consistency check for AFS</title>
		<link>http://blogs.interdose.com/sebastian/2009/05/26/quota-consistency-check-for-afs/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/05/26/quota-consistency-check-for-afs/#comments</comments>
		<pubDate>Tue, 26 May 2009 20:29:42 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[OpenAFS]]></category>
		<category><![CDATA[Shells & Scripting]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=894</guid>
		<description><![CDATA[Jakob hat sich die Mühe gemacht und gescriptet:
I&#8217;m wondering for quite some time now, why there is no simple method the check whether the sum of the volume quotas exceeds the available disk space for each paritition on an AFS fileserver.
Und das Ergebnis (zu finden in seinem Blog) funktioniert prima.
Danke Jakob.
]]></description>
			<content:encoded><![CDATA[<p><a href="https://blogs.noname-ev.de/sur5r/">Jakob</a> hat sich die Mühe gemacht und gescriptet:<br />
<blockquote>I&#8217;m wondering for quite some time now, why there is no simple method the check whether the sum of the volume quotas exceeds the available disk space for each paritition on an AFS fileserver.</p></blockquote>
<p>Und das Ergebnis (zu finden in <a href="https://blogs.noname-ev.de/sur5r/archives/14-Quota-consistency-check-for-AFS.html">seinem Blog</a>) funktioniert prima.<br />
Danke Jakob.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/05/26/quota-consistency-check-for-afs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VMWare ESXi &#8211; VMs &#8220;clonen&#8221;</title>
		<link>http://blogs.interdose.com/sebastian/2009/03/10/vmware-esxi-virtuelle_maschinen-clonen/</link>
		<comments>http://blogs.interdose.com/sebastian/2009/03/10/vmware-esxi-virtuelle_maschinen-clonen/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 17:00:45 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=376</guid>
		<description><![CDATA[Wer mit dem &#8220;VMWare Virtual Infrastructure Client&#8221; in Verbindung mit VMWare&#8217;s ESXi arbeitet, wird eine Funktion vergeblich suchen: das Uebertragen von Maschinen auf andere ESXi-Host, genauso wie das Duplizieren von virtuellen Maschinen. Wer sich nicht vor einer SSH-Session fuerchtet, dem sei geholfen.
Hinweis: der nachfolgende Weg ist absolut unsupported (weder von VMWare noch von mir oder [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit dem &#8220;VMWare Virtual Infrastructure Client&#8221; in Verbindung mit VMWare&#8217;s ESXi arbeitet, wird eine Funktion vergeblich suchen: das Uebertragen von Maschinen auf andere ESXi-Host, genauso wie das Duplizieren von virtuellen Maschinen. Wer sich nicht vor einer SSH-Session fuerchtet, dem sei geholfen.</p>
<p><strong>Hinweis:</strong> der nachfolgende Weg ist absolut unsupported (weder von VMWare noch von mir oder sonst irgendjemandem) und sollte nur dann gewaehlt werden wenn man an einem potentiellem Desaster schuld sein moechte. Ich hab Euch gewarnt! </p>
<p>Als ersten Schritt muessen wir dem ESXi einen SSH-Zugang beibringen. Dazu bitte ins Rechenzentrum fahren oder in den Server-Raum gehen und lokal an die Maschine setzen. Was huepsche gelb/schwarz eines VMWare-Hosts kann durch <em>CTRL-ALT-F1</em> in eine Linux-Konsole verwandelt werden (naja, fast zumindest). Was man jetzt <em>nicht</em> sieht, ist der Login-Dialog. Bitte blind <code>unsupported</code> eintippen, gefolgt vom gewaehlten <em>root</em>-Passwort, sobald der ESXi dazu auffordert. Falls es nicht sofort klappt, einfach ein paar mal die <em>Enter</em>-Taste druecken und von vorne anfangen.<br />
In der Datei <code>/etc/inetd.conf</code> das &#8220;#&#8221;-Zeichen vor dem SSH-Eintrag entfernen und speichern. Jetzt kommt Murphy in&#8217;s Spiel. Bei einigen meiner ESXi&#8217;s hat es gereicht die relevanten Dienste mittels <code>/sbin/services.sh restart</code> neu zu starten um den <em>SSHd</em> zu aktivieren, andere ESXi&#8217;s wollten komplett gebootet werden. Versucht einfach schlimmstenfalls beides. </p>
<p>Naechster Schritt: man nehme einen SSH-Client (schlimmstenfalls PuTTY) und versuche einen Connect als &#8220;<em>root</em>&#8221; auf Port 22 der Management-IP. </p>
<p>Im Verzeichnis <code>/vmfs/volumes/datastore</code> findet man nun das VMFS der virtuellen Maschinen, und kann sie per SCP auf andere ESX- und ESXi-Hosts uebertragen.</p>
<p>Interessant sind die VMDK-Files, denn hier sind die Konfigurationen sowie die virtuellen Platten versteckt. Die VMDK-Files einfach auf einen anderen Host kopieren und notfalls in der <em>Maschinenname</em>.VMDK die Pfade anpassen. Die restlichen Dateien sind fuer das Clonen nicht relevant und koennen getrost ignoriert werden. Sie werden bei Import der virtuellen Festplatte im Infrastructure Client neu angelegt. </p>
<p>That&#8217;s it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2009/03/10/vmware-esxi-virtuelle_maschinen-clonen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UNIX tips: Productivity tips</title>
		<link>http://blogs.interdose.com/sebastian/2008/07/08/unix-tips-productivity-tips/</link>
		<comments>http://blogs.interdose.com/sebastian/2008/07/08/unix-tips-productivity-tips/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 17:19:23 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[Un*x]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=61</guid>
		<description><![CDATA[Nur ein Link, aber durchaus lesenswert: UNIX tips: Productivity tips
Useful command-line secrets for increasing productivity in the office
]]></description>
			<content:encoded><![CDATA[<p>Nur ein Link, aber durchaus lesenswert: <a href="http://www-128.ibm.com/developerworks/aix/library/au-productivitytips.html?ca=dgr-lnxw07UNIX-Office-Tips">UNIX tips: Productivity tips</a></p>
<blockquote><p>Useful command-line secrets for increasing productivity in the office</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2008/07/08/unix-tips-productivity-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AFS, Windows und die Powershell</title>
		<link>http://blogs.interdose.com/sebastian/2008/07/03/afs-windows-und-die-powershell/</link>
		<comments>http://blogs.interdose.com/sebastian/2008/07/03/afs-windows-und-die-powershell/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 15:12:18 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[OpenAFS]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/?p=54</guid>
		<description><![CDATA[
Fühlt sich zwar seltsam an, aber man kann durchaus damit arbeiten.  
]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.interdose.com/sebastian/wp-content/uploads/2008/07/powershell-afs.png"><img src="http://blogs.interdose.com/sebastian/wp-content/uploads/2008/07/powershell-afs-300x156.png" alt="Windows Powershell und OpenAFS" title="powershell-afs" width="300" height="156" class="alignnone size-medium wp-image-55" /></a></p>
<p>Fühlt sich zwar seltsam an, aber man kann durchaus <a href="http://blogs.interdose.com/sebastian/2008/06/24/openafs-fur-windows-1539/">damit</a> <a href="http://blogs.interdose.com/sebastian/2008/02/16/afsinterdosenet-openafs-im-einsatz/">arbeiten</a>. <img src='http://blogs.interdose.com/sebastian/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2008/07/03/afs-windows-und-die-powershell/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Software-Deployment per PXE/Netboot</title>
		<link>http://blogs.interdose.com/sebastian/2008/03/19/software-deployment-per-pxenetboot/</link>
		<comments>http://blogs.interdose.com/sebastian/2008/03/19/software-deployment-per-pxenetboot/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 11:52:49 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/2008/03/19/software-deployment-per-pxenetboot/</guid>
		<description><![CDATA[Software-Deployment von Hand ist grausam &#8211; da sind wir uns wohl alle einig. Früher&#8482; war es durchaus etwas grausamer &#8211; ich erinnere mich grade an das Disketten-Gebirge von Novell Netware oder OS/2 zurück &#8211; doch auch heute schubsen wir immernoch Betriebssystem auf Rechner, also eigentlich genau wie früher. 
Ein schöner Vorteil der &#8220;freien&#8221; Betriebssysteme ist [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Software_deployment">Software-Deployment</a> von Hand ist grausam &#8211; da sind wir uns wohl alle einig. Früher&trade; war es durchaus etwas grausamer &#8211; ich erinnere mich grade an das Disketten-Gebirge von <a href="http://en.wikipedia.org/wiki/Novell_NetWare">Novell Netware</a> oder <a href="http://de.os2.org/index.php3">OS/2</a> zurück &#8211; doch auch heute schubsen wir immernoch Betriebssystem auf Rechner, also eigentlich genau wie früher. </p>
<p>Ein schöner Vorteil der &#8220;freien&#8221; Betriebssysteme ist an dieser Stelle, daß man sie nahezu alle auch aus dem Netzwerk booten kann &#8211; Stichwort <a href="http://en.wikipedia.org/wiki/Preboot_Execution_Environment">PXE</a> &#8211; und somit zumindest das Erstellen von Installationsmedien entfällt. </p>
<blockquote><p>Mit einem PXE-fähigen Rechner ist man in der Lage, anstelle von lokalen Medien (Festplatte, Diskette, CD etc.) über ein Netzwerk (Ethernet) von einem entfernten Rechner zu booten. Dies kann dazu dienen, auf einem Rechner ohne Zufügen von Medien (CDs, DVDs etc.) ein Betriebssystem zu installieren oder auch ein Thinclient-System aufzubauen, in dem die Client-Rechner gar keine Laufwerke benötigen, und dem Nutzer dennoch ein komplett nutzbares Betriebssystem zur Verfügung gestellt wird.</p></blockquote>
<p> [<font size="-2">nach <a href="http://de.wikipedia.org/wiki/Preboot_Execution_Environment">wikipedia</a></font>]</p>
<p><strong>Wie baut man denn jetzt ein solches PXE-Environment auf?</strong> Naja &#8211; eigenlich recht einfach. Man benötigt nur den Dienst <a href="http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol">DHCP</a>, eine Portion <a href="http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol">TFTP</a> und später etwas <a href="http://en.wikipedia.org/wiki/Network_File_System_%28protocol%29">NFS</a> &#8211; schon fertig. In der Realität ist&#8217;s natürlich ein kleines bisselchen mehr Aufwand&#8230;</p>
<p>Zuerst suchen wir uns eine Maschine im Netz, auf der das PXE-System laufen soll. In meinem Falle ist das eine <a href="http://www.debian.org">Debian</a> Maschine, konzeptionell funktioniert das aber auch wunderbar mit anderen Distributionen oder den BSD-Geschmacksrichtungen. Ich habe mir vor einiger Zeit mal angewöhnt solche Installationen getrennt vom restlichen Betriebssystem zu verwalten, daher wähle ich einen Pfad unterhalb von <strong>/opt</strong> &#8211; das steht natürlich jedem frei.</p>
<p><code># mkdir /opt/pxeboot/tftp</code></p>
<p>Was wir auf jeden Fall brauchen, ist eine aktuelle Version von <a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/">syslinux</a> &#8211; runterladen und in diesem neuen Verzeichnis entpacken. </p>
<p>Den Debian-Installer laden wir als nächstes. Heute gibt es durchaus Sinn sowohl den <a href="http://ftp.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/netboot.tar.gz"><em>i386</em></a>- als auch den <a href="http://ftp.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/netboot.tar.gz"><em>AMD64</em></a>-Zweig anzubieten, daher laden wir beide nacheinander runter und entpacken die Files ebenfalls nach /opt/pxeboot/tftp.</p>
<p><code><br />
# wget http://ftp.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/netboot.tar.gz<br />
# tar xzf netboot.tar.gz<br />
# rm netboot.tar.gz<br />
# wget http://ftp.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/netboot.tar.gz<br />
# tar xzf netboot.tar.gz<br />
# rm netboot.tar.gz<br />
</code></p>
<p>Beide Dateien heißen <strong>netboot.tar.gz</strong>, also nicht aus Versehen gegenseitig überschreiben. Ein paar Dateien sind in beiden Archiven enthalten &#8211; einfach ignorieren, die dürfen ruhig überschrieben werden. Ebenfalls brauchen wir zwei <a href="http://en.wikipedia.org/wiki/Symbolic_link">Symlinks</a> nicht mehr &#8211; <strong>pxelinux.0</strong> und <strong>pxelinux.cfg</strong> sollten auch gleich gelöscht werden &#8211; wir legen sie später neu an.</p>
<p>Aus dem <a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/">syslinux</a>-Paket stibitzen wir noch die Datei <strong>com32/modules/menu.c32</strong> und kopieren sie nach <strong>/opt/pxeboot/tftp</strong>.</p>
<p>Dem DHCP-Server in unserem Netz muß noch erklärt werden, daß er den Clients auf PXE-Anfragen antwortet. Beim <a href="http://www.isc.org/index.pl?/sw/dhcp/">ISC DHCPd3</a> geht das sehr schmerzfrei, auch bei anderen DHCP-Servern sollte das kein Problem sein. (<a href="https://netzhure.de/2007/08/20/122-PXE-Bootmenue-fuer-Debian-Installer-und-GRML.html">moemoe</a> beschreibt das mit <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a>)</p>
<p><code><br />
subnet 172.30.4.0 netmask <a href="http://blogs.interdose.com/sebastian/2008/02/05/ipv4-subnetze-ohne-schmerzen/">255.255.252.0</a> {<br />
&nbsp;range 172.30.6.1 172.30.6.254;<br />
&nbsp;range dynamic-bootp 172.30.5.240 172.30.5.255;<br />
&nbsp;option routers 172.30.7.254;<br />
&nbsp;<strong>filename "pxelinux.0";</strong><br />
&nbsp;<strong>next-server 172.30.4.1;</strong><br />
}<br />
</code></p>
<p>Die beiden hervorgehobenen Zeilen teilen dem Client mit welche Datei er von welchem Server per TFTP anfordern soll. Installieren wir noch einen TFTP-Server! Wer <a href="http://www.debian.org">Debian</a> einsetzt kann sich jetzt glücklich schätzen, denn was gibt es schon schöneres als <a href="http://www.debian.org/doc/manuals/apt-howto/">apt-get</a>? </p>
<p><code><br />
# apt-get install atftpd<br />
</code></p>
<p>Bei mir wird der atftpd per <a href="http://en.wikipedia.org/wiki/Inetd">inetd</a> gestartet, also muß eine entsprechende Zeile in die <strong>/etc/inetd.conf</strong></p>
<p><code>tftp		dgram	udp	wait 	nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5     --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5  /opt/pxeboot/tftp</code> Einfach ganz unten anhängen &#8211; sofern da noch nix von tftp steht &#8211; und darauf achten, daß es wirklich alles eine Zeile ist. </p>
<p>Jetzt noch das Boot-Menü anpassen.</p>
<p>In <strong>/opt/pxeboot/tftp</strong> ein neues Verzeichnis namens <strong>pxelinux.cfg</strong> erstellen und darin eine Datei namens <strong>default</strong> in den Editor laden.</p>
<p><code><br />
DEFAULT menu.c32<br />
PROMPT 0<br />
MENU TITLE Automagisches Netzwerk-Booten<br />
TIMEOUT 300<br />
LABEL d<br />
&nbsp;MENU DEFAULT<br />
&nbsp;MENU LABEL Boot from ^disk<br />
&nbsp;localboot 0x80<br />
LABEL di-i386<br />
&nbsp;MENU LABEL Debian Installer ^i386 - submenu<br />
&nbsp;KERNEL menu.c32<br />
&nbsp;APPEND debian-installer/i386/pxelinux.cfg/default<br />
LABEL di-amd64<br />
&nbsp;MENU LABEL Debian Installer ^amd64 - submenu<br />
&nbsp;KERNEL menu.c32<br />
&nbsp;APPEND debian-installer/amd64/pxelinux.cfg/default<br />
LABEL n<br />
&nbsp;MENU LABEL Try ^next bootdevice<br />
&nbsp;localboot -1<br />
</code></p>
<p>Aus dem Debian-Installer <em>i386</em> (/opt/pxeboot/tftp/debian-installer/i386) noch die Datei <strong>pxelinux.0</strong> nach /opt/pxeboot/tftp kopieren und fertig sind wir &#8211; für den ersten Schritt. Den DHCP-Server und den <a href="http://en.wikipedia.org/wiki/Inetd">inetd</a> noch kurz mit der neuen Konfiguration vertraut machen (<em>also known as</em> durchstarten) und schon sollten die Maschinen per PXE den Debian Installer booten können. </p>
<p>Allerdings &#8211; zumindest mir &#8211; reicht das noch nicht. Für&#8217;s Debugging eignet sich noch ein <a href="http://en.wikipedia.org/wiki/List_of_LiveDistros">Live-System</a>, außerdem muß noch der Installer von <a href="http://www.freebsd.org">FreeBSD</a> mit in&#8217;s Boot-Menü. </p>
<p>Grade für Debugging hat sich bei mir <a href="http://grml.org">grml</a> bewährt. </p>
<blockquote><p>grml is a bootable CD (Live-CD) originally based on Knoppix and nowadays based on Debian. grml includes a collection of GNU/Linux software especially for system administrator and users of texttools. grml provides automatic hardware detection. You can use grml (for example) as a rescue system, for analyzing systems/networks or as a working environment. It is not necessary to install anything to a harddisk; you don&#8217;t even need a harddisk to run it. Due to on-the-fly decompression grml includes about 2.1GB of software and documentation on the CD.</p></blockquote>
<p>[<font size="-2"><a href="http://grml.org/">grml</a></font>]</p>
<p>Aus dem <a href="http://ftp.uni-erlangen.de/pub/mirrors/grml/grml_1.1.iso">grml-ISO</a> basteln wir eine NFS-Freigabe und laden zusätzlich noch die speziellen Files für den <a href="http://grml.org/terminalserver/grml_netboot_package_1.1.tar.bz2">grml-Netboot</a>. </p>
<p><code><br />
# mkdir /opt/pxeboot/tftp/grml<br />
# wget ftp://ftp.uni-erlangen.de/pub/mirrors/grml/grml_1.1.iso<br />
# mount -o loop grml_1.0.iso /mnt/tmp/<br />
# cp -r /mnt/tmp/* /opt/pxeboot/tftp/grml<br />
# cp /mnt/tmp/boot/isolinux/minirt26.gz /opt/pxeboot/tftp/grml/boot/<br />
# umount /mnt/tmp<br />
# wget http://grml.org/terminalserver/grml_netboot_package_1.1.tar.bz2<br />
# tar xvjpf grml_netboot_package_1.1.tar.bz2<br />
# cp grml_netboot_package_grml_1.1/tftpboot/linux26 /opt/pxeboot/tftp/grml/boot/<br />
# cp grml_netboot_package_grml_1.1/tftpboot/minirt26.gz /opt/pxeboot/tftp/grml/boot/<br />
# cp grml_netboot_package_grml_1.1/tftpboot/memtest /opt/pxeboot/tftp/grml/boot/<br />
</code></p>
<p>Sowohl das ISO als auch den Inhalt von <strong>grml_netboot_package_1.1.tar.bz2</strong> benötigen wir danach nicht mehr. </p>
<p>Die Datei <strong>/opt/pxeboot/tftp/pxelinux.cfg/default</strong> noch um den grml-Eintrag anpassen:<br />
<code><br />
LABEL grml<br />
&nbsp;MENU LABEL ^GRML<br />
&nbsp;kernel grml/boot/linux26<br />
&nbsp;append ramdisk_size=24000 root=/dev/ram0 rw init=/etc/init nfsdir=<em>Server-IP-oder-Name</em>:/opt/pxeboot/tftp/grml/ nodhcp noprompt noeject apm=power-off nomce initrd=grml/boot/minirt26.gz vga=normal</code></p>
<p>Was jetzt noch fehlt, ist der NFS-Export von <strong>/opt/pxeboot/tftp/grml</strong> &#8211; aber auch das ist kein größeres Problem. Die Datei <strong>/etc/exports</strong> um die entsprechenden Einträge ergänzen und den NFS-Dienst ebenfalls neu starten.</p>
<p><code><br />
/opt/pxeboot/tftp/grml/ * (ro,no_root_squash,no_subtree_check)<br />
/opt/pxeboot/tftp/ * (ro,no_root_squash,no_subtree_check)<br />
</code></p>
<p>That&#8217;s it &#8211; jetzt ist auch grml über das Netzwerk startbar. Fehlt noch <a href="http://www.freebsd.org">FreeBSD</a>.</p>
<p>Leider ist der Aufwand bei FreeBSD etwas größer als bei Linux, denn für das Erstellen eines PXE-Images benötigt man ein funktionierendes FreeBSD-System und ein <strong><a href="http://www.freebsd.org/where.html">bootonly.iso</a></strong>.</p>
<p><code><br />
# mdconfig -a -t vnode -f 7.0-RELEASE-i386-bootonly.iso -u1 ; mount -t cd9660 /dev/md1 /mnt/cdrom<br />
# dd if=/dev/zero of=fbsd7R_i386.img bs=1k count=32k<br />
# mdconfig -a -t vnode -f fbsd7R_i386.img -u0<br />
# bsdlabel -w -B md0 auto; bsdlabel -A md0<br />
# newfs -b 8192 -f 1024 /dev/md0a<br />
# mount /dev/md0a /mnt/disk<br />
# cp -R /mnt/cdrom/boot /mnt/disk/<br />
# umount /mnt/disk<br />
# umount /mnt/cdrom ; mdconfig -d -u0 ; mdconfig -d -u1<br />
</code>[<font size="-2">nach <a href="http://www.thegibson.org/blog/archives/10">/dev/rant</a></font>]</p>
<p>Das entstandende Image <strong>fbsd7R_i386.img</strong> auf den PXE-Server kopieren, <a href="http://www.gzip.org/">gzip</a>en und in <strong>pxelinux.cfg/default</strong> mit eintragen.</p>
<p><code><br />
LABEL fbsd7-i386<br />
&nbsp;MENU LABEL FreeBSD 7-RELEASE i386<br />
&nbsp;kernel memdisk<br />
&nbsp;append initrd=freebsd/fbsd7R_i386.img.gz harddisk noedd<br />
</code></p>
<p>Die Datei <strong>memdisk</strong> ebenfalls noch aus <a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/">syslinux</a> ins Verzeichnis <strong>/opt/pxeboot/tftp</strong> kopieren, denn die benötigt der FreeBSD Start-Vorgang. Auch FreeBSD hat einen <em>AMD64</em>-<a href="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/amd64/7.0-RELEASE">Zweig</a>. Der wird entsprechend der Anleitung oben für <em>i386</em> gebaut. </p>
<p>Das war&#8217;s &#8211; das Gröbste ist erledigt. Wem die Menüs noch nicht gefallen kann sich an <a href="http://www.kernel.org/pub/linux/utils/boot/syslinux/">syslinux</a> noch ein bisselchen verkünsteln &#8211; Stichwort: <strong><a href="http://www.google.com/search?q=vesamenu.c32">vesamenu.c32</a></strong>.<br />
Ich habe das ganze vor einer Weile für <a href="http://www.interdose.com">unser</a> Büro-Netzwerk gebaut, und bin bisher sehr zufrieden. Wirklich geholfen haben mir die folgenden Postings, danke an die Autoren! </p>
<ul>
<li><a href="https://netzhure.de/2007/08/20/122-PXE-Bootmenue-fuer-Debian-Installer-und-GRML.html">PXE-Bootmenü für Debian-Installer und GRML</a></li>
<li><a href="http://phaq.phunsites.net/2007/02/14/convert-freebsd-iso-image-for-pxe-bootstrap/">Convert FreeBSD ISO image for PXE bootstrap</a></li>
<li><a href="http://www.thegibson.org/blog/archives/10">pxelinux BSD installs</a></li>
</ul>
<p>Ebenfalls ganz interessant ist ein Eintag von <a href="http://www.roudybob.net/?p=124">RoudyBob.NET</a>, für alle, die versuchen <a href="http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx">Microsoft Virtual PC 2004</a> per PXE zu booten. Ohne ein spezielles Floppy-Image funktioniert das nämlich nicht. </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2008/03/19/software-deployment-per-pxenetboot/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Prompt magic</title>
		<link>http://blogs.interdose.com/sebastian/2007/07/28/prompt-magic/</link>
		<comments>http://blogs.interdose.com/sebastian/2007/07/28/prompt-magic/#comments</comments>
		<pubDate>Sat, 28 Jul 2007 11:22:22 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[Un*x]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/2007/07/28/prompt-magic/</guid>
		<description><![CDATA[
Why stick with the standard boring shell prompt when you can easily make it colorful and more informative? In this tip, Daniel Robbins will show you how to get your shell prompt just the way you like it, as well as how to dynamically update your X terminal&#8217;s title bar.

IBM Developerworks &#8211; Prompt Magic [via [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
Why stick with the standard boring shell prompt when you can easily make it colorful and more informative? In this tip, Daniel Robbins will show you how to get your shell prompt just the way you like it, as well as how to dynamically update your X terminal&#8217;s title bar.
</p></blockquote>
<p><a href="http://www.ibm.com/developerworks/linux/library/l-tip-prompt/">IBM Developerworks &#8211; Prompt Magic</a> [via <a href="https://netzhure.de/comment.php?type=trackback&#038;entry_id=116">netzhure</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2007/07/28/prompt-magic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>farbige man-Pages</title>
		<link>http://blogs.interdose.com/sebastian/2007/07/07/farbige-man-pages/</link>
		<comments>http://blogs.interdose.com/sebastian/2007/07/07/farbige-man-pages/#comments</comments>
		<pubDate>Sat, 07 Jul 2007 09:10:54 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[Un*x]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/2007/07/07/farbige-man-pages/</guid>
		<description><![CDATA[
export LESS_TERMCAP_mb=$&#8217;\E[01;31m&#8217;
export LESS_TERMCAP_md=$&#8217;\E[01;31m&#8217;
export LESS_TERMCAP_me=$&#8217;\E[0m&#8217;
export LESS_TERMCAP_se=$&#8217;\E[0m&#8217;
export LESS_TERMCAP_so=$&#8217;\E[01;44;33m&#8217;
export LESS_TERMCAP_ue=$&#8217;\E[0m&#8217;
export LESS_TERMCAP_us=$&#8217;\E[01;32m&#8217;

Sehr praktisch! Funktioniert auch wunderbar mit der Z-Shell.
Gefunden u.a. bei moemoe.
]]></description>
			<content:encoded><![CDATA[<blockquote><p>
export LESS_TERMCAP_mb=$&#8217;\E[01;31m&#8217;<br />
export LESS_TERMCAP_md=$&#8217;\E[01;31m&#8217;<br />
export LESS_TERMCAP_me=$&#8217;\E[0m&#8217;<br />
export LESS_TERMCAP_se=$&#8217;\E[0m&#8217;<br />
export LESS_TERMCAP_so=$&#8217;\E[01;44;33m&#8217;<br />
export LESS_TERMCAP_ue=$&#8217;\E[0m&#8217;<br />
export LESS_TERMCAP_us=$&#8217;\E[01;32m&#8217;
</p></blockquote>
<p><strong>Sehr </strong>praktisch! Funktioniert auch wunderbar mit der <a href="http://blogs.interdose.com/sebastian/2007/06/02/z-shell-im-einsatz/">Z-Shell</a>.<br />
Gefunden u.a. bei <a href="https://netzhure.de/2007/07/04/115-Farbige-Manpages.html">moemoe</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2007/07/07/farbige-man-pages/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Z-Shell im Einsatz</title>
		<link>http://blogs.interdose.com/sebastian/2007/06/02/z-shell-im-einsatz/</link>
		<comments>http://blogs.interdose.com/sebastian/2007/06/02/z-shell-im-einsatz/#comments</comments>
		<pubDate>Sat, 02 Jun 2007 13:25:38 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Shells & Scripting]]></category>
		<category><![CDATA[Un*x]]></category>

		<guid isPermaLink="false">http://blogs.interdose.com/sebastian/2007/06/02/z-shell-im-einsatz/</guid>
		<description><![CDATA[Nach Jahren exzessiver Bash-Nutzung bin ich vor ein paar Wochen auf die Z-Shell (kurz zsh) umgestiegen. Die Z-Shell bietet viele Funktionen die ich bei der Bash in Zukunft vermissen werde &#8211; vor allem aber die nahezu perfekte TAB-Completion. Ebenfalls sehr schick ist die integrierte Erkennung von Tippfehlern. 
Das Wiki des UUGRN e.V. schreibt zur Z-Shell:

Die [...]]]></description>
			<content:encoded><![CDATA[<p>Nach Jahren exzessiver <a href="http://www.gnu.org/software/bash/">Bash</a>-Nutzung bin ich vor ein paar Wochen auf die <a href="http://zsh.dotsrc.org/">Z-Shell</a> (kurz <em>zsh</em>) umgestiegen. Die Z-Shell bietet viele Funktionen die ich bei der Bash in Zukunft vermissen werde &#8211; vor allem aber die nahezu perfekte TAB-Completion. Ebenfalls sehr schick ist die integrierte Erkennung von Tippfehlern. </p>
<p>Das <a href="http://wiki.uugrn.org/wiki/Zsh">Wiki</a> des <a href="http://wiki.uugrn.org">UUGRN e.V.</a> schreibt zur Z-Shell:</p>
<blockquote><p>
Die zsh &#8211; Kurzform fuer Z-Shell wurde zur Erweiterung der bash, der csh und der tcsh entwickelt. Sie ist fast komplett zur bash und zur TENEX-C Shell kompatibel, bietet aber einige Erweiterungen:
<ul>
<li>frei programmierbare TAB-Completion</li>
<li>eine History fuer alle laufenden Instanzen</li>
<li>Rechtschreibpruefung waehrend der Eingabe</li>
<li>extrem <em>themebares</em> Prompt (auch auf der rechten Seite des Terminals moeglich)</li>
</ul>
<p>Die zsh wurde 1989 entwicklelt und steht unter der <a href="http://wiki.uugrn.org/wiki/BSD-Lizenz">BSD-Lizenz</a>. Sie war lange die Standard-Shell auf <a href="http://www.apple.com">MacOS X</a>. In nahezu jeder Unix/Linux-Distrubution existieren binaer-Pakete zur Z-Shell.</p></blockquote>
<p>Wer die <a href="http://zsh.dotsrc.org/">Z-Shell</a> einfach mal ausprobieren moechte, sollte sich <a href="http://grml.org">grml</a> ansehen: </p>
<blockquote><p><a href="http://grml.org">grml</a> is a bootable CD (Live-CD) originally based on Knoppix and nowadays based on Debian. grml includes a collection of GNU/Linux software especially for users of texttools and system administrators. grml provides automatic hardware detection. You can use grml (for example) as a rescue system, for analyzing systems/networks or as a working environment.</p></blockquote>
<p><a href="http://grml.org">grml</a> beinhaltet die <a href="http://zsh.dotsrc.org/">Z-Shell</a> bereits als default-Shell und bringt sehr nützliche Konfigurationen mit. Diese <a href="http://shell.uugrn.org/~shl/zshconfig-SHL.tar.gz">Configs</a> kann man recht problemlos auf <a href="http://www.freebsd.org">FreeBSD</a>, <a href="http://www.sun.com">Solaris</a> oder OS X <a href="http://wiki.uugrn.org/wiki/Zsh#ausprobieren.21">portieren</a>, und die Z-Shell mit wenig Aufwand zur Standard-Shell auf seinem System machen.</p>
<p>Aber Achtung! <a href="http://bronski.net/archiv/2005/06/28/wow-sucht/">Suchtgefahr</a>. <img src='http://blogs.interdose.com/sebastian/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.interdose.com/sebastian/2007/06/02/z-shell-im-einsatz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
