<?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>Gabe Ortiz</title>
	<atom:link href="http://gabeortiz.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://gabeortiz.net</link>
	<description>storybook american generalist</description>
	<lastBuildDate>Thu, 01 Jul 2010 03:46:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>On Flattr</title>
		<link>http://gabeortiz.net/2010/on-flattr/</link>
		<comments>http://gabeortiz.net/2010/on-flattr/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 03:45:44 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[economics]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://gabeortiz.net/?p=85</guid>
		<description><![CDATA[Flattr is a micropayment system, brought to you by the fine folks at The Pirate Bay, sort of as a moral proof-of-concept for a system that can work in a post-copyright world. Users select a monthly payment amount (minimum of 2 euros) that they can afford, then you &#8220;Flattr&#8221; other people who have bought into the [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a title="Flatter" href="https://flattr.com/" target="_blank">Flattr</a></strong> is a micropayment system, brought to you by the fine folks at The Pirate Bay, sort of as a moral proof-of-concept for a system that can work in a post-copyright world. Users select a monthly payment amount (minimum of 2 euros) that they can afford, then you &#8220;Flattr&#8221; other people who have bought into the system. Your Flattr monthly payments are shared among the people you Flattr. Think of it as a Socialist Internet Tip Jar. Pay what you can afford.</p>
<p>It sounds great in theory; the problem of course, is that it has not yet hit critical mass for it to work on a large scale. Most of the users are crazy open source people from Germany and Sweden. Most of the projects posted are not from English speakers and not a lot of people know about Flattr yet.</p>
<p>HOWEVER, right now for me I&#8217;ve actually just hit break-even. So, enough people are paying me money because they think I&#8217;m awesome for me to pay other people because I think <em>they</em> are awesome. I mean, I know I&#8217;m sort of a minor Internet Folk Hero, but hey. It actually works.</p>
<p>So anyway, it&#8217;s currently in an invite-only beta, but if you&#8217;d like to try it out, I&#8217;ve got 3 invites remaining. The first three comments get an invite. Comment, email me at gabe at signalnine dot net if I don&#8217;t have your email address already and I&#8217;ll hook you up.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2010/on-flattr/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why I won&#8217;t buy an iPad (and think you shouldn&#8217;t, either)</title>
		<link>http://gabeortiz.net/2010/why-i-wont-buy-an-ipad-and-think-you-shouldnt-either/</link>
		<comments>http://gabeortiz.net/2010/why-i-wont-buy-an-ipad-and-think-you-shouldnt-either/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 16:42:18 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[economics]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=75</guid>
		<description><![CDATA[The model of interaction with the iPad is to be a &#8220;consumer,&#8221; what William Gibson memorably described as &#8220;something the size of a baby hippo, the color of a week-old boiled potato, that lives by itself, in the dark, in a double-wide on the outskirts of Topeka. It&#8217;s covered with eyes and it sweats constantly. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The model of interaction with the iPad is to be a &#8220;consumer,&#8221; what William Gibson memorably described as &#8220;something the size of a baby hippo, the color of a week-old boiled potato, that lives by itself, in the dark, in a double-wide on the outskirts of Topeka. It&#8217;s covered with eyes and it sweats constantly. The sweat runs into those eyes and makes them sting. It has no mouth&#8230; no genitals, and can only express its mute extremes of murderous rage and infantile desire by changing the channels on a universal remote.&#8221;</p>
<p>The way you improve your iPad isn&#8217;t to figure out how it works and making it better. The way you improve the iPad is to buy iApps. Buying an iPad for your kids isn&#8217;t a means of jump-starting the realization that the world is yours to take apart and reassemble; it&#8217;s a way of telling your offspring that even changing the batteries is something you have to leave to the professionals.</p></blockquote>
<p>Cory Doctorow and I do not agree 100% on many occasions, but he really hits the nail on the head with this piece. The iPad is very bad for the future of computing. I believe that I have a <strong>moral obligation</strong> not to support that kind of content model, no matter how shiny its packaging is.</p>
<p><a title="Source - BoingBoing" href="http://www.boingboing.net/2010/04/02/why-i-wont-buy-an-ipad-and-think-you-shouldnt-either.html" target="_self">Source &#8211; BoingBoing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2010/why-i-wont-buy-an-ipad-and-think-you-shouldnt-either/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arch Linux First Impressions</title>
		<link>http://gabeortiz.net/2010/arch-linux-first-impressions/</link>
		<comments>http://gabeortiz.net/2010/arch-linux-first-impressions/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 04:17:52 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=66</guid>
		<description><![CDATA[Having become rather tired of reinstalling Ubuntu every six months or so to keep current with releases, I recently decided to give Arch Linux a whirl. I was feeling impulsive so I decided to just jump right in without the benefit of a install guide or anything of that nature, I figured I&#8217;d get a [...]]]></description>
			<content:encoded><![CDATA[<p>Having become rather tired of reinstalling Ubuntu every six months or so to keep current with releases, I recently decided to give <a title="Arch Linux" href="http://archlinux.org" target="_blank">Arch Linux</a> a whirl. I was feeling impulsive so I decided to just jump right in without the benefit of a install guide or anything of that nature, I figured I&#8217;d get a better feel for what Arch was all about this way.</p>
<h2>Install process</h2>
<p>Initial install was pretty smooth. I made sure my homedir backup was current, downloaded the 2009.08 ISO, booted up into a live CD environment and ran through the (console mode, so you know we&#8217;re serious) installer pretty quickly. I should note that right away that the impression I got was, &#8220;Hey, we&#8217;ll let you install in a nice ncurses installer app, but after that you&#8217;re on your own.&#8221; However, even running the installer was not something I&#8217;d be comfortable recommending to a inexperienced user.</p>
<h2>First boot</h2>
<p>Okay, so install was relatively fast and easy, at least for a highly experienced sysadmin. I logged in, ran df and noticed I was only at around half a gig usage for the root filesystem. Hmm. They weren&#8217;t kidding when they said it was minimalistic. In fact, upon boot I&#8217;m not getting to init 5. All I&#8217;ve got is console mode. Right, no problem. I know the package manager is called pacman, and man pacman yields predictably useful results. Good job, Arch nerds!</p>
<h2>Configuration</h2>
<p>So, I&#8217;ve got a console and I know how the package manager works. Well, theoretically. It takes me about a minute to figure out that I need to uncomment some repositories in/etc/pacman.d/mirrorlist and run pacman -Sy to sync package databases. So, first order of business is to install X. Obviously, I need xorg-server, some fonts and my video driver. They install, bring in all my dependencies and I&#8217;m really starting to warm up to pacman at this point. Some fiddling with xmonad, dmenu, xmobar and related window manager packages later, I&#8217;m theoretically up and running.  Oh wait, xorg keeps crashing when I try to launch it. Time to install elinks and hit the forums. No really, that&#8217;s what I did.</p>
<h2>Troubleshooting</h2>
<p>After a little googling, I find that I need a graphical login manger and some tweaks to my inittab. However, I&#8217;m in luck. There&#8217;s a lovely graphical login manager called slim that&#8217;s lightweight and crazy configurable and some wisdom on Arch&#8217;s gotta-configure-it-yourself init process. Arch uses a BSD style init, so 99% of the relevant bits are in /etc/inittab and /etc/rc.conf. The last line in /etc/rc.conf looks like this:</p>
<pre>DAEMONS=(syslog-ng hal alsa !network netfs wicd crond slim)</pre>
<h2>Window Managers</h2>
<p>I run xmonad because it is awesome. I needed xmonad-contrib and the related dependencies, and my existing configuration Just Worked, which was nice. .xinitrc works as it should. I did need to add <tt>eval `ssh-agent`</tt> to it in order to get ssh-agent going.</p>
<h2>Conclusions</h2>
<p>So far, so good. I&#8217;m now running current but very stable versions of everything (Hello, kernel 2.6.32!) and performance is great. My intel video driver finally is performing like it should, and overall I&#8217;m quite happy. Rolling releases are great and I&#8217;m way impressed with the package manager. So, give Arch a shot. You won&#8217;t be disappointed.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2010/arch-linux-first-impressions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Fiber for Albuquerque</title>
		<link>http://gabeortiz.net/2010/google-fiber-for-albuquerque/</link>
		<comments>http://gabeortiz.net/2010/google-fiber-for-albuquerque/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 00:17:25 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[albuquerque]]></category>
		<category><![CDATA[economics]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=59</guid>
		<description><![CDATA[As some of you know, I&#8217;m working with Eric Renz-Whitmore, Chantal Foster and the fine folks at the Albuquerque Economic Development office to create the Google Fiber proposal for our fair city. We&#8217;re in the home stretch now. It&#8217;s been a lot of work, but thanks mainly to the tireless efforts of Eric and Chantal, [...]]]></description>
			<content:encoded><![CDATA[<p>As some of you know, I&#8217;m working with <a href="http://www.linkedin.com/in/ewhitmore">Eric Renz-Whitmore</a>, <a href="http://www.linkedin.com/in/chantalfoster">Chantal Foster</a> and the fine folks at the Albuquerque Economic Development office to create the <a href="http://www.google.com/appserve/fiberrfi">Google Fiber</a> proposal for our fair city. We&#8217;re in the home stretch now. It&#8217;s been a lot of work, but thanks mainly to the tireless efforts of Eric and Chantal, we&#8217;re almost done.</p>
<p>Now we need <strong>your</strong> help.</p>
<p>Visit us at <a href="http://googlequerque.com">Googlequerque.com</a> and <a href="http://sites.google.com/site/highspeedabq/take-our-survey">fill out the survey</a>. Then, <a href="http://www.google.com/appserve/fiberrfi/public/options">nominate Albuquerque</a> at Google&#8217;s website. It&#8217;ll take you maybe a couple minutes and it could potentially make Albuquerque a much cooler place to live.</p>
<p>Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2010/google-fiber-for-albuquerque/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fear the Boom and Bust</title>
		<link>http://gabeortiz.net/2010/fear-the-boom-and-bust/</link>
		<comments>http://gabeortiz.net/2010/fear-the-boom-and-bust/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 22:48:08 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[economics]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=45</guid>
		<description><![CDATA[Remarkably, a pretty accurate summary of Keynesian economics vs the Austrian school AND fairly fresh rhymes. Now there&#8217;s a sentence you don&#8217;t utter every day.]]></description>
			<content:encoded><![CDATA[<p>Remarkably, a pretty accurate summary of Keynesian economics vs the Austrian school AND fairly fresh rhymes. Now there&#8217;s a sentence you don&#8217;t utter every day.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="543" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/d0nERTFo-Sk&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;hd=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="543" height="385" src="http://www.youtube.com/v/d0nERTFo-Sk&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;hd=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2010/fear-the-boom-and-bust/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verizon 3G Coverage on the NM Rail Runner</title>
		<link>http://gabeortiz.net/2009/verizon-3g-coverage-on-the-nm-rail-runner/</link>
		<comments>http://gabeortiz.net/2009/verizon-3g-coverage-on-the-nm-rail-runner/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 19:06:21 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[stuff]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[mifi]]></category>
		<category><![CDATA[railrunner]]></category>
		<category><![CDATA[verizon]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=40</guid>
		<description><![CDATA[So, I picked up a Verizon MiFi, primarily to use on the train between Albuquerque and Santa Fe and thought I&#8217;d report my findings. Verizon&#8217;s 3G coverage is pretty decent and their coverage map looked the best of my various options. So, here&#8217;s my log of the trip. 10:45am Train departs Albuquerque, solid 5 bars [...]]]></description>
			<content:encoded><![CDATA[<p>So, I picked up a Verizon MiFi, primarily to use on the train between Albuquerque and Santa Fe and thought I&#8217;d report my findings. Verizon&#8217;s 3G coverage is pretty decent and their coverage map looked the best of my various options. So, here&#8217;s my log of the trip.</p>
<p>10:45am Train departs Albuquerque, solid 5 bars of EVDO Rev. A signal. Speed tests drop a little bit once the train is in motion. Average downstream, 1.1Mbps. Average upstream, 300kbps. Latency, 250ms.</p>
<p>11:00am Still totally solid departing Bernallio. Speed remains constant, latency now at 300ms.</p>
<p>11:20am First network drop. We&#8217;re about <a  href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=santo+domingo+pueblo&#038;sll=35.06355,-106.606664&#038;sspn=0.006516,0.013754&#038;ie=UTF8&#038;hq=&#038;hnear=Santo+Domingo+Pueblo,+Sandoval,+New+Mexico&#038;ll=35.499461,-106.372805&#038;spn=0.025924,0.055017&#038;z=14">here</a>, just south of Santo Domingo pueblo. No signal for about a mile, then RTTx1 picks up. </p>
<p>11:21am Good signal, but 1xRTT speeds, so about 100kbps down and 30kbps up. Latency improves for some reason, now at 100ms.</p>
<p>11:32am About ten miles of 1xRTT later, we&#8217;re back in EVDO Rev. A territory. 5 bars of signal. Speed tests at 1.93Mbps down, 320kbps up. Latency drops to 190ms.</p>
<p>11:39am NM 599 Station. Rev. A still solid.</p>
<p>12:00pm We&#8217;re in Santa Fe now, South Capitol station. Rev A, 5 bars. Speed and latency remain good.</p>
<p>In conclusion, apart from the ten minutes around Santo Domingo, coverage looks like it&#8217;s almost all Rev. A. Color me impressed! Network speeds varied a little, but it was totally usable the whole time minus the one minute or so that it dropped. Looks like this is a viable alternative to AT&#038;T&#8217;s non-existent 3G service and shoddy EDGE coverage along this route. Maybe someday they&#8217;ll actually get the promised WiFi up and running on the Rail Runner, but I&#8217;m not holding my breath.</p>
<p>Edited to add: On the way back to Albuquerque I was disappointed slight by the fact that I got only 1xRTT speeds for about a quarter of the trip, again centered around Santo Domingo pueblo. I&#8217;m not sure why it was different, but this time I wasn&#8217;t seated in the uppermost part of the train, so that might explain it. It might be worth getting a little suction cup or something to adhere the MiFi to the window or ceiling. That might solve it.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2009/verizon-3g-coverage-on-the-nm-rail-runner/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>I just wrote one of the best one-line bash scripts of all time.</title>
		<link>http://gabeortiz.net/2009/i-just-wrote-one-of-the-best-one-line-bash-scripts-of-all-time/</link>
		<comments>http://gabeortiz.net/2009/i-just-wrote-one-of-the-best-one-line-bash-scripts-of-all-time/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 03:16:48 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=38</guid>
		<description><![CDATA[ALL TIME! curl -s -u Frank__Booth:password -d "track=heineken" http://stream.twitter.com/track.xml &#124; grep "/screen_name" &#124; grep -v Frank__Booth &#124; sed -e 's/[^0-9a-zA-Z]//g' &#124; sed -e 's/screenname//g' &#124; xargs -I '{}' curl --basic --user Frank__Booth:password --data status="@{} Heineken? Fuck that shit! PABST BLUE RIBBON" http://twitter.com/statuses/update.xml]]></description>
			<content:encoded><![CDATA[<p>ALL TIME!</p>
<p><code>curl -s -u Frank__Booth:password -d "track=heineken" http://stream.twitter.com/track.xml | grep "/screen_name" | grep -v Frank__Booth | sed -e 's/[^0-9a-zA-Z]//g' | sed -e 's/screenname//g' | xargs -I '{}' curl --basic --user Frank__Booth:password --data status="@{} Heineken? Fuck that shit! PABST BLUE RIBBON" http://twitter.com/statuses/update.xml</code></p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2009/i-just-wrote-one-of-the-best-one-line-bash-scripts-of-all-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter JSON stream parser</title>
		<link>http://gabeortiz.net/2009/twitter-json-stream-parser/</link>
		<comments>http://gabeortiz.net/2009/twitter-json-stream-parser/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 05:27:01 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=29</guid>
		<description><![CDATA[So recently I&#8217;ve had occasion to parse the Twitter JSON stream, specifically the spritzer stream for data mining purposes. Turns out this is a pretty difficult problem to solve in most languages. So here&#8217;s my Alexandrian solution to this particular Gordian knot, in Bash, because that&#8217;s just how I roll. curl -s --basic --user username:password [...]]]></description>
			<content:encoded><![CDATA[<p>So recently I&#8217;ve had occasion to parse the Twitter JSON stream, specifically the spritzer stream for data mining purposes. Turns out this is a pretty difficult problem to solve in most languages. So here&#8217;s my Alexandrian solution to this particular Gordian knot, in Bash, because that&#8217;s just how I roll.</p>
<p><code>curl -s --basic --user username:password http://stream.twitter.com/spritzer.json | while read line; do echo "${line}" > temp_tweet ;  cat temp_tweet | sed -e 's/=\"/\=\\"/g' | sed -e 's/\">/\\">/g' | ./twitterparse.pl; done</code></p>
<p>This parses the JSON steam and passes each tweet to a perl script which does the actual parsing. </p>
<p>Hey kids: Don&#8217;t do this. It&#8217;s bad. If you must, use a tool like <a href="http://github.com/micha/jsawk">jsawk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2009/twitter-json-stream-parser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian Diskless Cluster Howto</title>
		<link>http://gabeortiz.net/2009/debian-diskless-cluster-howto/</link>
		<comments>http://gabeortiz.net/2009/debian-diskless-cluster-howto/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 19:29:56 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=12</guid>
		<description><![CDATA[Inital Setup This guide will walk you through the diskless cluster install and setup process. The cluster has a head node that serves boot images to the compute nodes and the database node. We&#8217;re attempting to present a unified system image across the cluster. For this reason, all nodes are looking at the same root [...]]]></description>
			<content:encoded><![CDATA[<h2>Inital Setup</h2>
<p>This guide will walk you through the diskless cluster install and setup process. The cluster has a head node that serves boot images to the compute nodes and the database node. We&#8217;re attempting to present a unified system image across the cluster. For this reason, all nodes are looking at the same root filesystem, served via NFS.</p>
<h3>DHCP</h3>
<p>I started from a bare-bones netinstall of Debian Squeeze (testing) on the head node. This should work about equally well on any Debian-derived distribution.</p>
<p>First, we need to install some packages we&#8217;ll need in a minute.</p>
<pre>
sudo apt-get install dnsmasq syslinux nfs-kernel-server nfs-common debootstrap tftpd-hpa xinetd
</pre>
<p>Now, we need to configure dnsmasq, which will serve as our DHCP server for diskless booting.</p>
<p>You replace your existing /etc/dnsmasq.conf with something like this:</p>
<pre>
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h
dhcp-boot=pxelinux.0,headnode,192.168.1.1
</pre>
<p>Replace 192.168.1.x with your preferred IP subnet and &#8220;headnode&#8221; with the hostname of your head node.</p>
<h3>tftp</h3>
<p>Our tftp server needs to be configured to launch on command from xinetd. The binary is already installed from our previous apt-get command.</p>
<p>create a file, /etc/xinetd/tftp-hpa that looks like this:</p>
<pre>
service tftp
{
        disable         = no
        id              = chargen-dgram
        socket_type     = dgram
        protocol        = udp
        user            = root
        wait            = yes
        server          = /usr/sbin/in.tftpd
        server_args     = -s /var/lib/tftpboot/
}
</pre>
<h3>PXE</h3>
<p>Now we need to tell the PXE server what to serve our clients.</p>
<p>Let&#8217;s set up our pxelinux configuration directory.</p>
<pre>
sudo cp -r /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/
sudo mkdir /var/lib/tftpboot/pxelinux.cfg
</pre>
<p>We&#8217;ll need a kernel and a initial ramdisk to give to your diskless clients. Assuming you&#8217;re going to be running the same kernel on the head node as your diskless clients (recommended), you can just copy the kernel from /boot.</p>
<pre>
sudo cp /boot/vmlinuz-`uname -r` /var/lib/tftpboot/
</pre>
<p>You&#8217;re going to need to create a NFS-root-enabled ramdisk. This accomplished with the tool mkinitramfs. You should have a configuration directory, /etc/initramfs-tools/. Make a copy of it:</p>
<pre>
sudo cp -r /etc/initramfs-tools /etc/initramfs-pxe
</pre>
<p>Note: On Debian Squeeze, the installed <tt>/etc/initramfs-tools</tt> did not work for unknown reasons, it seems to be missing module configurations. I ended up copying a <tt>/etc/initramfs-tools</tt> from an Ubuntu 8.04 install. It worked fine.</p>
<p>Edit /etc/initramfs-pxe/initramfs.conf. Change <tt>BOOT=local</tt> to <tt>BOOT=nfs</tt>.<br />
Now we can create the ramdisk.</p>
<pre>
sudo mkinitramfs -d /etc/initramfs-pxe -o /var/lib/tftpboot/initrd.img-`uname -r` `uname -r`
</pre>
<p>We should be ready to create a default boot configuration now. We&#8217;ll need to create <tt>/var/lib/tftpboot/pxelinux.cfg/default</tt></p>
<pre>
LABEL linux
KERNEL vmlinuz-2.6.29
APPEND root=/dev/nfs initrd=initrd.img-2.6.29 nfsroot=192.168.1.1:/home/nfsroot ip=dhcp rw
</pre>
<p>Change 2.6.29 to match your kernel, obviously.</p>
<p>If you want to pass different parameters to different machines, you can create individual configuration files in <tt>/var/lib/tftpboot/pxelinux.cfg/</tt> based on their MAC addresses. For example, if I create a file, <tt>/var/lib/tftpboot/pxelinux.cfg/01-00-21-97-7a-24-0f</tt>, then my node with a MAC of <tt>00:21:97:7a:24:0f</tt> will load that instead of the default. I like to create softlinks in the configuration directory corresponding to the hostnames of my nodes because if you can remember MAC addresses of individual machines then you&#8217;re a better man than I am.</p>
<h3>NFS</h3>
<p>NFS time! Create a directory to store your NFS root you&#8217;ll be serving clients.</p>
<pre>
sudo mkdir /home/nfsroot
</pre>
<p>Edit <tt>/etc/exports</tt>. It should look something like this:</p>
<pre>
/home/nfsroot 192.168.1.0/255.255.255.0(rw,no_subtree_check,async,no_root_squash)
</pre>
<p>Now we just have to bootstrap a basic Debian install into <tt>/home/nfsroot</tt>. Luckily for us, there&#8217;s a nifty little tool called <tt>debootstrap</tt> that does just that. For a 64-bit Debian Squeeze environment, I do this:</p>
<pre>
debootstrap --arch amd64 squeeze /home/nfsroot/
</pre>
<p>A few minutes later, it&#8217;s installed. Now you need to make some modifications to that system you just installed.<br />
Edit <tt>/home/nfsroot/etc/fstab</tt> to look something like this:</p>
<pre>
# <file system> <mount point> <type>
<options> <dump>
<pass>
proc            /proc         proc   defaults       0      0
/dev/nfs        /             nfs    defaults       0      0
none            /tmp            tmpfs   defaults 0 0
none            /var/run        tmpfs   defaults 0 0
none            /var/lock       tmpfs   defaults 0 0
none            /var/tmp        tmpfs   defaults 0 0
none            /media          tmpfs   defaults 0 0
none		/var/log	tmpfs	defaults 0 0
</pre>
<p><tt>/home/nfsroot/etc/network/interfaces</tt> should be:</p>
<pre>
auto lo
iface lo inet loopback
iface eth0 inet dhcp
</pre>
<p>Note that <tt>auto eth0</tt> isn&#8217;t there anymore. That&#8217;s because your primary ethernet interface is already up. If you try to initialize it again, it might drop your existing connection and it&#8217;ll dump you out of the boot process.</p>
<h3>Testing</h3>
<p>At this point you&#8217;re ready to test. Make sure to restart xinetd, dnsmasq and nfs-kernel-server to make sure your new settings take effect. Then, check your node&#8217;s BIOS to verify that network boot is enabled and give it a shot.</p>
<p>Congratulations! You now have a diskless cluster. Next we&#8217;ll make some special modifications to the configuration of the nodes to make them play nicely together and make maintenance easier.</p>
<h3>Networking</h3>
<p>Each node will receive an IP address from dnsmasq on the head node. We can either just note which IP each node gets, as it should give each node a unique IP by default and these are persistent as long as the node&#8217;s MAC address remains the same, or you can force each node to a specified IP with a configuration similar to this in <tt>/etc/dnsmasq.conf</tt> on the head node:</p>
<pre>
dhcp-host=id:00:21:97:7d:ad:bf,192.168.1.10
dhcp-host=id:00:21:97:7a:24:0f,192.168.1.11
dhcp-host=id:00:21:97:7d:b3:26,192.168.1.12
</pre>
<p>Either way, you&#8217;ll need <tt>/etc/hosts</tt> on your head node to reflect the IP addresses of your nodes. Mine looks like this:</p>
<pre>
127.0.0.1	localhost
10.13.99.1	scoop head
192.168.1.10	dizzy db
192.168.1.11	tumbler
192.168.1.12	scrambler
</pre>
<p>You&#8217;ll want to copy that hosts file over to <tt>/home/nfsroot/etc/hosts</tt> as well.</p>
<h3>Init Tricks</h3>
<p>Sometimes you want the nodes to behave just a little bit differently from each other. I wanted my nodes to have different hostnames, fancy that. So, I wrote this bash script to figure out what their hostname should be:</p>
<pre>
#!/bin/bash
#finds node's hostname based on matching ip in /etc/hosts

grep `ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | /usr/bin/cut -d: -f2 \
| /usr/bin/awk '{ print $1}'` /etc/hosts | /usr/bin/awk '{print $2}'
</pre>
<p>Save the script in <tt>/home/nfsroot/bin/whereami</tt>. You&#8217;ll need awk in order for it to work. Boot up a node and just apt-get it from the node itself before running the script. Package installation is best accomplished from a booted diskless node, just try not to install multiple packages from multiple nodes simultaneously. You might corrupt your apt database.</p>
<p>Now that we have that taken care of, we can modify <tt>/etc/init.d/hostname.sh</tt> to set our hostname on boot based on the IP we&#8217;ve received. This is as simple as changing this:</p>
<pre>
	[ -f /etc/hostname ] &#038;&#038; HOSTNAME="$(cat /etc/hostname)"
</pre>
<p>To this:</p>
<pre>
	[ -f /etc/hostname ] &#038;&#038; HOSTNAME="$(/bin/whereami)"
</pre>
<p>This also allows us to modify other init scripts so they&#8217;ll only run on particular nodes. For example, I wanted MySQL to start only on the database node, dizzy. So I added this to the top of <tt>/etc/init.d/mysql</tt>:</p>
<pre>
hostname=$(hostname)
if [ $hostname != "dizzy" ];
then exit 0
fi
</pre>
<h3>Logging</h3>
<p>Since we&#8217;re not saving local log files on the diskless nodes, it makes sense to centralize our logging on the head node. We&#8217;ll need a better logging daemon to accomplish this.</p>
<p>On both the head node and a diskless node (only do this on one of your nodes, changes populate to the others, remember?)</p>
<pre>
sudo apt-get install syslog-ng
</pre>
<p>Edit <tt>/etc/syslog-ng/syslog-ng.conf</tt> on the <b>head node</b>.</p>
<pre>
## add this to the options section
create_dirs(yes);
long_hostnames(off);
keep_hostname(yes);

## add this to the source section
source s_udp {
	udp ( ip(192.168.1.1) ); # replace with your system's IP address
};

## add this to the destination section
destination df_udp {
        file ("/var/log/$HOST/$FACILITY");
};

## add this to the log section
log {
        source(s_udp);
        destination (df_udp);
};
</pre>
<p>Now edit <tt>/etc/syslog-ng/syslog-ng.conf</tt> on one of the <b>diskless nodes</b>.</p>
<pre>
## add this to the destination section
destination remote_udp { udp("192.168.1.1"); }; # replace with your log server's IP address

## add this to the log section
log { source(src); destination(remote_udp); };
</pre>
<p>Restart syslog-ng on both head and diskless nodes.</p>
<h3>That&#8217;s It</h3>
<p>I hope this was helpful. Feel free to ask questions or leave comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2009/debian-diskless-cluster-howto/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Goodbye, LiveJournal.</title>
		<link>http://gabeortiz.net/2009/goodbye-livejournal/</link>
		<comments>http://gabeortiz.net/2009/goodbye-livejournal/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 19:58:43 +0000</pubDate>
		<dc:creator>gabe</dc:creator>
				<category><![CDATA[stuff]]></category>
		<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://blog.signalnine.net/?p=7</guid>
		<description><![CDATA[Moving to Google Reader because lack of push notification on LJ is driving me crazy. I&#8217;ll be taking some of you over via RSS. No need to adjust your journaling preferences. I&#8217;ll be mostly crossposting to LJ from WordPress from now on.]]></description>
			<content:encoded><![CDATA[<p>Moving to Google Reader because lack of push notification on LJ is driving me crazy. I&#8217;ll be taking some of you over via RSS. No need to adjust your journaling preferences. I&#8217;ll be mostly crossposting to LJ from WordPress from now on.</p>
]]></content:encoded>
			<wfw:commentRss>http://gabeortiz.net/2009/goodbye-livejournal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
