<?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>twodoteau</title>
	<atom:link href="http://ben.timby.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://ben.timby.com</link>
	<description>2.0, my second blog</description>
	<lastBuildDate>Thu, 08 Jul 2010 11:53:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Python 2.6 on Centos 5.x</title>
		<link>http://ben.timby.com/?p=123</link>
		<comments>http://ben.timby.com/?p=123#comments</comments>
		<pubDate>Mon, 17 May 2010 17:35:20 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=123</guid>
		<description><![CDATA[I came across this post about running Python 2.6 on CentOS.
http://chrislea.com/2009/09/09/easy-python-2-6-django-on-centos-5/
However, I run x86_64, and the RPMs are only in the i386 flavor. Thus I had to rebuild them, also, I use mod_wsgi instead of mod_python to run Django.
Thus, below is my YUM repository containing all of the x86_64 flavors of the RPMs, as well [...]]]></description>
			<content:encoded><![CDATA[<p>I came across this post about running Python 2.6 on CentOS.</p>
<p><a href="http://chrislea.com/2009/09/09/easy-python-2-6-django-on-centos-5/">http://chrislea.com/2009/09/09/easy-python-2-6-django-on-centos-5/</a></p>
<p>However, I run x86_64, and the RPMs are only in the i386 flavor. Thus I had to rebuild them, also, I use mod_wsgi instead of mod_python to run Django.</p>
<p>Thus, below is my YUM repository containing all of the x86_64 flavors of the RPMs, as well as the SRPMs. I had to make some changes to some of them, as well as updating Python to 2.6.5 (from 2.6.2).</p>
<p>Further, I had to compile many dependencies for our Django application. Hopefully this will be useful to someone!</p>
<p><a href="http://dagobah.ftphosting.net/yum/">http://dagobah.ftphosting.net/yum/</a></p>
<p>* Update 5/27/2010 *</p>
<p>The easiest way to install Python 2.6, if you have a CentOS 5.4 or 5.5 system is to simply install from my repository. To do that, you can install the repository like so:</p>
<pre># wget http://dagobah.ftphosting.net/yum/smartfile.repo -O /etc/yum.repos.d/smartfile.repo</pre>
<p>Then you can use YUM to install python26 package:</p>
<pre># yum install python26</pre>
<p>To get a list of available packages, do:</p>
<pre># yum list *python26*</pre>
<p>If you need to install a python module that I have not already packaged, just do it as normal, except use the python26 binary&#8230;</p>
<pre># python26 setup.py install</pre>
<p>Similarly, whenever you wish to use python 2.6, just use the following command or shebang.</p>
<pre># python26 /path/to/script.py</pre>
<pre>#!/usr/env python26

import os, sys ...</pre>
<p>* Update 6/22/2010 *</p>
<p>Just a small update to show how to build additional python libraries for use with python26. I generally do it like this.</p>
<pre># python26 setup.py bdist_rpm --spec-only
# python26 setup.py sdist</pre>
<p>At this point you have your source tarball and .spec file. You can edit the .spec file to put python26- into the package name, and replace the python commands with python26 commands. Ensure your source tarball is where rpm expects to find it, then build your RPM.</p>
<pre># rpmbuild -ba ????.spec</pre>
<p>Some packages will require more fiddling, it just depends on how complex they are, but for the majority of packages, this is all I had to do.</p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=123</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Smooth Active-Active NFS failover with Heartbeat and Pacemaker.</title>
		<link>http://ben.timby.com/?p=109</link>
		<comments>http://ben.timby.com/?p=109#comments</comments>
		<pubDate>Tue, 23 Mar 2010 22:27:52 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[clustering]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=109</guid>
		<description><![CDATA[I have need for an active-active NFS cluster. For review, and active-active cluster is two boxes that export two resources (one each). Each box acts as a backup for the other box&#8217;s resource. This way, both boxes actively serve clients (albeit for different NFS exports).
The first problem I ran into with this setup is the [...]]]></description>
			<content:encoded><![CDATA[<p>I have need for an active-active NFS cluster. For review, and active-active cluster is two boxes that export two resources (one each). Each box acts as a backup for the other box&#8217;s resource. This way, both boxes actively serve clients (albeit for different NFS exports).</p>
<p>The first problem I ran into with this setup is the nfsserver OCF resource agent that comes with Heartbeat is not suitable. This is because it works by stopping/starting the nfs server via it&#8217;s init script. For my situation, NFS will always be running, I just want to add/remove exports on failover.</p>
<p>Adding and removing exports is fairly easy under Linux, you use the exportfs command:</p>
<pre>$ exportfs -o rw,sync,mp 192.168.1.0/24:/mnt/fs/to/export</pre>
<p>The options correspond to those you would place into /etc/exports, and the rest is the host:/path portion, also as it would go into /etc/exports. To remove an export, you specify the following:</p>
<pre>$ exportfs -u 192.168.1.0/24:/mnt/fs/to/export</pre>
<p>Therefore what I needed was an OCF RA that managed NFS exports using exportfs. I wrote one and it is available <a href="http://ben.timby.com/pub/exportfs.txt">here</a>.</p>
<p>However there are two remaining issues.</p>
<p>The first is that when you export a file system via NFS, a unique fsid is generated for that file system. The client machines that mount the exported file system use this id to generate handles to directories/files. This fsid is generated using the major/minor of the device being exported. This is a problem for me, as the device being exported is a DRBD volume with LVM on top of it. This means that when the LVM OCF RA fails over the LVM volgroup, the major/minor will change. In fact, the first device on my system had a minor of 4. This was true of both nodes. If a resource migrates, it receives the minor 4, as the existing volgroup already occupies 4. This means that the fsid will change for the exported file system and all client file handles are stale after failover.</p>
<p>To fix this, each exported file system needs a unique fsid option passed to exportfs:</p>
<pre>$ exportfs -o rw,sync,mp,fsid=1 192.168.1.0/24:/mnt/fs/to/export</pre>
<p>Note that fsid=0 has special meaning in NFSv4, so avoid it unless you read the docs and understand it&#8217;s special use. I have taken care of this in my RA by generating a random fsid in case one is not already assigned. This random fsid is then written to the DRBD device, and used on the other node when the file system is exported. This way the fsid is both unique and persistent (remains same on other node after failover).</p>
<p>The other problem is that the /var/lib/nfs/rmtab file needs to be synchronized. This file contains the clients whom have mounted the exported file system. Again, I handle this in my RA by saving the relevant rmtab entries onto the DRBD device, and restoring them to the other node&#8217;s rmtab file. I also remove these entries from the node on which the resource is stopped.</p>
<p>This gives me a smooth failover of NFS from one node to the other and back again. To use my RA, simply install it onto your cluster nodes at:</p>
<pre>/usr/lib/ocf/resources.d/custom/exportfs</pre>
<p>Then you can create a resource using that RA, it requires three parameters.</p>
<ol>
<li>exportfs_dir &#8211; the directory to export.</li>
<li>exportfs_clientspec &#8211; the client specification to export to (i.e. 192.168.1.0/24).</li>
<li>exportfs_options &#8211; the options as you would specify in /etc/exports.</li>
</ol>
<p>If you provide an fsid in the exportfs_options param, that value will be honored, the random fsid is only generated when fsid is absent.</p>
<p>This seems to work perfectly on my cluster running CentOS 5.4, I tested using an Ubuntu 9.10 client.</p>
<p>** Update **</p>
<p>I posted a new version of the OCF RA. The problem being that it was only backing up rmtab when the resource is being stopped. Needless to say, this only covers the graceful failover scenario, if the service dies, the backup is never made. I have remedied this by spawning a process that continually backs up rmtab. This process is then killed when the resource is stopped. This should cover resource failures as well as graceful failovers.</p>
<p>** Update **</p>
<p>I have sent the RA to the linux-ha-dev mailing list for inclusion into heartbeat. I still have some code review items to finish, but I am close to wrapping that up. You can see the discussion at the URL below&#8230;</p>
<p><a href="http://lists.linux-ha.org/pipermail/linux-ha-dev/2010-March/017244.html">http://lists.linux-ha.org/pipermail/linux-ha-dev/2010-March/017244.html</a></p>
<p>Also, the updated version of the script (named exportfs) is in the Heartbeat mercurial repository below.</p>
<p><a href="http://hg.linbit.com/florian/linux-ha/agents/">http://hg.linbit.com/florian/linux-ha/agents/</a></p>
<p>* Update 5/21/2010 *</p>
<p>This is now available in the official repository:</p>
<pre>hg init
hg clone http://hg.linux-ha.org/agents/heartbeat/exportfs</pre>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=109</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Building DRBD Kernel Module RPM for non-running kernel.</title>
		<link>http://ben.timby.com/?p=103</link>
		<comments>http://ben.timby.com/?p=103#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:29:48 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[clustering]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[drbd linux]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=103</guid>
		<description><![CDATA[I recently needed to update DRBD to the 8.3 series to overcome the 8TB volume size limit. I could not find an RPM available for anything newer than 8.2, so I decided to build my own.
I use a build machine, which happens to be a Xen VM. I needed to build the kernel module for [...]]]></description>
			<content:encoded><![CDATA[<p>I recently needed to update DRBD to the 8.3 series to overcome the 8TB volume size limit. I could not find an RPM available for anything newer than 8.2, so I decided to build my own.</p>
<p>I use a build machine, which happens to be a Xen VM. I needed to build the kernel module for a non-Xen machine. While the documentation at DRBD is very helpful, it does not cover this scenario, so I will do so here. The documentation I used is below.</p>
<p><a href="http://www.drbd.org/users-guide/s-build-rpm.html">http://www.drbd.org/users-guide/s-build-rpm.html</a></p>
<p>You are going to want to use the second option, where the make process creates .spec files for you and you then use the rpmbuild command to build the actual RPMs.</p>
<p>The rub is that you must edit the .spec file to point it to the correct kernel, on CentOS, you can obtain the necessary files by installing kernel-devel (or kernel-xen-devel if you want to build the xen flavor of the kernel module).</p>
<pre>yum -y install kernel-devel</pre>
<p>Then edit the .spec file and modify the kernelversion and kdir %defines.</p>
<pre># "uname -r" output of the kernel to build for, the running one
# if none was specified with "--define 'kernelversion <uname -r>'"
# PLEASE: provide both (correctly) or none!!
%{!?kernelversion: %{expand: %%define kernelversion 2.6.18-164.11.1.el5}}
%{!?kdir: %{expand: %%define kdir /usr/src/kernels/2.6.18-164.11.1.el5-x86_64}}</pre>
<p> The version must match that of the kernel-devel package you installed. The path must also, you can find the path easily by using the following command:</p>
<pre> rpm -q --list kernel-devel | head</pre>
<p>After that, you can build the RPM for your target kernel (not the running kernel).</p>
<pre>rpmbuild -bb drbd-km.spec</pre>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGP FormMail</title>
		<link>http://ben.timby.com/?p=100</link>
		<comments>http://ben.timby.com/?p=100#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:15:29 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=100</guid>
		<description><![CDATA[I needed a way to send encrypted emails from a web form. And rather than re-invent the wheel, I came across the following script:
http://rsmarketing.com/pgp/
This script is very useful, however, I prefer to use GPG over the PGP command line tool. Also, this script is based on the outdated v1.92 of the original formmail.pl script from [...]]]></description>
			<content:encoded><![CDATA[<p>I needed a way to send encrypted emails from a web form. And rather than re-invent the wheel, I came across the following script:</p>
<p><a href="http://rsmarketing.com/pgp/">http://rsmarketing.com/pgp/</a></p>
<p>This script is very useful, however, I prefer to use GPG over the PGP command line tool. Also, this script is based on the outdated v1.92 of the original formmail.pl script from Matt&#8217;s Script Archive.</p>
<p>So, I merged in the changes from v1.93, made the script work with GPG and also fixed a couple of perl warnings while I was at it. The updated script is available below.</p>
<p><a href="http://ben.timby.com/pub/pgpformmail.pl.txt">http://ben.timby.com/pub/pgpformmail.pl.txt</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=100</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>File downloads in Django when file name contains non-ASCII chars.</title>
		<link>http://ben.timby.com/?p=85</link>
		<comments>http://ben.timby.com/?p=85#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:54:42 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=85</guid>
		<description><![CDATA[Unfortunately there is no easy way to encode a file name within the Content-Disposition HTTP header when it contains non-ASCII chars. Meaning, if you are doing the following:
response['Content-Disposition'] = 'attachment; filename=Espanél.txt'
Then you will get an exception from Django when it tries to encode the headers as ASCII. The Content-Disposition header must be fully ASCII, and [...]]]></description>
			<content:encoded><![CDATA[<p>Unfortunately there is no easy way to encode a file name within the Content-Disposition HTTP header when it contains non-ASCII chars. Meaning, if you are doing the following:</p>
<pre>response['Content-Disposition'] = 'attachment; filename=Espanél.txt'</pre>
<p>Then you will get an exception from Django when it tries to encode the headers as ASCII. The Content-Disposition header must be fully ASCII, and there is no standard way to encode i18n characters into this header. At least none that browser vendors all implement. The solution is actually quite simple, it involves removing the header altogether and putting the filename into the URL. The browser will cherry-pick the filename from the URL if the Content-Disposition header does not provide one, thus:</p>
<p>http://mysite.com/download/path/to/Espanél.txt</p>
<p>Will get you the result you want. You can configure the URL like so in urls.py:</p>
<pre>    (r'^download(?P&lt;path&gt;.*)$', 'project.app.views.download'),</pre>
<p>Which will invoke project.app.views.download function and pass it the full path as a parameter. Your view can then do the following.</p>
<pre>def download(request, path):
    bytes = os.path.size(path)
    download = file(path, 'r')
    response = HttpResponse(download.read())
    response['Content-Disposition'] = 'attachment;'
    response['Content-Length'] = bytes
    return response</pre>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=85</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building SphinxSE on Ubuntu 9.04</title>
		<link>http://ben.timby.com/?p=86</link>
		<comments>http://ben.timby.com/?p=86#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:24:22 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=86</guid>
		<description><![CDATA[I pulled some of this information from: http://www.v-nessa.net/2007/07/21/installing-sphinx-for-mysql-51
First of all, you need mysql-server-5.1, so install it:
# sudo apt-get install mysql-server-5.1
And it&#8217;s sources:
# apt-get source mysql-server-5.1
Then you need to get the sphinx tarball, extract it and then copy the mysqlse directory into the storage/ directory within the mysql source directory.
# wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
# tar xzf sphinx-0.9.8.1.tar.gz
# cd [...]]]></description>
			<content:encoded><![CDATA[<p>I pulled some of this information from: <a href="http://www.v-nessa.net/2007/07/21/installing-sphinx-for-mysql-51">http://www.v-nessa.net/2007/07/21/installing-sphinx-for-mysql-51</a></p>
<p>First of all, you need mysql-server-5.1, so install it:</p>
<pre># sudo apt-get install mysql-server-5.1</pre>
<p>And it&#8217;s sources:</p>
<pre># apt-get source mysql-server-5.1</pre>
<p>Then you need to get the sphinx tarball, extract it and then copy the mysqlse directory into the storage/ directory within the mysql source directory.</p>
<pre># wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
# tar xzf sphinx-0.9.8.1.tar.gz
# cd mysql-dfsg-5.1-5.1.31/
# cp -R ../../sphinx-0.9.8.1/mysqlse storage/sphinx</pre>
<p>For some reason, I could not configure mysql, it was missing the Docs/ directory, so I nabbed the tarball from MySQL and extracted Docs into my debian MySQL source tree.</p>
<pre># wget http://mysql.he.net/Downloads/MySQL-5.1/mysql-5.1.37.tar.gz
# tar xzvf mysql-5.1.48.tar.gz --wildcards '*/Docs/*' --strip=1 -C mysql-dfsg-5.1-5.1.41/</pre>
<p>Now configure and make it, do NOT use the &#8211;with-plugins=sphinx switch for configure, I found a tutorial online that said to, but reading the help for ./configure &#8211;help reveals that this option will statically link the plugin into the mysqld executable. We want the plugin to be built dynamically. Also, you can do a simple make if you like, but I like to redirect the make output to a log file so I have record of any errors that may occur. I pulled most of the configure flags from the debian/rules file in the sources. These must match what the original mysqld was built with for the plugin to align correctly with the mysqld we installed above. You may also need to install some pre-requisites.</p>
<pre># sudo apt-get install automake autoconf libtool
# BUILD/autorun.sh
# ./configure   --prefix=/usr \
                --exec-prefix=/usr \
                --libexecdir=/usr/sbin \
                --datadir=/usr/share \
                --localstatedir=/var/lib/mysql \
                --includedir=/usr/include \
                --infodir=/usr/share/info \
                --mandir=/usr/share/man \
                --enable-thread-safe-client \
                --enable-local-infile \
                --with-pstack \
                --with-fast-mutexes \
                --with-big-tables \
                --with-unix-socket-path=/var/run/mysqld/mysqld.sock \
                --with-mysqld-user=mysql \
                --with-libwrap \
                --with-ssl \
                --without-docs \
                --with-extra-charsets=all \
                --with-embedded-server \
                --with-embedded-privilege-control
# make &gt;&amp;1 | tee build.log</pre>
<p>You can optionally view sphinx specific build output by opening another terminal and tailing build.log</p>
<pre># tail -f build.log | grep sphinx</pre>
<p>*snore*</p>
<p>Then install the plugin into your mysqld installed via apt.</p>
<pre># sudo mkdir /var/lib/mysql/plugins
# sudo cp storage/sphinx/libs/ha_sphinx.so* /var/lib/mysql/plugins/
# sudo chown -R mysql:mysql /var/lib/mysql/plugins
# sudo vi /etc/mysql/my.cnf
--
plugin_dir      = /var/lib/mysql/plugins
--</pre>
<p>Ubuntu Intrepid uses apparmor to limit what binaries can be executed/loaded, so we have to tell apparmor about our new plugins directory:</p>
<pre># sudo vi /etc/apparmor.d/usr.sbin.mysqld
--
/var/lib/mysql/plugins/* mr,
--
# sudo /etc/init.d/apparmor restart
# sudo /etc/init.d/mysql restart</pre>
<p>Now install the plugin into mysql.</p>
<pre># mysql -u root -p
INSTALL PLUGIN sphinx SONAME 'ha_sphinx.so';
Query OK, 0 rows affected (0.00 sec)</pre>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=86</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xen + DRBD using pygrub.</title>
		<link>http://ben.timby.com/?p=80</link>
		<comments>http://ben.timby.com/?p=80#comments</comments>
		<pubDate>Wed, 25 Mar 2009 05:42:15 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=80</guid>
		<description><![CDATA[I ran into this problem when I installed CentOS into a Xen domU using the HowTo:
http://wiki.centos.org/HowTos/Xen/InstallingCentOSDomU
After installation, you are urged to use bootloader=&#8221;/usr/bin/pygrub&#8221;
However, trying to start the domU results in the error &#8220;Error: Disk
isn&#8217;t accessible&#8221;. A google search turns up speculation that this is
somehow pygrub&#8217;s fault, however, if one runs pygrub /dev/drbd0, it
works as expected.
The [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into this problem when I installed CentOS into a Xen domU using the HowTo:</p>
<p><a href="http://wiki.centos.org/HowTos/Xen/InstallingCentOSDomU" target="_blank">http://wiki.centos.org/HowTos/Xen/InstallingCentOSDomU</a></p>
<p>After installation, you are urged to use bootloader=&#8221;/usr/bin/pygrub&#8221;</p>
<p>However, trying to start the domU results in the error &#8220;Error: Disk<br />
isn&#8217;t accessible&#8221;. A google search turns up speculation that this is<br />
somehow pygrub&#8217;s fault, however, if one runs pygrub /dev/drbd0, it<br />
works as expected.</p>
<p>The problem is in the xm utility, it attempts to resolve the disk name<br />
(drbd0) into a device name (/dev/drbd0) by using the disk type (drbd).<br />
However, it does not recognize the type drbd, so it fails to do so.<br />
Attached is a patch that simply treats a drbd disk like phy and<br />
returns &#8220;/dev/%s&#8221; % &#8220;drbd0&#8243;.</p>
<p>I realize that a resource (drbd0) may actually use a different device<br />
node than /dev/drbd0, however, resolving this would require parsing<br />
the drbd.conf file and also using the current host name to locate the<br />
correct &#8220;on&#8221; section. I figure this patch is good enough to work for<br />
most folks.</p>
<p>Here is the <a href="http://ben.timby.com/pub/drbd_blkif.patch">patch</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=80</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shame on you.</title>
		<link>http://ben.timby.com/?p=77</link>
		<comments>http://ben.timby.com/?p=77#comments</comments>
		<pubDate>Fri, 13 Mar 2009 22:07:12 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[software freedom]]></category>
		<category><![CDATA[freedom]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=77</guid>
		<description><![CDATA[http://www.ffmpeg.org/shame.html
]]></description>
			<content:encoded><![CDATA[<p><a title="http://www.ffmpeg.org/shame.html" href="http://www.ffmpeg.org/shame.html">http://www.ffmpeg.org/shame.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are you looking for this?</title>
		<link>http://ben.timby.com/?p=76</link>
		<comments>http://ben.timby.com/?p=76#comments</comments>
		<pubDate>Fri, 13 Mar 2009 03:50:54 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[software freedom]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=76</guid>
		<description><![CDATA[Unlock your kindle using kindlepid.py.
http://ben.timby.com/pub/azw-0.2.zip
]]></description>
			<content:encoded><![CDATA[<p>Unlock your kindle using kindlepid.py.</p>
<p><a title="http://ben.timby.com/pub/azw-0.2.zip" href="http://ben.timby.com/pub/azw-0.2.zip">http://ben.timby.com/pub/azw-0.2.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=76</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CLUSTERIP on CentOS 5 Followup.</title>
		<link>http://ben.timby.com/?p=73</link>
		<comments>http://ben.timby.com/?p=73#comments</comments>
		<pubDate>Thu, 05 Mar 2009 15:35:24 +0000</pubDate>
		<dc:creator>btimby</dc:creator>
				<category><![CDATA[clustering]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://ben.timby.com/?p=73</guid>
		<description><![CDATA[I wrote an article about using the iptables CLUSTERIP module for network load sharing. This method works great except that the CLUSTERIP module included in CentOS has a bug. Apparently this bug is fixed in newer kernels, but a patch has not made it into the CentOS RPM for this module.
The problem is that if [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote an article about <a href="http://ben.timby.com/?p=48" target="_self">using the iptables CLUSTERIP module for network load sharing</a>. This method works great except that the CLUSTERIP module included in <a href="http://bugs.centos.org/view.php?id=3191" target="_blank">CentOS has a bug</a>. Apparently this bug is fixed in newer kernels, but a patch has not made it into the CentOS RPM for this module.</p>
<p>The problem is that if you add/delete rules involving CLUSTERIP, eventually the kernel will panic. I could reproduce this every time by doing &#8217;service iptables restart&#8217;. The box would then panic when &#8216;Applying iptables firewall rules:&#8217;. After some investigation, I found a patch for the problem and compiled my own kernel module.</p>
<ul>
<li><a href="https://bugzilla.novell.com/attachment.cgi?id=130050" target="_blank">patch</a></li>
<li><a href="http://wiki.centos.org/HowTos/Custom_Kernel#head-72952b3465e2fc1d84e08512448aa60c7a2e6ec2" target="_blank">preparing kernel sources</a>.</li>
<li><a href="http://wiki.centos.org/HowTos/BuildingKernelModules" target="_blank">compiling a kernel module.</a></li>
</ul>
<p>Now CLUSTERIP is very stable. I plan to configure heartbeat to resize the cluster when a node fails. I will post my experience here as another follow up.</p>
]]></content:encoded>
			<wfw:commentRss>http://ben.timby.com/?feed=rss2&amp;p=73</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
