<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Not Really a Blog &#187; System Administration</title>
	<atom:link href="http://blog.notreally.org/category/computers/system-administration/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.notreally.org</link>
	<description>or is it?</description>
	<lastBuildDate>Tue, 13 Jul 2010 09:48:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.notreally.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/93018cad14db97a3057eb332c3ba920a?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Not Really a Blog &#187; System Administration</title>
		<link>http://blog.notreally.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.notreally.org/osd.xml" title="Not Really a Blog" />
	<atom:link rel='hub' href='http://blog.notreally.org/?pushpress=hub'/>
		<item>
		<title>The effect of temporary tables on MySQL&#8217;s replication</title>
		<link>http://blog.notreally.org/2010/02/06/the-effect-of-temporary-tables-on-mysqls-replication/</link>
		<comments>http://blog.notreally.org/2010/02/06/the-effect-of-temporary-tables-on-mysqls-replication/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 23:05:59 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[System Administration]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[replication]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/?p=193</guid>
		<description><![CDATA[The other day I needed to set up a new set of MySQL instances at work what would replicate from an existing node. I was setting these up because the master node is running out of disk space and is very slow. Usually, when you need to restore a database you do it in three [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=193&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The other day I needed to set up a new set of MySQL instances at work what would replicate from an existing node. I was setting these up because the master node is running out of disk space and is very slow.</p>
<p>Usually, when you need to restore a database you do it in three parts:</p>
<ol>
<li>Install the binaries</li>
<li>Load the initial data from the most recent MySQL backup.</li>
<li>Set it replicating from one of the nodes by specifying the binary log file and position from which you want it to replicate (which usually corresponds to the day you took the backup).</li>
</ol>
<p>Now, because we usually compress the binary logs and because the master didn&#8217;t have enough disk space to have all these binary logs uncompressed (such that the new slave could replicate by connecting to the master and talking the MySQL protocol), I needed to transfer them to the new slave and pipe them into MySQL from there. Seems simple, huh?</p>
<p>Everything went fine on point 1 and 2. But then, while piping the contents of the MySQL binary logs into the new databases, it all went wrong. What I used to pipe them was:</p>
<pre class="brush: bash;">

for file in master-bin* ; do echo &quot;processing $file&quot; ;    ../mysql/bin/mysqlbinlog &quot;$file&quot; | ../mysql/bin/mysql -u root -ppassword  ; done
</pre>
<p>Which is how you usually do these things, but this is what I got:</p>
<pre class="brush: bash;">

db@slave:~/binlogs$ for i in master-bin* ; do echo &quot;processing $file&quot; ;    ../mysql/bin/mysqlbinlog &quot;$file&quot; | ../mysql/bin/mysql -u root -ppassword  ; done
processing master-bin.1853
processing master-bin.1854
processing master-bin.1855
processing master-bin.1856
processing master-bin.1857
processing master-bin.1858
processing master-bin.1859
processing master-bin.1860
ERROR 1146 at line 10024: Table 'av.a2' doesn't exist
processing master-bin.1861
ERROR 1216 at line 1378: Cannot add or update a child row: a foreign key constraint fails
processing master-bin.1862
ERROR 1216 at line 22825: Cannot add or update a child row: a foreign key constraint fails
processing master-bin.1863
</pre>
<p>So, table av.a2 does not exist. WTF?</p>
<p>Investigating a bit about this table, it seems there&#8217;s a script which executes the following stuff on it everyday:</p>
<pre class="brush: bash;">

...

if test $ZZTEST -lt 300000; then
 echo &quot;ERROR: Less than 300k&quot;
 exit 1
fi
cat &gt; sql &lt;&lt; EOF
create temporary table a1 (mzi char(16) default null, key mzi(mzi));
create temporary table a2 (mzi char(16) default null, key mzi(mzi));
create temporary table a3 (mzi char(16) default null, key mzi(mzi));
EOF
cat v | grep ^447.........$ | awk '

...
</pre>
<p>Now, create temporary table, if you read about it on <a href="http://dev.mysql.com/doc/refman/5.1/en/create-table.html">MySQL docs</a> you&#8217;ll see that temporary tables are only visible to the current connection and are dropped automatically when that connection finishes. There are a <a href="http://dev.mysql.com/doc/refman/5.1/en/replication-features-temptables.html">few problems with replication and temporary tables</a>, but this could not possibly be the same problem as these were the binary logs from the master. So, what&#8217;s going on here?</p>
<p>The problem here comes from the binary logs being rotated and the way I was inserting them. It just happened that the three SQL statements:</p>
<pre class="brush: sql;">

create temporary table a1 (mzi char(16) default null, key mzi(mzi));
create temporary table a2 (mzi char(16) default null, key mzi(mzi));
create temporary table a3 (mzi char(16) default null, key mzi(mzi));
</pre>
<p>were created at the end of binary log file master-bin.1859 and then there was a SQL statement which made it fail on file master-bin.1860 (inserting data into av.a2) because it was expecting those temporary tables to exist (and they didn&#8217;t). This happened  <strong>because we are using a for loop in bash to insert the binary logs</strong>, so there&#8217;s o<strong>ne mysql connection for each binary log file</strong> and thus, when file master-bin.1859 finished it automatically made MySQL drop the three temporary tables (that connection was finished) and then on the next connection (file master-bin.1860) these tables were missing.</p>
<p>There are a few ways in which you can work around this.</p>
<p>One approach is to get one big sql file and pipe that into MySQL, something like:</p>
<pre class="brush: bash;">

for file in master-bin.1* ; do echo &quot;Using $file&quot; ; ../mysql/bin/mysqlbinlog &quot;$file&quot; &gt;&gt; all.sql; date  ;  done
cat all.sql &gt; ../mysql/bin/mysql -u root -ppassword
</pre>
<p>Alternatively, doing something like:</p>
<pre class="brush: bash;">
(for file in master-bin.1*; do echo “Using $file” 1&gt;&amp;2; ../mysql/bin/mysqlbinlog $file; date 1&gt;&amp;2; done) | ../mysql/bin/mysql -u root -ppassword
</pre>
<p>If you want to avoid creating one big fat file.</p>
<p>Which should work as in this case it&#8217;s only going to be one connection.</p>
<p>But, these ways have an obvious setback, which is that you cannot have a look at what failed (well, sort of, but extremely difficult) if something goes wrong; It&#8217;ll fail on one of the files and then will fail with the rest of them.</p>
<p>The better approach, as discussed on <a href="http://www.amazon.com/dp/0596101716?">High Performance MySQL</a> is to use a log server, that&#8217;s it, a MySQL server that would not use any storage but will only be used to replay binary logs, so you won&#8217;t have this problem and also, it will let you interact with the server and its diagnostic messages in case something goes awry.</p>
<h2>Use temporary tables?</h2>
<p>My advice here would be to encourage you not to use CREATE TEMPORARY TABLE because it can break replication in mysterious ways, but that could be too harsh. There are a few workarounds that can be done from an application level that you can read in <a href="http://www.xaprb.com/blog/2007/05/11/how-to-eliminate-temporary-tables-in-mysql/">http://www.xaprb.com/blog/2007/05/11/how-to-eliminate-temporary-tables-in-mysql/</a> which I think they could be worth thinking about.</p>
<p>Any experience with these problems?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/193/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/193/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/193/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=193&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2010/02/06/the-effect-of-temporary-tables-on-mysqls-replication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>
	</item>
		<item>
		<title>XFS and barriers</title>
		<link>http://blog.notreally.org/2009/11/17/xfs-and-barriers/</link>
		<comments>http://blog.notreally.org/2009/11/17/xfs-and-barriers/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 09:33:13 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[benchmarking]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[xfs]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/?p=118</guid>
		<description><![CDATA[Lately at work, we&#8217;ve been trying to figure out what the deal with barriers are, either for XFS or EXT3, the two filesystems we like most. If you don&#8217;t know what barriers are, go and read a bit on the XFS FAQ. Short story, XFS comes with barriers enabled by default, EXT3 does not. Barriers [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=118&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lately at <a href="http://www.mxtelecom.com">work</a>, we&#8217;ve been trying to figure out what the deal with barriers are, either for XFS or EXT3, the two filesystems we like most. If you don&#8217;t know what barriers are, go and read a bit on the <a href="http://xfs.org/index.php/XFS_FAQ#Write_barrier_support.">XFS FAQ</a>. Short story, XFS comes with barriers <strong>enabled by default</strong>, EXT3 <strong>does not</strong>. Barriers make your system a lot more secure to data corruption, but it degrades performance a lot. Give that EXT3 does not do checksumming of the journal, you could also have lots of corruptions if it&#8217;s not enabled. Go and read on <a href="http://en.wikipedia.org/wiki/Ext3#No_checksumming_in_journal">wikipedia itself</a>.</p>
<p>If you google a bit you&#8217;ll see that there are <a href="http://mituzas.lt/2008/11/03/xfs-write-barriers/">lots of people</a> who are <a href="http://ondrejcertik.blogspot.com/2008/02/xfs-is-20x-slower-than-ext3-with.html">talking about it</a>, but definitely I haven&#8217;t found and answer to what is best and under which scenarios. So, starting with a little test on XFS, here are the results, totally arbitrary on a personal system of mine. System is an Intel Core 2 Duo CPU e4500 at 2.2 GHz, 2GB of RAM and 500GB of HD in a single one XFS partition. I&#8217;m testing it with<a href="http://www.coker.com.au/bonnie++/"> bonnie++</a> and here are the results. First, mounting by default (<em>that&#8217;s it, barriers <strong>enabled</strong></em>)</p>
<pre class="brush: plain;">
# time bonnie -d /tmp/bonnie/ -u root -f -n 1024
Using uid:0, gid:0.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
kore             4G           54162   9 25726   7           60158   4 234.2   4
Latency                        5971ms    1431ms               233ms     251ms
Version  1.96       ------Sequential Create------ --------Random Create--------
kore                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
 files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
 1024   260  11 489116  99   299   1   262  11 92672  56   165   0
Latency               411ms    3435us     595ms    2063ms     688ms   23969ms

real    303m50.878s
user    0m6.036s
sys    17m52.591s
#
</pre>
<p>Second time, after a few hours, doing a</p>
<pre class="brush: bash;">
mount -oremount,rw,nobarrier /
</pre>
<p>we get these results (<strong>barriers not enabled</strong>):</p>
<pre class="brush: plain;">
# date ;time bonnie -d /tmp/bonnie/ -u root -f -n 1024 ; date
Tue Nov 17 00:43:53 GMT 2009
Using uid:0, gid:0.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
kore             4G           66059  12 30185  10           71108   5 238.6   3
Latency                        4480ms    3911ms               171ms     250ms
Version  1.96       ------Sequential Create------ --------Random Create--------
kore                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
1024  1830  85 490304  99  4234  17  3420  24 124090  78   402   1
Latency               434ms     165us     432ms    1790ms     311ms   26826ms

real    67m21.588s
user    0m5.668s
sys     11m30.123s
Tue Nov 17 01:51:15 GMT 2009
</pre>
<p>So, I think you can actually tell how different they behave. I haven&#8217;t created graphs from these results to show them graphically, but let me show you some monitoring graphs from these two experiments. The first test was run yesterday in the afternoon. The second one was run just after midnight. You can see the difference. Here showing you the CPU and load average graphs.</p>
<p>I&#8217;ll try to follow up shortly with more findings, if I find any <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Please, feel free to add any suggestion or comments about your own experiences with these problems.</p>
<div class="wp-caption alignleft" style="width: 507px"><img title="CPU Usage" src="http://images.notreally.org/b.n.o/xfs-cpu.png" alt="CPU Usage" width="497" height="272" /><p class="wp-caption-text">CPU Usage</p></div>
<div class="wp-caption alignleft" style="width: 507px"><img title="Load Average" src="http://images.notreally.org/b.n.o/xfs-load.png" alt="Load Average" width="497" height="202" /><p class="wp-caption-text">Load Average</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=118&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2009/11/17/xfs-and-barriers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>

		<media:content url="http://images.notreally.org/b.n.o/xfs-cpu.png" medium="image">
			<media:title type="html">CPU Usage</media:title>
		</media:content>

		<media:content url="http://images.notreally.org/b.n.o/xfs-load.png" medium="image">
			<media:title type="html">Load Average</media:title>
		</media:content>
	</item>
		<item>
		<title>Monitoring data with Collectd</title>
		<link>http://blog.notreally.org/2009/11/15/monitoring-data-with-collectd/</link>
		<comments>http://blog.notreally.org/2009/11/15/monitoring-data-with-collectd/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 18:50:12 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[System Administration]]></category>
		<category><![CDATA[monitoring]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/?p=107</guid>
		<description><![CDATA[I&#8217;ve been using collectd for quite a while just to monitor the performance of my workstation. I&#8217;ve tried other solutions (cacti, munin, etc) but I didn&#8217;t like how it all worked or the graphs it created, the amount of work required to have it working, or any other reason, finding collectd to be overall a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=107&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://collectd.org/">collectd</a> for quite a while just to monitor the performance of my workstation. I&#8217;ve tried other solutions (cacti, munin, etc) but I didn&#8217;t like how it all worked or the graphs it created, the amount of work required to have it working, or any other reason, finding collectd to be overall a good solution for my monitoring needs (which are basically graphing and getting some alerts). I like it because it generates nice and good graphs (among other things):</p>
<p><img class="alignright" title="collectd example" src="http://images.notreally.org/b.n.o/collectd-example.png" alt="" width="497" height="216" /></p>
<p>But what I like the most about it is the architecture it&#8217;s got for sending data and its low memory footprint.</p>
<p>Today I&#8217;ve been playing with it to use the <a href="http://collectd.org/wiki/index.php/Networking_introduction">network plugin</a> and I quite like it.  The network plugin allows you to have clients sent the monitoring results to a central server, just like the picture below. It sends the data using UDP, which then is captured by the server which will store the data in rrd files and thus having all the data centrally stored. This way, it guarantees that the server it&#8217;s not going to block on sending this data. Obviously we want to make sure our connection is reliable.</p>
<p><img class="alignnone" title="Collectd architecture" src="http://images.notreally.org/b.n.o/collectd.png" alt="Collectd Architecture" width="396" height="306" /></p>
<p>Which means that you can have collectd running on a number of computers and having them sending the data to a server which can be used to store all this data and display it. The magic about it is that the memory footprint is very small (it&#8217;s written in C) and that it can send the data to a single server or more than one, even sending them using a <strong>multicast group</strong>, which is very nice.</p>
<p>Things that it, allegedly, doesn&#8217;t do very well is monitoring and generating alerts (but last version it claims it can have simple thresholds). Also, the web interface <em>collection3</em> written in perl is a major <em>liability</em>.</p>
<p>So, I&#8217;m planning on spending a few more hours playing with this and possibly coming up with an article on how to set it up integrated with my systems and trac. Such that I :</p>
<ol>
<li>Have a plugin to display graphs on a wiki page, on trac possibly.</li>
<li>Have it sending the data via openvpn (although the latest version supports encryption and signing) for clients behind a firewall.</li>
<li>Make the most use of the plugins.</li>
</ol>
<p>Any suggestions for a better web interface for collectd?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=107&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2009/11/15/monitoring-data-with-collectd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>

		<media:content url="http://images.notreally.org/b.n.o/collectd-example.png" medium="image">
			<media:title type="html">collectd example</media:title>
		</media:content>

		<media:content url="http://images.notreally.org/b.n.o/collectd.png" medium="image">
			<media:title type="html">Collectd architecture</media:title>
		</media:content>
	</item>
		<item>
		<title>Little surprises in HTTP Headers</title>
		<link>http://blog.notreally.org/2009/10/15/little-surprises-in-http-headers/</link>
		<comments>http://blog.notreally.org/2009/10/15/little-surprises-in-http-headers/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 22:59:12 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[hackers]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/?p=66</guid>
		<description><![CDATA[Last week I move a blog I&#8217;ve got in Spanish to wordpress.com. Basically I really like wordpress.com and I believe it&#8217;s really worth it in terms of freeing my time from administering a wordpress installation and keeping up with the security fixes etc. And today, having a little bit of time I was tweaking my [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=66&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Last week I move a <a href="http://blog.roncero.org">blog I&#8217;ve got in Spanish</a> to <a href="http://wordpress.com">wordpress.com</a>. Basically I really like wordpress.com and I believe it&#8217;s really worth it in terms of freeing my time from administering a wordpress installation and keeping up with the security fixes etc. And today, having a little bit of time I was tweaking my old website to redirect to the new site using an <a href="http://httpd.apache.org/docs/2.2/mod/mod_alias.html">HTTP permanent redirect</a> header. This is what I found in the <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> <a href="http://en.wikipedia.org/wiki/List_of_HTTP_headers">headers</a>:</p>
<pre class="brush: plain;">
[golan@mars ~] % HEAD http://roncero.org/blog/
200 OK
Cache-Control: max-age=260, must-revalidate
Connection: close
Date: Thu, 15 Oct 2009 21:35:09 GMT
Server: nginx
Vary: Cookie
Content-Type: text/html; charset=UTF-8
Last-Modified: Thu, 15 Oct 2009 21:34:29 +0000
Client-Date: Thu, 15 Oct 2009 21:35:09 GMT
Client-Peer: 76.74.254.123:80
Client-Response-Num: 1
Link: ; rel=shortlink
X-Hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.
X-Nananana: Batcache
X-Pingback: http://blog.roncero.org/xmlrpc.php
</pre>
<p>So, apart from various bits of information (nginx), what I really really liked was the X-Hacker header <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . <a href="http://automattic.com/jobs">Fancy a job?</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=66&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2009/10/15/little-surprises-in-http-headers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>
	</item>
		<item>
		<title>Tricks to diagnose processes blocked on strong I/O in linux</title>
		<link>http://blog.notreally.org/2008/02/10/tricks-to-diagnose-processes-blocked-on-strong-io-in-linux/</link>
		<comments>http://blog.notreally.org/2008/02/10/tricks-to-diagnose-processes-blocked-on-strong-io-in-linux/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 23:59:14 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[hackers]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/articles/2008/02/10/tricks-to-diagnose-processes-blocked-on-strong-io-in-linux/</guid>
		<description><![CDATA[There&#8217;s one aspect of the Linux kernel and the GNU operating system and related tools in which it might be lacking behind, specially with kernel 2.4 series. I&#8217;m talking about I/O accounting or how to know what&#8217;s going on with the hard disk or other devices which are used to write and read data. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=53&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s one aspect of the Linux kernel and the GNU operating system and related tools in which it might be lacking behind, specially with kernel 2.4 series. I&#8217;m talking about I/O accounting or how to know what&#8217;s going on with the hard disk or other devices which are used to write and read data.</p>
<p>The thing is that Linux provides you with a few tools with which you can tell what&#8217;s going on with the box and its set of disks. Say <strong>vmstat</strong> provides you with a lot of information and various other files scattered in the <tt>/proc</tt> filesystem. But that information only tells us about the system globally, so it&#8217;s good for diagnosing if a high load on a box is due to some process chewing CPU cycles away or because of the hard disk being hammered and being painfully slow. But what about if you want to know what exactly is going on, which process or processes are responsible for the situation, how do you know? The answer is that Linux doesn&#8217;t provide you with tools for that, as far as I know (If you know of any, please leave a comment). There&#8217;s no such thing as a top utility for process I/O accounting. The situation is better in Linux 2.6 provided you activate the <a href="http://www.mjmwired.net/kernel/Documentation/accounting/taskstats.txt">taskstats accounting module</a> with which you can query information about the processes. The user-space utilities are <a href="http://search.cpan.org/~scottw/Linux-Taskstats-Read-4.00/">somewhat scarce</a>, but at least there&#8217;s something with which you can start playing.</p>
<p>However there are some tricks you can use to try to find out which process is the culprit when things go wrong. As usually, many of these tricks come from work where I keep learning from my colleagues, who, by the way, are  much more intelligent than I am <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> , when things go wrong and some problem arises that needs immediate action.</p>
<p>So, let&#8217;s define the typical scenario on which we could apply these tricks. You&#8217;ve got a Linux box which has a high load average. Say 15, 20, etc. As you may know, the load average measures the number of processes that are waiting to be executed on the process queue. That doesn&#8217;t necessarily mean that the CPU is loaded when, for example, processes are blocked because of I/O, say a read from the disk because this is slow or something. The CPU would just sit there most of the time being idle. This number makes sense when you know the number of CPU the box has. If you have a <em>loadavg</em> of 2 in a two-CPU box, then you are just fine, ideally.</p>
<p>The number one tool for  identifying what&#8217;s going on is <a href="http://gd4.tuwien.ac.at/.vhost/linuxcommand.org/man_pages/vmstat8.html">vmstat</a>, which would tell you a lot of things going on in the box, specially when you execute it periodically as <tt>vmstat 1</tt>. If you read the man page (and I do recommend you to read it), you can get an idea of all the information what would be going through the screen <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . <a href="http://www.flickr.com/photos/golan/464063579/sizes/o/">Click here to see a screen shot of the output of <em>vmstat</em> on 4 different boxes</a>. Almost all of its output is useful for diagnosis, except the last column in the case of a Linux 2.4 box (that value is added to the idle column).</p>
<p>With this tool we can find out if the system is busy on I/O and how. For example by looking at the <strong>bo</strong> and <strong>bi</strong> columns. Swapping, when it&#8217;s happening, could also imply that the hard disk is being hammered but that would also mean that there&#8217;s not enough memory in the system for all the processes running at that very moment. Well, all of its output can be useful for identifying what&#8217;s going on.</p>
<p>Ok, so back to our problem, how do we start? Well, the first thing to do is to try to find out what&#8217;s on execution that could be causing this. Who are the usual suspects. By looking at <tt>ps</tt> output we could get an idea of which processes and/or application could be causing the disk I/O. The problem with this is that sometimes an application runs tens or hundreds of processes, each of which is serving a remote client (say Apache prefork) and maybe only some of them are causing the havoc, so killing all possible processes is not an option in a production environment (possibly killing the processes causing the problem is feasible because they might be wedged or something).</p>
<p><strong>Finding the suspects</strong></p>
<p>One way to find what processes are causing the writes and reads  is to have a look at the processes in  <a href="http://en.wikipedia.org/wiki/Uninterruptible_sleep">uninterruptible sleep</a> state. As the box has a high load average because of I/O, surely there must be processes in such a state because they are waiting for the disk to return back the data and return from their system calls. And these processes are likely to be involved in the high load of the system. If you think that uninterruptible sleep processes cannot be killed you are right, but we are assuming that they are in this state briefly again and again because of reading and writing to the disk non-stop. If you have read the vmstat man page, you must have noticed that the column <strong>b</strong> tells us the number of processes in such a state.</p>
<pre>golan@kore:~$ ps aux | grep " D"
root     27351  2.9  0.2 11992 9160 ?        DN   23:06   0:08 /usr/bin/python /usr/bin/rdiff-backup -v 5 --restrict-read-only /disk --server
mail     28652  0.5  0.0  4948 1840 ?        D    23:11   0:00 exim -bd -q5m
golan    28670  0.0  0.0  2684  804 pts/23   S+   23:11   0:00 grep --color  D</pre>
<p>Here we can see two processes in such a state (noted by <strong>D </strong>on ps output). Normally we don&#8217;t get to see many of these at the same time and if we issue the same command again, we are probably not going to see it again unless there is a problem which is why I&#8217;m writing this in the first place <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><strong>Examining the suspects</strong></p>
<p>Well, we now need to examine the suspects and filter them, because there might be perfectly valid processes that are in uninterruptible sleep state but are not responsible of the high load, so we need to find out. One thing that we could do is attach <a href="http://sourceforge.net/projects/strace/">strace</a> to a specific process and see how it&#8217;s doing. This can be easily achieved this way:</p>
<pre>golan@kore:~$ strace -p 12766
Process 12766 attached - interrupt to quit
write(1, "y\n", 2)                      = 2</pre>
<p>Here we see the output of a process executing <strong>yes</strong>. So, what does this output tell us? It shows us all the system calls that the process is doing, so we can effectively see if it is reading or writing.</p>
<p>But all this can be very time consuming if we have quite a few processes to examine. What we could do is strace all of them and save their output to different files and then check them later:</p>
<p>If what we are examining is a process called <strong>command</strong>, we could  do it this way:</p>
<pre># mkdir /tmp/strace
# cd /tmp/strace
# for i in `ps axuwf | grep command | awk '{ print $2 }'`; do (strace -p $i &gt; command-$i.strace 2&gt;&amp;1)&amp;  done</pre>
<p>What this would do is create a series of files called <tt>command-PID-strace</tt>, one for each of the processes that match the regular expression in the grep command. If we set this running for a while, we can now examine the contents of all the files. Even better if we display the files ordered by <strong>size</strong> we would have a pointer to the process that are doing the most system calls. All we would need to do is verify that those system calls are actually read and write system calls. And also, don&#8217;t forget to kill all the strace processes that we sent to the background by issuing a <tt>killall strace</tt> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>So now we have a list of processes that are causing lots of reads and writes in the hard disk. What to do next depends on the situation and what you want to do. You might want to kill the processes, or find who (the person) who started them, in case they were started by someone. Or which network connection, IP address, etc. There are a bunch of utilities that you can use including strace, <a href="http://en.wikipedia.org/wiki/Netstat">netstat</a>, <a href="http://en.wikipedia.org/wiki/Lsof">lsof</a>, etc. It&#8217;s up to you what to do next.</p>
<p><strong>And&#8230;</strong></p>
<p>Well, This is me learning from my colleagues and from problems that arise when you don&#8217;t expect them. My understanding of the Linux kernel is not that good, but now many of the things that I studied in the Operating System class start to make a little bit more sense. So please, if you have experience with this, know of other ways to get this kind of information, please share it with me (as a comment or otherwise). I&#8217;m still learning <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/blognotreally.wordpress.com/53/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/blognotreally.wordpress.com/53/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=53&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2008/02/10/tricks-to-diagnose-processes-blocked-on-strong-io-in-linux/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>
	</item>
		<item>
		<title>Installing From Source, The Easy Way</title>
		<link>http://blog.notreally.org/2008/01/21/installing-from-source-the-easy-way/</link>
		<comments>http://blog.notreally.org/2008/01/21/installing-from-source-the-easy-way/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 00:40:06 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/articles/2008/01/21/installing-from-source-the-easy-way/</guid>
		<description><![CDATA[Installing software in any unix-like operating system these days has become very easy. Package managers such as dpkg, the one used by Debian or Ubuntu, take most of the hassle by dealing with all the dependencies and intricacies that modern software has nowadays. It&#8217;s just a matter of getting the package that some hard-working and/or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=52&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Installing software in any unix-like operating system these days has become very easy. Package managers such as dpkg, the one used by <a href="http://www.debian.org" title="Debian">Debian</a> or <a href="http://www.ubuntu.com" title="Ubuntu">Ubuntu</a>, take most of the hassle by dealing with all the dependencies and intricacies that modern software  has nowadays. It&#8217;s just a matter of getting the package that some hard-working and/or generous developer has made and install it in our system. It&#8217;s straightforward compared with how things were a mere few years ago.</p>
<p>We&#8217;ve always had the possibility of installing from the software, provided we have resolved all the needed dependencies. Installing from the source can be handy and useful at times. We might want to change some options on compile time or we might want to have two versions of the same package installed on different locations for example.</p>
<p>The problem lies when we want to upgrade the software and we have different versions of it installed, we could end up in a very cluttered scenario, say, with files installed across the file system from different versions of it. Even more, we might not have an easy way to track down which files belong to which version, let alone uninstalling the software.</p>
<p><strong>The Easy Way ® <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </strong></p>
<p>As always there are simple solutions for complex problems. There is a nice piece of software which helps us to keep track of software packages installed from source in a clean way. It doesn&#8217;t work for all cases, but it does a pretty good job for most of them. I&#8217;m talking about <a href="http://www.encap.org/epkg/">epkg</a>,<em> The Encap Package Manager</em>.</p>
<p>I&#8217;ll try to describe how it works in a not very technical or detailed way, just to get you going with it and then I&#8217;ll install it on my system so you&#8217;ll be able to see how handy it is.</p>
<p>Basically, all you have to do is install all software packages on a directory on <code>/usr/local/encap</code>, creating a directory for each of them  in a <code>package-version.revision</code> fashion. Then we will use epkg to just create symlinks to the appropriate places, usually <code>/usr/local</code>.</p>
<p>So, say we&#8217;ve got:</p>
<pre>
/usr/local/encap/mysoft-1.1/bin/mysoft
/usr/local/encap/mysoft-1.1/lib/mysoft.so</pre>
<p>epkg would create symlinks such as:</p>
<pre>
/usr/local/bin/mysoft  -&gt;  /usr/local/encap/mysoft-1.1/bin/mysoft
/usr/local/lib/mysoft.so  -&gt; /usr/local/encap/mysoft-1.1/lib/mysoft.so</pre>
<p>and that&#8217;s it, pretty much. With more complex packages it can get more difficult, but you get the idea.</p>
<p><strong>Let&#8217;s just see an example </strong></p>
<p>First of all, we need to install epkg on our system. I will be using an Ubuntu 7.10 system, which, to date, doesn&#8217;t have epkg on it. So I will install it from source in the usual way, to <code>/usr/local</code></p>
<pre>
root@kore:/usr/local/src# wget ftp://ftp.encap.org/pub/encap/epkg/epkg-2.3.9.tar.gz
--23:47:17--  ftp://ftp.encap.org/pub/encap/epkg/epkg-2.3.9.tar.gz
           =&gt; `epkg-2.3.9.tar.gz'
...
23:47:32 (85.66 KB/s) - `epkg-2.3.9.tar.gz' saved [237232]

root@kore:/usr/local/src# tar xfz epkg-2.3.9.tar.gz
root@kore:/usr/local/src# cd epkg-2.3.9/
root@kore:/usr/local/src/epkg-2.3.9#
root@kore:/usr/local/src/epkg-2.3.9# ./configure --prefix=/usr/local
checking for epkg... no
checking for mkencap... no
checking for Encap source directory... /usr/local/encap
checking for Encap target directory... /usr/local
checking for Encap package directory... /usr/local/encap/epkg-2.3.9
checking for gcc... gcc
...
config.status: creating epkg/Makefile
config.status: creating mkencap/Makefile
config.status: creating mkencap/mkencap_environment
config.status: creating doc/Makefile
config.status: creating config.h</pre>
<p>As we see, we&#8217;ll install the package with its default options, pointing to to <code>/usr/local/encap</code> as the <em>encap</em> directory. Please, see the help for more options.</p>
<p>We install it:</p>
<pre>
root@kore:/usr/local/src/epkg-2.3.9# make &amp;&amp; make install
...
epkg: installing package epkg-2.3.9...
  &gt; reading Encap source directory...
  &gt; installing package epkg-2.3.9
    !  man: not an Encap link
    &gt; executing postinstall script
installing: /usr/local/etc/mkencap_environment
    &gt; installation partially successful
root@kore:/usr/local/src/epkg-2.3.9#</pre>
<p>If we have a look at <code>/usr/local/bin</code> and <code>/usr/local/encap</code> it has installed itself as an <em>encapped</em> package <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , and now we are ready to use it with a real example.</p>
<p><strong>Installing GLE</strong></p>
<p>Say we wanted to install <a href="http://glx.sourceforge.net/">The Graphics Layout Engine, or GLE</a> on our computer and we don&#8217;t have a binary package at hand, or we want to control it, or whatever <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , let&#8217;s just do it with epkg.</p>
<ol>
<li><strong>Get the source</strong>
<pre>
root@kore:/usr/local/src# wget http://surfnet.dl.sourceforge.net/sourceforge/glx/GLE-4.1.1-src.zip
root@kore:/usr/local/src# unzip GLE-4.1.1-src.zip
root@kore:/usr/local/src# cd gle4/</pre>
</li>
<li><strong>Configure</strong>: We will be configuring the software to make it believe it is going to be installed on <code>/usr/local</code> but we will actually install it on <code>/usr/local/encap/</code> instead, so epkg can deal with it. This is an <strong>important</strong> step, so let&#8217;s just do it by configuring it with those options and with any other that we might want to use:
<pre>
root@kore:/usr/local/src/gle4# aptitude install libpng12-dev libpng12-0 libtiff4-dev libtiff4 libjpeg62-dev libjpeg62
root@kore:/usr/local/src/gle4# ./configure --with-qt=no --prefix=/usr/local
...
root@kore:/usr/local/src/gle4# make
...</pre>
<p>As you can see, I installed some dev packages (using debian&#8217;s aptitude) because they are dependencies for GLE. After that, I configure the package without any graphical environment (based on <a href="http://www.trolltech.no">Qt</a>) and pointing to <code>/usr/local</code>. Then we compile it.</li>
<li><strong>Installing</strong>. Now, we will be installing it on <code>/usr/local/encap</code>. Bear with me now and I&#8217;ll explain what I did after doing it <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
<pre>
root@kore:/usr/local/src/gle4# make DESTDIR=/usr/local/encap/GLE-4.1.1 install
root@kore:/usr/local/encap/GLE-4.1.1#
root@kore:/usr/local/encap/GLE-4.1.1# mv usr/local/* .
root@kore:/usr/local/encap/GLE-4.1.1# rm -rf usr
root@kore:/usr/local/encap/GLE-4.1.1# ls
bin  lib  share</pre>
<p>Ok, we what I&#8217;ve done is execute <em><code>make install</code></em> but setting the <code>DESTDIR</code> variable (which is supported by GLE&#8217;s <code>Makefile</code>) to install it on <code>/usr/local/encap/GLE-4.1.1</code>. But there, it is usually installed within its own &#8220;<code>usr/local</code>&#8221; directory, so to make it be as if it were installed on <code>/usr/local</code> hierarchy, we move it to the right place so now we have:</p>
<pre>
/usr/local/encap/GLE-4.1.1/bin
/usr/local/encap/GLE-4.1.1/lib
/usr/local/encap/GLE-4.1.1/share</pre>
<p>and so on.</li>
<li><strong>Install it with epkg</strong> Now the final step is to call epkg to actually create the proper symlinks and that&#8217;s it:
<pre>
root@kore:/usr/local/encap/GLE-4.1.1# epkg GLE
epkg: installing package GLE...
  &gt; reading Encap source directory...
  &gt; installing package GLE-4.1.1
    &gt; installation successful
root@kore:/usr/local/encap/GLE-4.1.1#
root@kore:/usr/local/encap/GLE-4.1.1# gle
GLE version 4.1.1
Usage: gle [options] filename.gle
More information: gle -help
root@kore:/usr/local/encap/GLE-4.1.1#</pre>
</li>
</ol>
<p>And that&#8217;s it, really. Now, two things,</p>
<ul>
<li> If we install a newer version, say 4.2.0 whenever that&#8217;s ready, we just install it on <code>/usr/local/encap/GLE-4.2.0</code> as we&#8217;ve seen before, and simple calling again
<pre>
# epkg GLE</pre>
<p>would create the right symlinks (that&#8217;s it, &#8220;deinstall&#8221; the previous version and install the new one.</li>
<li> If we want to uninstall it, that&#8217;s it, remove the symlinks, we simply issue this command:
<pre>
# epkg -r GLE</pre>
<p>and that&#8217;s all.</li>
</ul>
<p><strong>Summary</strong></p>
<ol>
<li> <strong>epkg</strong> lets us install software from source having control over it, ie. Installing it in a clean way, being able to deinstall it and upgrade it without cluttering the file system</li>
<li> All you have to do is install the software on <code>/usr/local/encap/package-version</code> as if were <code>/usr/local</code>. The variable <strong><code>DESTDIR</code></strong> on <a href="http://en.wikipedia.org/wiki/Makefile"><code>Makefiles</code></a> helps us to do it in an easy way. If the software is too simple, you&#8217;ll have to do it manually.</li>
<li> Remember <code>/usr/local/encap/package-version/usr/local/bin</code> must end up as <code>/usr/local/encap/package-version/bin</code>.</li>
<li> Execute <code>epkg package</code> to install it and <code>epkg -r package</code> to uninstall it.</li>
<li>If you have problems with the libraries, try executing <a href="http://linux.die.net/man/8/ldconfig"><code>ldconfig</code></a>.</li>
<li> <strong>Be Careful</strong> I usually make mistakes, overwrite things and delete files, so take care with what you do and do it under your own responsibility <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</li>
</ol>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/blognotreally.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/blognotreally.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=52&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2008/01/21/installing-from-source-the-easy-way/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>
	</item>
		<item>
		<title>Modifying a live linux kernel</title>
		<link>http://blog.notreally.org/2007/12/19/modifying-a-live-linux-kernel/</link>
		<comments>http://blog.notreally.org/2007/12/19/modifying-a-live-linux-kernel/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 17:22:20 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[hackers]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/articles/2007/12/19/modifying-a-live-linux-kernel/</guid>
		<description><![CDATA[Before reading this, I just need to say something: I&#8217;ve no idea of linux, I&#8217;ve no idea of programming, I&#8217;ve no idea of computers&#8230; Everything you read here might have been invented, so, please, do not reproduce what I write here. If you do, bear in mind that you do it under your own responsibility. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=51&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Before reading this, I just need to say something:</p>
<blockquote><p>I&#8217;ve no idea of linux, I&#8217;ve no idea of programming, I&#8217;ve no idea of computers&#8230; Everything you read here might have been invented, so, please, do not reproduce what I write here. If you do, bear in mind that you do it under your own responsibility. In fact, what is a computer anyway?</p></blockquote>
<p>The other day we were having issues with a box that was used as a NFS box among other things. These issues appeared on upgrading this box from kernel 2.4 to <a href="http://www.kernel.org">kernel 2.6.22.1</a>. These issues were related to locking on the NFS server, because of changing the behaviour of the <a href="http://linux.die.net/man/2/flock">flock system call</a> on linux 2.6.11-18. From the<a href="http://nfs.sourceforge.net/"> NFS FAQ</a>:</p>
<blockquote><p>The NFS client in 2.6.12 provides support for <tt>flock()</tt>/BSD locks on NFS files by emulating the BSD-style locks in terms of POSIX byte range locks. Other NFS clients that use the same emulation mechanism, or that use <tt>fcntl()</tt>/POSIX locks, will then see the same locks that the Linux NFS client sees.</p></blockquote>
<p>The problems we had are related to using NFS and Samba for exporting the same file system and locking not working properly.</p>
<blockquote><p>SMB supports two types of locks &#8211; file-wide locks and byte-range locks.</p>
<ul>
<li>File-wide locks
<ul>
<li> Called &#8216;share modes&#8217; in SMB parlance</li>
<li> Also known as &#8216;BSD-style locks&#8217;</li>
<li></li>
<li> provided by flock() in Linux</li>
<li> provided by a &#8216;share mode&#8217; flag when opening a file under Win32</li>
<li>Supported primarily by samba within samba itself by storing in a TDB &#8211; get listed under &#8216;Locked Files&#8217; at the bottom of smbstatus</li>
<li>May also be enforced in the kernel using flock() if HAVE_KERNEL_SHARE_MODES is 1.</li>
</ul>
</li>
<li>Byte-range locks
<ul>
<li> Called &#8216;POSIX-style&#8217; locks.</li>
<li> provided by fcntl(fd, F_GETLK) in POSIX.</li>
<li> provided by _locking() in Win32</li>
<li> lockf() is a Linux wrapper around fcntl() for locking the whole file.</li>
<li> Supported by samba by a &#8216;Windows to POSIX byte-range overlap conversion layer&#8217; and then fcntl().</li>
</ul>
</li>
</ul>
<p>Windows applications appear to use both share modes and byterange locks.</p>
<p>In Linux, flock() and fcntl() locks are oblivious to each other, as per <a href="http://lxr.linux.no/source/Documentation/locks.txt"> http://lxr.linux.no/source/Documentation/locks.txt</a>.</p>
<p>NFSv3 (as a protocol) only supports byte-range locks.  However, nfsd does flock() locks on files on the server taken out by other processes &#8211; although clients cannot set them themselves.  See <a href="http://nfs.sourceforge.net/#faq_d10"> http://nfs.sourceforge.net/#faq_d10</a></p>
<p>Unfortunately, linux 2.6.12 adds flock() emulation to the Linux NFS client by translating it into a file-wide fcntl().  This means that flock()s and fcntl()s *do collide* on remote NFS shares, which introduces all the potential application race conditions which Linux avoided by having them oblivious to each other locally.  The practical upshot of this is that if you re-share an NFS share via samba, then if a Windows client (e.g. Outlook opening a PST file) opens a file with a share mode, then byte-range locking operations will fail as the lock has already been acquired.  (The fact that NFS doesn&#8217;t realise the same PID has both locks and allow them both is probably an even bigger problem).  The solution for this is to revert bits of the patch responsible: <a href="http://www.linux-nfs.org/Linux-2.6.x/2.6.11/linux-2.6.11-18-flock.dif"> http://www.linux-nfs.org/Linux-2.6.x/2.6.11/linux-2.6.11-18-flock.dif</a>.  Disabling share modes in samba is not an option, as it also disables the application-layer TDB support for them &#8211; and disabling HAVE_KERNEL_SHARE_MODES will stop other programs (e.g. nfsd) on dump being aware of what&#8217;s been flock()ed.</p></blockquote>
<p>So our solution for our server was reverting this patch on 2.6.11-18 and apply this patch:</p>
<pre class="brush: diff;">
--- fs/nfs/file.c       2007-07-10 19:56:30.000000000 +0100
+++ fs/nfs/file.c.nfs_flock_fix 2007-11-13 13:40:06.000000000 +0000
@@ -543,10 +543,24 @@
         * Not sure whether that would be unique, though, or whether
         * that would break in other places.
         */
-       if (!(fl-&gt;fl_flags &amp; FL_FLOCK))
+
+       /**
+        * Don't simulate flock() using posix locks, as they appear to collide with
+        * legitimate posix locks from the same process.
+        */
+       if (fl-&gt;fl_flags &amp; FL_FLOCK)
                return -ENOLCK;

        /* We're simulating flock() locks using posix locks on the server */
+       /* ...except we shouldn't get here, due to the above patch. */
        fl-&gt;fl_owner = (fl_owner_t)filp;
        fl-&gt;fl_start = 0;
        fl-&gt;fl_end = OFFSET_MAX;
</pre>
<p>So, for us, recompiling the kernel with such patch on the production server fixes all our problems. But, what if we wanted to do this live, could such a subtle change be done without rebooting? You might be thinking right now about the different options that you have on /proc about changing the behaviour of the kernel live, but what if you don&#8217;t have such option? What if we wanted to change something and there was no way to do this because it is not implemented or not possible?</p>
<p><strong>Let&#8217;s see.</strong></p>
<p>So, <strong>from an academic point of view</strong> we wanted to see if this could really be done. If the linux kernel would let us do that, if it was feasible. So, we set up a testing box in which we would try to modify the running kernel. How hard would be to do it on the testing box?</p>
<p>It seems there&#8217;s a way to do it which my colleague Matthew came up with (all credit to him, I&#8217;m just telling the story). Let&#8217;s examine the piece of code that we want to change. The offending code lives on the file fs/nfs/file.c of the linux kernel</p>
<pre class="brush: cpp;">
*
 * Lock a (portion of) a file
 */
static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl)
{
        dprintk(&quot;NFS: nfs_flock(f=%s/%ld, t=%x, fl=%x)n&quot;,
                        filp-&gt;f_path.dentry-&gt;d_inode-&gt;i_sb-&gt;s_id,
                        filp-&gt;f_path.dentry-&gt;d_inode-&gt;i_ino,
                        fl-&gt;fl_type, fl-&gt;fl_flags);
         /*
         * No BSD flocks over NFS allowed.
         * Note: we could try to fake a POSIX lock request here by
         * using ((u32) filp | 0x80000000) or some such as the pid.
         * Not sure whether that would be unique, though, or whether
         * that would break in other places.
         */

        if (!(fl-&gt;fl_flags &amp; FL_FLOCK))
                return -ENOLCK;

        /* We're simulating flock() locks using posix locks on the server */
        fl-&gt;fl_owner = (fl_owner_t)filp;
        fl-&gt;fl_start = 0;
        fl-&gt;fl_end = OFFSET_MAX;

        if (fl-&gt;fl_type == F_UNLCK)
                return do_unlk(filp, cmd, fl);

        return do_setlk(filp, cmd, fl);

}
</pre>
<p>What we wanted to do is to change the behaviour of the previous function such that the if condition would be:</p>
<pre class="brush: cpp;">
        if (fl-&gt;fl_flags &amp; FL_FLOCK)
                return -ENOLCK;&lt;/pre&gt;
</pre>
<p>That means that the change is fairly trivial and that it would result in switching an operation, basically changing the way the branching (in the machine code) is done on the <strong>if</strong> instruction. If we disassemble such object file, file.o, we get something like</p>
<pre class="brush: plain;">
# objdump -d fs/nfs/file.o
...
00000885 :
 885:   57                      push   %edi
 886:   89 d7                   mov    %edx,%edi
 888:   56                      push   %esi
 889:   89 c6                   mov    %eax,%esi
 88b:   53                      push   %ebx
 88c:   89 cb                   mov    %ecx,%ebx
 88e:   83 ec 14                sub    $0x14,%esp
 891:   f6 05 00 00 00 00 40    testb  $0x40,0x0
 898:   74 3b                   je     8d5
 89a:   0f b6 41 2c             movzbl 0x2c(%ecx),%eax
 89e:   89 44 24 10             mov    %eax,0x10(%esp)
 8a2:   0f b6 41 2d             movzbl 0x2d(%ecx),%eax
 8a6:   89 44 24 0c             mov    %eax,0xc(%esp)
 8aa:   8b 56 0c                mov    0xc(%esi),%edx
 8ad:   8b 42 0c                mov    0xc(%edx),%eax
 8b0:   8b 40 20                mov    0x20(%eax),%eax
 8b3:   89 44 24 08             mov    %eax,0x8(%esp)
 8b7:   8b 42 0c                mov    0xc(%edx),%eax
 8ba:   8b 80 9c 00 00 00       mov    0x9c(%eax),%eax
 8c0:   c7 04 24 20 01 00 00    movl   $0x120,(%esp)
 8c7:   05 40 01 00 00          add    $0x140,%eax
 8cc:   89 44 24 04             mov    %eax,0x4(%esp)
 8d0:   e8 fc ff ff ff          call   8d1
 8d5:   f6 43 2c 02             testb  $0x2,0x2c(%ebx)
 8d9:   74 47                   je     922
 8db:   80 7b 2d 02             cmpb   $0x2,0x2d(%ebx)
 8df:   89 73 14                mov    %esi,0x14(%ebx)
 8e2:   c7 43 30 00 00 00 00    movl   $0x0,0x30(%ebx)
 8e9:   c7 43 34 00 00 00 00    movl   $0x0,0x34(%ebx)
 8f0:   c7 43 38 ff ff ff ff    movl   $0xffffffff,0x38(%ebx)
 8f7:   c7 43 3c ff ff ff 7f    movl   $0x7fffffff,0x3c(%ebx)
 8fe:   75 11                   jne    911
 900:   83 c4 14                add    $0x14,%esp
 903:   89 d9                   mov    %ebx,%ecx
 905:   89 f0                   mov    %esi,%eax
...
</pre>
<p>We can actually have a look at the disassembled code of the function flock(). If you have a look at address 0x8d9, there&#8217;s an instruction that looks suspiciously similar to the test carried on the if instructions. If you know assembly and know how a compiler works, you could find out that this jump instruction (JE) is just the one we want to change, exactly to a JNE instruction (I am not going to extend here on assembly and compilers and the like. I guess that if you wanted to do this, you should  already know this. And, by the way, I&#8217;ve no idea of those concepts either, seriously).</p>
<blockquote><p>If you are not sure if that&#8217;s the right instruction, you could recompile the kernel, get the assembly out of the same file.o object and compare it to see what is what changed.</p>
<p>Also, if you look at address 0&#215;898, there another JE instruction which may look like the one we are looking, but this belongs to dprintk as we have debug enabled on that kernel.</p></blockquote>
<p>If we have a look at the instructions on the <a href="http://www.intel.com/products/processor/manuals/index.htm">IA32 manual</a>, we see that the opcodes for the interesting instructions are:</p>
<ul>
<li> <strong>JE</strong>: 74</li>
<li> <strong>JNE</strong>: 75</li>
</ul>
<p>Ok, so right now, we know that we want to change an JE (with opcode 74) instruction for a JNE instruction (with opcode 75) on address 0x8d9 of the object file &#8220;file.o&#8221;.</p>
<p>The problem now is to find out where on the kernel memory this piece of code lives. One approach that you might think of doing is grepping the whole memory for a particular sequence of instructions. This is not recommended and I will explain why later on. First, let&#8217;s see how we can have access to the kernel memory, where we could possibly modify the data&#8230;</p>
<p>If you have a look at your unix system, you&#8217;ll see that you have a <strong>/dev/kmem</strong> special file, with which you can access the memory from the kernel&#8217;s point of view. This is quite useful as you can access it in read mode and, more interestingly, write mode. However, doing stuff with it might be a bit dangerous, as you might have guessed. It even seems  <a href="http://developer.apple.com/DOCUMENTATION/Darwin/Conceptual/KernelProgramming/security/chapter_3_section_7.html">that some vendors will disable this special file</a>.</p>
<p>Anyway, as I said before, you cannot and don&#8217;t want to read or grep the whole memory at /dev/kmem. It seems that <a href="http://ftp.cerias.purdue.edu/pub/doc/misc/crashing_your_system.txt">the reason is having write-only registers mapped into memory</a>, so a read would crash the system. (You might think that that message is very old, from a distant time, but believe me, it crashes linux if you do so. We tried reading the whole of /dev/mem and the network driver crashed among other little pieces, so don&#8217;t bother).</p>
<p>So basically the thing boils down to:</p>
<ol>
<li> Finding out exactly where we have to change the kernel (ie, at which memory address)</li>
<li> Open /dev/kmem and changing it with the right tool</li>
<li> Hope everything went fine <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ol>
<p><strong> Finding out where </strong></p>
<p>We need to find out where on the kernel we want to change it. This can be easily do by using tools and information the kernel provides us.</p>
<p>First, we need to find out where the kernel function <strong>nfs_flock</strong> starts, and that can be done by having a look at the System.map file that is generated every time we compile a kernel. The <a href="http://dirac.org/linux/system.map/">System.map</a> file is a file that helps kernel developers to debug their code by mapping kernel functions to memory addresses, so it is actually much easier to find  stuff. It contains the kernel symbol table with all symbols.</p>
<p>Ours looks like:</p>
<pre class="brush: plain;">
...
c01a9b3f t do_unlk
c01a9b97 t do_setlk
c01a9c2b t nfs_lock
c01a9d21 t nfs_flock
c01a9dcc T nfs_get_root
c01a9f3c T nfs_write_inode
...
</pre>
<p>So now, we know that <strong>nfs_flock</strong> is located at <strong>0xc01a9d21</strong>. We&#8217;ll use this in a minute.</p>
<p>We saw that we were having a look at the instruction located at <strong>0x8D9</strong> on the object file file.o (got by using objdump before). We also know that, on such object file, nfs_flock starts at <strong>0&#215;885</strong>, right?. That means that, the byte we want to change, is located exactly:</p>
<pre>0x8D9 - 0x885 = 0x54</pre>
<p>at <strong>nfs_flock + 0&#215;54</strong>.</p>
<p>Well, as you might know, those adresses (on the object file) are relative to such file, and that, when being linked into the actual kernel, the addresses are all relocated and recalculated. So, basically the right point is on</p>
<pre>0xc01a9d21 + 0x54</pre>
<p><strong>Opening /dev/kmem and modifying it</strong></p>
<p>Opening /dev/kmem needs to be done with the right tools. This is basically because we need LARGE_FILE support on whichever tool we use to modify it, as the /dev/kmem special file is a representation of the kernel memory and we need access it with a tool that supports large files.</p>
<p>In our system, the easiest way to do it is with perl. First, we double check that perl was compiled with LARGE_FILE support:</p>
<pre>root@devbox:~# perl -V  | grep LARGE
    cc='cc', ccflags ='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  Compile-time options: USE_LARGE_FILES
root@devbox:~#</pre>
<p>and, now, we can modify the kernel in a oneliner such as:</p>
<pre class="brush: perl;">
root@devbox:~# perl -e 'open (KERNEL, &quot;+&lt;/dev/kmem&quot;) || die $!; seek(KERNEL, 0xc01a9d21 + 0x54, 0); syswrite(KERNEL, chr(0x75)); close(KERNEL);'
root@devbox:~#
</pre>
<p>where we are writing <strong>0&#215;75</strong> in the right position (calculated previously).</p>
<p>And that&#8217;s all there is to it. If everthing went fine, the kernel behavior has been modified and nothing has crashed.</p>
<blockquote><p>Again, only do this under a dev box, under your responsibility and if you really really know what you are doing. And only only only if you want to play with a live kernel. Remember, I know nothing about computers.</p></blockquote>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/blognotreally.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/blognotreally.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=51&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2007/12/19/modifying-a-live-linux-kernel/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>
	</item>
		<item>
		<title>Multitail</title>
		<link>http://blog.notreally.org/2007/07/23/multitail/</link>
		<comments>http://blog.notreally.org/2007/07/23/multitail/#comments</comments>
		<pubDate>Mon, 23 Jul 2007 13:24:31 +0000</pubDate>
		<dc:creator>jroncero</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[programs]]></category>

		<guid isPermaLink="false">http://blog.notreally.org/articles/2007/07/23/multitail/</guid>
		<description><![CDATA[Some time ago I discovered Multitail, a tool for displaying in a tail-like fashion any kind of information. I works by splitting the console window in many parts and displaying the info you want on each of those screens, whether it is tailing a file or the output of a command via a ssh session. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=50&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Some time ago I discovered <a href="http://www.vanheusden.com/multitail/">Multitail</a>, a tool for displaying in a tail-like fashion any kind of information. I works by splitting the console <a href="http://www.flickr.com/photo_zoom.gne?id=464063579&amp;size=o"><img src="http://farm1.static.flickr.com/226/464063579_dbfda54e3e_t.jpg" class="alignright" alt="multitail" align="right" height="70" width="100" /></a> window in many parts and displaying the info you want on each of those <em>screens</em>, whether it is tailing a file or the output of a command via a ssh session. It also has coloring support (which you can extend using regular expressions) to tailor your needs.</p>
<p>I found it really handy when I have to monitor many servers. Just by using some bash power, you can get very nice outputs just by using something like this:</p>
<pre>
#!/bin/bash
rest=$*
if [[ -z $rest ]] ;then
  echo "You need to specify at least one server"
  exit 1
fi
command="multitail -s 2 "
for server in $rest
do
  command="$command -CS vmstat -t $server -l  \"ssh $server vmstat 1 \" "
done
eval $command</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/blognotreally.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/blognotreally.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/blognotreally.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/blognotreally.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/blognotreally.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.notreally.org&amp;blog=8911601&amp;post=50&amp;subd=blognotreally&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.notreally.org/2007/07/23/multitail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e39e820dfad61c10be3c1f2c7f9c2747?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">golan</media:title>
		</media:content>

		<media:content url="http://farm1.static.flickr.com/226/464063579_dbfda54e3e_t.jpg" medium="image">
			<media:title type="html">multitail</media:title>
		</media:content>
	</item>
	</channel>
</rss>