<?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>UNIXy &#187; linux</title>
	<atom:link href="http://blog.unixy.net/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.unixy.net</link>
	<description>Fully Managed Dedicated Servers</description>
	<lastBuildDate>Fri, 03 Feb 2012 17:37:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Not all CPU cores are showing up in Linux server /proc/cpuinfo</title>
		<link>http://blog.unixy.net/2011/10/not-all-cpu-cores-are-showing-up-in-linux-server-proccpuinfo/</link>
		<comments>http://blog.unixy.net/2011/10/not-all-cpu-cores-are-showing-up-in-linux-server-proccpuinfo/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 07:53:44 +0000</pubDate>
		<dc:creator>UNIXy</dc:creator>
				<category><![CDATA[Crash Course]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[/proc/cpuinfo]]></category>
		<category><![CDATA[cores]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[cpuinfo]]></category>
		<category><![CDATA[hotplug]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=1423</guid>
		<description><![CDATA[The Linux kernel is very smart and can leverage CPU features and instruction sets to bring down power consumption. So one of the logical things to do when power savings are needed is to turn off CPU cores. To confirm that this is indeed what's happening on your system, you could hot-plug these cores and bring them online]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2011%2F10%2Fnot-all-cpu-cores-are-showing-up-in-linux-server-proccpuinfo%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2011%2F10%2Fnot-all-cpu-cores-are-showing-up-in-linux-server-proccpuinfo%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>The <a title="Linux" href="http://www.unixy.net">Linux</a> kernel is very <a title="smart server" href="http://www.unixy.net">smart</a> and can leverage CPU features and instruction sets to bring down power consumption especially on a <a title="server" href="http://www.unixy.net/dedicated-servers">server</a>. So one of the logical things to do when power savings are needed is to turn off CPU cores. To confirm that this is indeed what&#8217;s happening on your system, you could hot-plug these cores and bring them online in this fashion:</p>
<blockquote><p>echo 1 &gt; /sys/devices/system/cpu/cpu4/online<br />
echo 1 &gt; /sys/devices/system/cpu/cpu5/online</p></blockquote>
<p>You can then verify that additional CPU cores have been brought up. You can also take them offline if needed:</p>
<blockquote><p>echo 0 &gt; /sys/devices/system/cpu/cpu4/online<br />
echo 0 &gt; /sys/devices/system/cpu/cpu5/online</p></blockquote>
<p>The above will lead to this message being displayed in /var/log/messages (turned off core # 23):</p>
<blockquote><p>[1132050.457980] CPU 23 is now offline<br />
[1132065.819054] Booting Node 2 Processor 23 APIC 0x2b</p></blockquote>
<p>That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2011/10/not-all-cpu-cores-are-showing-up-in-linux-server-proccpuinfo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Six cool unixy commands</title>
		<link>http://blog.unixy.net/2010/12/six-cool-unixy-commands/</link>
		<comments>http://blog.unixy.net/2010/12/six-cool-unixy-commands/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 00:52:54 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Interesting]]></category>
		<category><![CDATA[catchsegv]]></category>
		<category><![CDATA[commands]]></category>
		<category><![CDATA[dislocate]]></category>
		<category><![CDATA[kibitz]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tac]]></category>
		<category><![CDATA[tload]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[UNIXy]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=1094</guid>
		<description><![CDATA[We've compiled a list of six Unix/Linux tools that are cool and useful. From checking the weather via your terminal to having a sysadmin walk you through a difficult task. Interestingly, most of these tools were release decades ago! Read on...]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2010%2F12%2Fsix-cool-unixy-commands%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2010%2F12%2Fsix-cool-unixy-commands%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>We&#8217;ve compiled a list of six Unix/Linux tools that are cool and useful. From checking the weather via your terminal to having a sysadmin walk you through a difficult task. Interestingly, most of these tools were released <em>decades</em> ago! Read on&#8230;</p>
<h2><strong>kibitz</strong></h2>
<p><strong>kibitz </strong>is a terminal tool that can be used by a mentor to assist his or her apprentice. It essentially makes what is normally one private terminal session visible to both parties providing bi-directional interactivity. The mentor can then walk the apprentice through various tasks and howtos. A typical session looks like the following to the mentor:</p>
<p style="text-align: center;"><a href="http://blog.unixy.net/wp-content/uploads/2010/12/master_kibitz.png"><img class="size-full wp-image-1105 aligncenter" title="Kibitz master" src="http://blog.unixy.net/wp-content/uploads/2010/12/master_kibitz.png" alt="" width="619" height="100" /></a></p>
<p style="text-align: left;">Whatever commands or text that the mentor or the apprentice types is seen on the other end. It looks like this to the apprentice:</p>
<p><a href="http://blog.unixy.net/wp-content/uploads/2010/12/apprentice_kibitz.png"><img class="size-full wp-image-1106 aligncenter" title="apprentice kibitz" src="http://blog.unixy.net/wp-content/uploads/2010/12/apprentice_kibitz.png" alt="" width="619" height="150" /></a></p>
<h2><strong>tload</strong></h2>
<p style="text-align: left;"><strong>tload </strong>is a neat tool that displays the load average on the terminal in a form of character drawings. It gives an interesting visual of the system load (/proc/loadavg) over time &#8211; time being an adjustable parameter. Without further ado, here&#8217;s a screen shot of tload in action:</p>
<p><a href="http://blog.unixy.net/wp-content/uploads/2010/12/tload.png"><img class="size-full wp-image-1119 aligncenter" title="tload" src="http://blog.unixy.net/wp-content/uploads/2010/12/tload.png" alt="" width="650" height="271" /></a></p>
<h2><strong>catchsegv</strong></h2>
<p style="text-align: left;"><strong>catchsegv </strong>helps one diagnose programs that <em>segfault</em>. If you&#8217;re dealing with an app that segfaults frequently, start it up with catchsegv and watch it produce a snapshot of CPU registers, memory maps, and backtrace at the time of the segfault! Here&#8217;s a snapshot of it in action:</p>
<p><a href="http://blog.unixy.net/wp-content/uploads/2010/12/app_segfault.png"><img class="size-full wp-image-1125 aligncenter" title="app_segfault" src="http://blog.unixy.net/wp-content/uploads/2010/12/app_segfault.png" alt="" width="400" height="384" /></a></p>
<h2><strong>dislocate</strong></h2>
<p>For those of you who are familiar with the program <em>screen, dislocate </em>is its grandfather.It&#8217;s neat tool that allows one to detach programs from the pseudo terminal and reattach to them whenever needed. This is tool for those with slow or unstable terminal sessions that are prone to disconnect.</p>
<h2>tac</h2>
<p><em>tac </em>is a command line tool that reads a file in reverse order. It&#8217;s ideal for log sifting tasks where one&#8217;s interest is in grep&#8217;ing the most recent entries.</p>
<blockquote><p><strong># cat /var/log/sip </strong></p>
<p><strong>Target 1&#8230; DONE</strong><br />
<strong>Target 2&#8230; DONE</strong><br />
<strong>Target 3&#8230; DONE</strong><br />
<strong># tac /var/log/sip </strong><br />
<strong>Target 3&#8230; DONE</strong><br />
<strong>Target 2&#8230; DONE</strong><br />
<strong>Target 1&#8230; DONE</strong></p></blockquote>
<h2>weather</h2>
<p><em>weather </em>is an expect-based program that runs from the terminal and grabs weather information from rainmaker.wunderground.com. Wunderground runs a public weather service on port 3000. <em>weather </em>leverages this service to pull weather data by city and displays it on the terminal. Here&#8217;s a sample run:</p>
<blockquote><p>$ weather HOU</p>
<p>&lt;snip&gt;</p>
<div id="_mcePaste">Enter 3-letter city code: HOU</div>
<div id="_mcePaste">Weather Conditions at 12:53 PM CST on 24 Dec 2010 for Houston Intercontinental, TX.</div>
<div id="_mcePaste">Temp(F)    Humidity(%)    Wind(mph)    Pressure(in)    Weather</div>
<div id="_mcePaste">========================================================================</div>
<div id="_mcePaste">63          70%         ESE at 10       30.07      Overcast</div>
<div id="_mcePaste">Forecast for Houston, TX</div>
<div id="_mcePaste">406 am CST Fri Dec 24 2010</div>
<div id="_mcePaste">.Today&#8230;Mostly cloudy with a 30 percent chance of showers. Highs</div>
<div id="_mcePaste">in the upper 60s. Southeast winds 10 to 15 mph.</div>
<div id="_mcePaste">.Tonight&#8230;Showers likely and isolated thunderstorms. Lows in the</div>
<div id="_mcePaste">mid 40s. Northeast winds 5 to 10 mph in the evening becoming</div>
<div id="_mcePaste">north and increasing to 15 to 20 mph after midnight. Chance of</div>
<div id="_mcePaste">rain 70 percent in the evening decreasing to 60 percent after</div>
<p>&lt;snip&gt;</p></blockquote>
<p>That&#8217;s all folks! I hope you enjoyed this entry.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2010/12/six-cool-unixy-commands/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Strace a process in Linux</title>
		<link>http://blog.unixy.net/2009/08/strace-a-process-in-linux/</link>
		<comments>http://blog.unixy.net/2009/08/strace-a-process-in-linux/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 06:09:17 +0000</pubDate>
		<dc:creator>UNIXy</dc:creator>
				<category><![CDATA[Break-Fix]]></category>
		<category><![CDATA[apache process]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php process]]></category>
		<category><![CDATA[strace]]></category>
		<category><![CDATA[strace apache]]></category>
		<category><![CDATA[strace php]]></category>
		<category><![CDATA[syscall]]></category>
		<category><![CDATA[system call]]></category>
		<category><![CDATA[truss]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=21</guid>
		<description><![CDATA[In this article, we are going to cover the Linux utility strace. Before you read on, keep in mind that we (UNIXY) are a fully managed server provider and are always happy to assist our clients one way or the other. Should you happen to be a customer and need a hand with server management, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F08%2Fstrace-a-process-in-linux%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F08%2Fstrace-a-process-in-linux%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>In this article, we are going to cover the Linux utility strace. Before you read on, keep in mind that we (UNIXY) are a <a title="Fully Managed Server" href="http://www.unixy.net" target="_blank">fully managed server</a> provider and are always happy to assist our clients one way or the other. Should you happen to be a customer and need a hand with server management, please submit a request with us.</p>
<p><em>strace</em> is a command line program that runs from one of the Linux shells. A shell is another program that allows a system administrator to interact with a Linux operating system &#8211; for example to run <em>strace</em>.</p>
<p>The <em>strace</em> utility is the crudest form of trouble shooting in Linux. It essentially hijacks the target program and <em>traces</em> all system function calls. Think of it as another program that attaches to the target program and snoops on its actions. The output of <em>strace</em> isn&#8217;t pretty either. One has to build a certain understanding and intuitiveness to make good use of it.</p>
<p>So how many times have you wondered what that Apache process is doing exactly pegging the CPU? Or how many times have you wondered why a certain PHP process dies unexpectedly? Well strace <em>might</em> help answer those questions. The strace output looks like this (don&#8217;t let this scare you. I&#8217;ll explain):</p>
<blockquote><p><code><br />
Process 6716 attached - interrupt to quit<br />
restart_syscall(&lt;... resuming interrupted call ...&gt;) = 0<br />
gettimeofday({1249790094, 207969}, NULL) = 0<br />
open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", O_RDONLY) = 18<br />
read(18, "ondemand\n", 1024)            = 9<br />
read(18, "", 1024)                      = 0<br />
close(18)                               = 0<br />
open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", O_RDONLY) = 18<br />
read(18, "1200000\n", 1024)             = 8<br />
read(18, "", 1024)                      = 0<br />
close(18)                               = 0<br />
read(3, 0x80708a4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)<br />
gettimeofday({1249790094, 209927}, NULL) = 0<br />
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=10, events=POLLIN|POLLPRI}, {fd=11, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd=14, events=POLLIN|POLLPRI}, {fd=13, events=POLLIN|POLLPRI}, {fd=15, events=POLLIN|POLLPRI}, {fd=16, events=POLLIN|POLLPRI}], 10, 0) = 0<br />
select(4, [3], [3], NULL, NULL)         = 1 (out [3])<br />
writev(3, [{"5\30\4\0\327W\300\2#\0\300\2S\0\27\0\233\4\5\0\330W\300"..., 520}], 1) = 520<br />
read(3, 0x80708a4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)<br />
read(3, 0x80708a4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)<br />
gettimeofday({1249790094, 212466}, NULL) = 0<br />
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=10, events=POLLIN|POLLPRI}, {fd=11, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd=14, events=POLLIN|POLLPRI}, {fd=13, events=POLLIN|POLLPRI}, {fd=15, events=POLLIN|POLLPRI}, {fd=16, events=POLLIN|POLLPRI}], 10, 996) = 0<br />
gettimeofday({1249790095, 208261}, NULL) = 0<br />
open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", O_RDONLY) = 18</code></p></blockquote>
<p>Each line in the above output represents an action made by the target program except the first two lines. The first one informs us that strace will begin tracing the program in question. The second one is made to recover from a half executed function system call.</p>
<p>The remaining lines are of importance and that&#8217;s what we need to study to figure what our target program is doing. Each line represents a function call the program is making and the result of the call. For example, this system call <em>open</em></p>
<blockquote><p><code>open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", O_RDONLY) = 18</code></p></blockquote>
<p>opens a file with certain attributes. The returned status is 18. What does the number 18 mean? What does O_RDONLY mean? RTFM! That is Read The Fine Manual! Linux comes with documentation tools that explain all these function calls and whatnot. In this example, <em>open</em> is the function. We can search for it and read its manual as such:</p>
<p># <strong>apropos open</strong><br />
open (<em><strong>3</strong></em>posix)        &#8211; open a file<br />
# <strong>man <em>3</em> open</strong></p>
<p>The manual page format can be cumbersome at first and it takes a bit of time to get used to it. Don&#8217;t let it discourage you! From reading manual we are able to understand more about the function call. Per the manual, return value 18 represents the &#8220;lowest numbered unused file descriptor.&#8221; We also understand what O_RDONLY means: Open file for reading only. Etcetera.</p>
<p>If you look back up at the strace output, you&#8217;ll note that shortly after the open() function call was made, close(18) followed it. We&#8217;ll need to go through the same process to read up on the system call close(). But the value 18 is deja vu! That&#8217;s the file descriptor number returned by open(). In other words, the program is opening a file /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor read-only then and then closing it.</p>
<p>We cannot go over each and every system call but you should be able to use the above process to understand pretty much any system call. But what would one be looking for when a program is not doing what it&#8217;s supposed to do and is failing? The Matrix sends agents after it to kill it! Just kidding! You have to go through each and every system call and check on the return status in the manual to understand if that is normal behavior or not. You can redirect the strace output to file so you can sift the (enormous) amount of data it produces:</p>
<blockquote><p><code>strace -o /tmp/progra_strace.out -p </code></p></blockquote>
<p>That&#8217;s all for today folks. I hope you enjoyed this one!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2009/08/strace-a-process-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flush Buffers And cache On Linux</title>
		<link>http://blog.unixy.net/2009/07/flush-buffers-and-cache-on-linux/</link>
		<comments>http://blog.unixy.net/2009/07/flush-buffers-and-cache-on-linux/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 05:48:56 +0000</pubDate>
		<dc:creator>UNIXy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[buffers]]></category>
		<category><![CDATA[cached]]></category>
		<category><![CDATA[flush buffers]]></category>
		<category><![CDATA[flush cache]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[free memory]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=19</guid>
		<description><![CDATA[Many users tend to worry when the free memory on a Linux system is very low. Especially when the system is barely active. What many don&#8217;t know is that this is normal behavior for Linux. It simply takes your free memory and caches it. This caching behavior makes subsequent memory allocations much faster. So it [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F07%2Fflush-buffers-and-cache-on-linux%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F07%2Fflush-buffers-and-cache-on-linux%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Many users tend to worry when the free memory on a Linux system is very low. Especially when the system is barely active. What many don&#8217;t know is that this is normal behavior for Linux. It simply takes your free memory and caches it. This caching behavior makes subsequent memory allocations much faster. So it improves performance overall.</p>
<p>However, if you really really need to flush the cache and buffers, you can run the following two commands on the shell as root:</p>
<blockquote><p><code>sync; echo 3 > /proc/sys/vm/drop_caches</code></p></blockquote>
<p>Here&#8217;s the output of <em>free</em> before and after running the above command.</p>
<p><strong>Before</strong></p>
<pre>
# free -m
             total       used       free     shared    buffers     cached
Mem:           502        487         15          0         <strong>15        170</strong>
-/+ buffers/cache:        301        201
Swap:         3153        375       2777
</pre>
<p><strong>After</strong></p>
<pre>
# free -m
             total       used       free     shared    buffers     cached
Mem:           502        345        157          0         <strong> 1         44</strong>
-/+ buffers/cache:        300        202
</pre>
<p>As you can see the highlighted numbers, the buffers and cached values have dropped significantly after I ran the command. Again, this is not necessary. In fact, it&#8217;s not recommended at all but there it is if you&#8217;re curious to know.</p>
<p>That&#8217;s all folks. I hope you enjoyed this one.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2009/07/flush-buffers-and-cache-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running DirectAdmin On Amazon EC2 Linux- Solved!</title>
		<link>http://blog.unixy.net/2009/06/running-directadmin-on-amazon-ec2-linux-solved/</link>
		<comments>http://blog.unixy.net/2009/06/running-directadmin-on-amazon-ec2-linux-solved/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 18:21:09 +0000</pubDate>
		<dc:creator>UNIXy</dc:creator>
				<category><![CDATA[Challenge]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[DA]]></category>
		<category><![CDATA[DirectAdmin]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=15</guid>
		<description><![CDATA[We were able to install DirectAdmin (a Web hosting control panel) on Amazon's Elastic Compute Cloud, branded as EC2. We would like to share the steps required to build a working instance of DirectAdmin on an Amazon server.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F06%2Frunning-directadmin-on-amazon-ec2-linux-solved%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2009%2F06%2Frunning-directadmin-on-amazon-ec2-linux-solved%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>We were able to install DirectAdmin (a Web hosting control panel) on Amazon&#8217;s Elastic Compute Cloud, branded as EC2. We would like to share the steps required to build a working instance of DirectAdmin on an Amazon server. First, I would like to personally thank Mark from <a title="Web Control Panel" href="http://www.directadmin.com" target="_blank">DirectAdmin</a> for being so accommodating and granting us a trial license. His help is very much appreciated! Keep in mind that <a href="http://www.unixy.net" target="_self">UNIXY</a>&#8216;s truly fully <a title="Managed server" href="http://www.unixy.net" target="_self">managed server</a> service goes above and beyond. We take business dreams and make them a reality.</p>
<p>Before we list the requirements, it is important to note that EC2 instances are Xen Virtual Machines. We encountered some issues running DA on the &#8220;Small&#8221; Amazon instances. The issues are related to 64-bit mode library mismatches. The only instances to be able to run DirectAdmin out of the box are of type &#8220;Large&#8221; and better. They are more expensive but ideal for this configuration.</p>
<p>Here are the requirements:</p>
<ul>
<li>Instance of type Large</li>
<li>Linux CentOS 5 image</li>
<li>One elastic (which is another word for static) IP address</li>
</ul>
<p>Go ahead and bring up the node as you would normally do. Be sure to remove all extra software that comes pre-installed with the CentOS 5 image. Otherwise, it will break DirectAdmin. If in doubt, follow the instructions on the DirectAdmin Install page:</p>
<blockquote><p>http://www.directadmin.com/install.html</p></blockquote>
<p>Once logged in as root, go ahead and download the DirectAdmin install tarball:</p>
<blockquote><p># wget http://www.directadmin.com/setup.sh</p></blockquote>
<p>By default, the licensing scheme of DirectAdmin makes it that setup.sh binds to the licensed IP address. Here&#8217;s how the license verification command looks like:</p>
<blockquote><p>$BIN_DIR/wget $WGET_OPTION -O $DA_PATH/update.tar.gz &#8211;bind-address=$IP https://www.directadmin.com/cgi-bin/daupdate?uid=$CID\&amp;lid=$LID</p></blockquote>
<p>But as you know, EC2 instances are 1:1 private:public NAT. Which means that the license check step will fail and the DA install won&#8217;t start. To avoid this chicken-and-egg problem, we are going to tell setup.sh to not bind to any IP address but to simply connect to the DA licensing server using the elastic external IP address, which it will do by default. Go ahead and run this command against the setup.sh file:</p>
<blockquote><p><code># sed -i 's/--bind-address=\$IP//;' setup.sh</code></p></blockquote>
<p>Before we run setup.sh, we need to trick the setup script to think that the external IP address is &#8220;attached&#8221; to the server. Here&#8217;s how:</p>
<blockquote><p># ifconfig eth0:0 inet 1.1.1.1 netmask 255.255.255.255 up</p></blockquote>
<p>Be sure to replace the IP address 1.1.1.1 with your elastic IP. Then simply run setup.sh:</p>
<blockquote><p># cd /usr/local/directadmin/scripts; while [ true ]; do <code>sed -i 's/--bind-address=\$IP//; s/--bind-address=\${3}//;' *.sh </code>&gt; /dev/null &gt; 2&amp;&gt;1; sleep 10; done &amp; sh setup.sh 11111 22222 vpslux.com eth0:0 1.1.1.1</p></blockquote>
<p>Woaah! Wait a minute! What is that!? OK, let&#8217;s break it down. The DA scripts directory gets unpacked into the server after you run setup.sh. It dumps a list of scripts that are used by DA to setup accounts, domains, etc. Some scripts use the same &#8211;bind-address flag. Having that flag in those scripts breaks DA. the one-line script &#8220;while [ true ]; do sed -i &#8216;s/&#8211;bind-address=\$IP//; s/&#8211;bind-address=\${3}//;&#8217; *.sh; sleep 10; done&#8221; simply goes to that directory and removes the flag.</p>
<p>The trick being DA attempts to run some of those scripts <em>while</em> setup.sh is running. So it&#8217;s important to have the sed script run in parallel during the installation. Once the setup.sh is done running, we&#8217;ll kill the job (or reboot per the final step). The arguments supplied to setup.sh are in this format</p>
<blockquote><p># setup.sh &lt;ClientID&gt; &lt;LicenseID&gt; &lt;Hostname&gt; &lt;Interface&gt; &lt;ExternalIP&gt;</p></blockquote>
<p>Be sure to replace those values accordingly. Once the install finishes, simply reboot the VM:</p>
<blockquote><p># reboot</p></blockquote>
<p>That&#8217;s all folks. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2009/06/running-directadmin-on-amazon-ec2-linux-solved/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Web application migration</title>
		<link>http://blog.unixy.net/2008/10/web-application-migration/</link>
		<comments>http://blog.unixy.net/2008/10/web-application-migration/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 02:13:53 +0000</pubDate>
		<dc:creator>UNIXy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[imapcopy]]></category>
		<category><![CDATA[imapsync]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[suction]]></category>

		<guid isPermaLink="false">http://blog.unixy.net/?p=4</guid>
		<description><![CDATA[This is part one of a series of guides on how to perform a proper migration of a Web application. Proper because the goal is to seamlessly and preparedly switch over to a new server or provider. We'll set the bar high enough to only allow room for a 5-10 minutes of cumulative downtime.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.unixy.net%2F2008%2F10%2Fweb-application-migration%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.unixy.net%2F2008%2F10%2Fweb-application-migration%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>UNIXy has experience with migrating server applications in and out for customers. This is one of the value-add services we provide to our customers as they switch over to using our services. We are happy to share our ways of performing these tasks. Migrations are done differently in the industry and this is our proven and preferred method. We would like to hear from you about your ways so don&#8217;t hesitate to share them with us.</p>
<p>This is part one of a series of guides on how to perform a proper migration of a Web application. Proper because the goal is to seamlessly and preparedly switch over to a new server or provider. We&#8217;ll set the bar high enough to only allow room for a 5-10 minutes of cumulative downtime. Note that our experience is limited to Web applications residing on UNIX and/or Linux servers. Also, we are not covering the migration of Web applications that are part of a control panel such as cPanel, Plesk, or DirectAdmin. Control panels have their own migration tools. This guide, however, can assist in migrating a cPanel account over to a non-cPanel server and vice-versa.</p>
<p>While this proposed migration method might seem like a one-time process, it&#8217;s imperative to perform dry runs prior to the actual cut-over. Dry runs do not involve downtime at all and can thus help gauge the terrain for potential issues that may arise on go-live day. We call them exercises!</p>
<p><strong>Web Application Migration Part I &#8211; Email suction</strong></p>
<p>Email is one the most dreaded services to migrate because of the complexity involved. Not only is it our goal to have the new server send and receive email but also mirror the users&#8217; email inboxes and folders as they were prior to the cutoff. Post-migration, users should wake up to their good old familiar inbox in the undergarment of the new server.</p>
<p>There are tools that one needs to equip herself to carry out an email migration; also commonly called suction in the industry. Our preferred tools are Imapcopy, the venerable Imapsync, and a multi-purpose Linux workstation with the GNU tools; but most importantly, a well seasoned systems administrator. As the saying goes: A cowl does not make a monk.</p>
<p>First things first: gather as much information on the current server as possible. Does the server allow direct IMAP access to users? Is it Webmail only? What about POP access? What is the mailbox / user count on the server? Is there a quota for disk space usage? What is the largest mailbox? Suction and IMAP go hand in hand. It&#8217;s only through the IMAP protocol that one can fully interact with a mailbox and its folders. This writeup will not over the nuts and bolts of IMAP or other protocols so be sure to read up on those before continuing.</p>
<p>Imapcopy allows one to copy a mailbox from one server to another using the IMAP protocol. This tool is useful as part of our drill exercises. Before we demo these tools, ensure that an IMAP daemon is listening on both the source and destination.Also, make sure that ports 143 on both the source and destination are open (telnet server 143). Then, download Imapcopy on your workstation. It&#8217;s also time to pick an existing mailbox (preferably one with multiple folders) for our trials.</p>
<p>The Imapcopy utility comes packaged with a sample configuration file. For the purpose of this demo, the changes are good enough for a successful run. We&#8217;re using our Linux workstation as the actual destination server. Here&#8217;s a diff of the changes we made (the symbols &lt; and &gt; and / or spaces were added to avoid getting spam on these inboxes once this page gets crawled):</p>
<blockquote><p><strong>&#8212; ImapCopy.cfg.orig   2008-07-12 23:39:12.000000000 -0500<br />
+++ ImapCopy.cfg        2008-07-13 09:50:52.000000000 -0500<br />
@@ -1,7 +1,7 @@<br />
##############<br />
# Sourceserver<br />
##############<br />
-SourceServer localhost<br />
+SourceServer unixy.net<br />
SourcePort 143</strong></p>
<p><strong>###################<br />
@@ -51,6 +51,6 @@<br />
# List of users and passwords<br />
#############################<br />
#       SourceUser    SourcePassword   DestinationUser DestinationPassword<br />
-Copy    &#8220;foo&#8221;         &#8220;foosrcpw&#8221;       &#8220;foo&#8221;           &#8220;foodestpw&#8221;<br />
-Copy    &#8220;bar&#8221;         &#8220;barsrcpw&#8221;       &#8220;bar&#8221;           &#8220;test&#8221;<br />
+Copy    &#8220;null &lt;@&gt;unixy.net&#8221;         &#8220;XXXXX&#8221;       &#8220;null&#8221;           &#8220;XXXXX&#8221;<br />
+# Copy    &#8220;bar&#8221;         &#8220;barsrcpw&#8221;       &#8220;bar&#8221;           &#8220;test&#8221;</strong></p></blockquote>
<p>From the above sample configuration file, we are instructing Imapcopy to suction mailbox null &lt;@&gt;unixy.net. But before running the suction, we need to test connectivity and authentication between the &#8220;SourceServer&#8221; and &#8220;DestinationServer&#8221;. The flag &#8220;-i&#8221; of imapcopy achieves this connectivity test:</p>
<blockquote><p><strong>$ imapcopy -i<br />
IMAPCopy 1.03 &#8211; 2005/04/20 [compiled with FreePascal] (c) 2001-2006 Armin Diehl &lt;armin@freepascal.org&gt;<br />
Running on Linux</strong></p>
<p><strong>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Login on sourceserver as null &lt;@&gt;unixy.net OK<br />
Login on destinationserver as null OK<br />
Sourceserver:<br />
=============<br />
Server-Info          : [CAPABILITY IMAP4rev1 UIDPLUS<br />
CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT<br />
THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION<br />
STARTTLS] Courier-IMAP ready. Copyright 1998-2005 Double<br />
Precision, Inc.  See COPYING for distribution information.<br />
Capabilities         : IMAP4REV1 UIDPLUS CHILDREN<br />
NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION<br />
Personal Namespace   : INBOX<br />
Folder sperator      : .<br />
other Users Namespace:<br />
Public Namespace     : #shared<br />
Folders to copy      : ALL<br />
Skip this folders    : NONE</strong></p>
<p><strong>Destinationserver:<br />
==================<br />
Server-Info          : [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT<br />
THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION]<br />
Courier-IMAP ready. Copyright 1998-2005 Double Precision,<br />
Inc.  See COPYING for distribution information.<br />
Capabilities         : IMAP4REV1 UIDPLUS CHILDREN<br />
NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT<br />
QUOTA IDLE ACL ACL2=UNION<br />
Personal Namespace   : INBOX<br />
Folder sperator      : .<br />
other Users Namespace:<br />
Public Namespace     : #shared</strong></p></blockquote>
<p>So far so good. Now let&#8217;s have it copy the null &lt;@&gt;unixy. net mailbox in its entirety. But before we do that, Imapcopy requires the default layout of a Maildir exists as such:</p>
<blockquote><p><strong>$ mkdir -p /home/null/Maildir/{cur,tmp,new}</strong></p></blockquote>
<p>And now we launch Imapcopy for the full copying of the mailbox:</p>
<blockquote><p><strong>$ imapcopy<br />
IMAPCopy 1.03 &#8211; 2005/04/20 [compiled with FreePascal] (c) 2001-2006 Armin Diehl &lt;armin@freepascal.org&gt;<br />
Running on Linux</strong></p>
<p><strong>Login on sourceserver as null &lt;@&gt;unixy.net OK<br />
Login on destinationserver as null OK<br />
Getting folderlist on sourceserver OK, found 1 folder<br />
Getting List of messages in &#8220;INBOX&#8221; OK, 2 Messages found<br />
Processing Folder INBOX<br />
S:A0004 SELECT INBOX\r\n<br />
R:* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)\r\n<br />
R:* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited\r\n<br />
R:* 0 EXISTS\r\n<br />
R:* 0 RECENT\r\n<br />
R:* OK [UIDVALIDITY 1215995880] Ok\r\n<br />
R:* OK [MYRIGHTS "acdilrsw"] ACL\r\n<br />
R:A0004 OK [READ-WRITE] Ok\r\n<br />
S:A0005 APPEND INBOX (\Seen) &#8220;14-Jul-2008 21:46:39 -0500&#8243; {903}\r\n<br />
R:+ OK\r\n<br />
C: Command exit because of + (&#8220;+ OK&#8221;)<br />
S: Message not shown (903 Bytes)<br />
R:A0005 OK [APPENDUID 1215995880 9] APPEND Ok.\r\n<br />
S:A0006 APPEND INBOX (\Seen) &#8220;14-Jul-2008 21:47:25 -0500&#8243; {716}\r\n<br />
R:+ OK\r\n<br />
C: Command exit because of + (&#8220;+ OK&#8221;)<br />
S: Message not shown (716 Bytes)<br />
R:A0006 OK [APPENDUID 1215995880 10] APPEND Ok.\r\n<br />
2 Messages copied, 0 Errors<br />
S:A0007 LOGOUT\r\n<br />
R:* BYE Courier-IMAP server shutting down\r\n<br />
R:A0007 OK LOGOUT completed\r\n<br />
S:A0008 LOGOUT\r\n<br />
C: Command status 1</strong></p>
<p><strong>1 User processed, 2 Messages copied, 0 Error(s)<br />
0 Folder(s) created, 0 Folder create errors, 0 Folder not copied</strong></p></blockquote>
<p>All good! As you can see from the above log, Imapcopy suctioned 2 messages for one user, null &lt;@&gt;unixy.net in this case. One extra step:</p>
<blockquote><p><strong>$ ls -al /home/null/Maildir/cur/<br />
total 16<br />
drwxr-xr-x 2 null null 4096 2008-07-14 21:48 .<br />
drwxrwxrwx 6 null null 4096 2008-07-13 19:38 ..<br />
-rw-r&#8211;r&#8211; 1 null null  695 2008-07-14 21:47 1216090136.M168971P8436V0000000000000305I00175CCF_1.MUX,S=695:2,S<br />
-rw-r&#8211;r&#8211; 1 null null  874 2008-07-14 21:46 1216090136.M30165P8436V0000000000000305I00175CCD_0.MUX,S=874:2,S</strong></p></blockquote>
<p>Impeccable! While Imapcopy could potentially be used to carry out the migration, it is not the prefered method of suction. If it were to be used as part of a migration strategy, one would have to batch all the user mailboxes in one fell swoop. It makes the process time consuming and causes downtime especially when you have to transfer very large mailboxes. Imapcopy&#8217;s copying mechanism is also not incremental or retriable and that is a valid concern. Every time Imapcopy runs, it copies the mailbox in its entirety regardless. Here&#8217;s an example of a re-run. For brevity&#8217;s sake, we&#8217;re only showcasing the statistics of the run:</p>
<blockquote><p><strong>$ imapcopy<br />
Login on sourceserver as null@unixy.net OK<br />
Login on destinationserver as null OK<br />
.<br />
.<br />
.<br />
1 User processed, &lt;b&gt;2 Messages copied&lt;/b&gt;, 0 Error(s)<br />
0 Folder(s) created, 0 Folder create errors, 0 Folder not copied</strong></p></blockquote>
<p>Indeed, Imapcopy has no notion of incremental copying. You could see how it can get out of control with a large mailbox.</p>
<p>The goal here is to suction email messages per-user as they login into the new server for the first time. This is where Imapsync comes in. You supply the source and destination server, the mailbox to sync, and the password of the user&#8217;s mailbox for both the source and destination; imapsync does the rest.</p>
<p>First, let&#8217;s sync our IMAP mail box manually to test the waters:</p>
<blockquote><p><strong>$ imapsync &#8211;host1 unixy.net &#8211;user1 null &lt;@&gt;unixy.net &#8211;password1 XXXXX &#8211;host2 localhost &#8211;user2 null &#8211;password2 XXXXX<br />
$RCSfile: imapsync,v $ $Revision: 1.219 $ $Date: 2007/04/04 09:32:20 $<br />
Here is a linux system Linux MUX 2.6.20-16-server #2 SMP Tue Dec 18 05:52:19 UTC 2007 i686)<br />
with perl 5.8.8<br />
Mail::IMAPClient version used here is 2.2.9<br />
Command line used :<br />
/usr/bin/imapsync &#8211;host1 unixy.net &#8211;user1 null &lt;@&gt;unixy.net &#8211;password1 XXXXX &#8211;host2 localhost &#8211;user2 null &#8211;password2 XXXXX<br />
will try to use CRAM-MD5 authentication on host1<br />
will try to use CRAM-MD5 authentication on host2<br />
From imap server [unixy.net] port [143] user [null &lt;@&gt;unixy.net]<br />
To   imap server [localhost] port [143] user [null]<br />
Banner : * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN<br />
NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT<br />
QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready.<br />
Copyright 1998-2005 Double Precision, Inc.  See COPYING<br />
for distribution information.<br />
Host unixy.net says it has NO CAPABILITY for AUTHENTICATE CRAM-MD5<br />
Error login : [unixy.net] with user [null &lt;@&gt;unixy.net] auth [CRAM-MD5]: 3 NO Login failed.</strong></p>
<p><strong>Trying LOGIN Auth mechanism on [unixy.net] with user [null &lt;@&gt;unixy.net]<br />
Success login on [unixy.net] with user [null &lt;@&gt;unixy.net] auth [CRAM-MD5]<br />
Banner : * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN<br />
NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT<br />
QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready.<br />
Copyright 1998-2005 Double Precision, Inc.  See COPYING<br />
for distribution information.<br />
Host localhost says it has NO CAPABILITY for AUTHENTICATE CRAM-MD5<br />
Error login : [localhost] with user [null] auth [CRAM-MD5]: 3 NO Login failed.</strong></p>
<p><strong>Trying LOGIN Auth mechanism on [localhost] with user [null]<br />
Success login on [localhost] with user [null] auth [CRAM-MD5]<br />
From capability : QUOTA STARTTLS NAMESPACE IDLE<br />
THREAD=ORDEREDSUBJECT ACL SORT UIDPLUS CHILDREN<br />
ACL2=UNION IMAP4REV1 THREAD=REFERENCES<br />
To   capability : QUOTA STARTTLS NAMESPACE IDLE<br />
THREAD=ORDEREDSUBJECT ACL SORT UIDPLUS CHILDREN<br />
ACL2=UNION IMAP4REV1 THREAD=REFERENCES<br />
From state Authenticated<br />
To   state Authenticated<br />
From separator and prefix : [.][INBOX.]<br />
To   separator and prefix : [.][INBOX.]<br />
++++ Calculating sizes ++++<br />
From Folder [INBOX]                             Size:      1623 Messages:     2<br />
Total size: 1623<br />
Total messages: 2<br />
Time : 12 s<br />
++++ Calculating sizes ++++<br />
To   Folder [INBOX]                             Size:      1619 Messages:     2<br />
Total size: 1619<br />
Total messages: 2<br />
Time : 0 s<br />
++++ Listing folders ++++<br />
From folders list : [INBOX]<br />
To   folders list : [INBOX]<br />
++++ Looping on each folder ++++<br />
From Folder [INBOX]<br />
To   Folder [INBOX]<br />
++++ From [INBOX] Parse 1 ++++<br />
++++ To   [INBOX] Parse 1 ++++<br />
++++ Verifying [INBOX] -&gt; [INBOX] ++++<br />
+ NO msg #5 [imWT88lfpdVUriyDdDcAOA:905] in INBOX<br />
+ Copying msg #5:905 to folder INBOX<br />
flags from : [\Seen][]<br />
Copied msg id [5] to folder INBOX msg id [11]<br />
+ NO msg #6 [lOzMkdoLOuFH7qheMK4NkQ:718] in INBOX<br />
+ Copying msg #6:718 to folder INBOX<br />
flags from : [\Seen][]<br />
Copied msg id [6] to folder INBOX msg id [12]<br />
Time : 1 s<br />
++++ Statistics ++++<br />
Time                   : 13 sec<br />
Messages transferred   : 2<br />
Messages skipped       : 0<br />
Total bytes transferred: 1623<br />
Total bytes skipped    : 0<br />
Total bytes error      : 0<br />
Detected 0 errors</strong></p></blockquote>
<p>At this point in the game, there&#8217;s no difference between imapcopy and imapsync. They both appear to fulfill the same role; copy the messages from one inbox to another. However, imapsync is much more capable than it appears on a first glimpse. As we&#8217;ll see in this next run, imapsync has more capabilities packed in.</p>
<blockquote><p><strong>++++ Statistics ++++<br />
Time                   : 12 sec<br />
&lt;b&gt;Messages transferred   : 0 &lt;/b&gt;<br />
Messages skipped       : 2<br />
Total bytes transferred: 0<br />
Total bytes skipped    : 1623<br />
Total bytes error      : 0</strong></p>
<p><strong>Detected 0 errors</strong></p></blockquote>
<p>In the above snippet, we only display the compte rendu of the second run. As you can see, no messages were transfered over to the destination inbox. Impasync is an incremental tool. Big deal!</p>
<p>At this point, all that is needed is a source and destination host, a list of users and respective passwords. But our goal is not to batch the whole operation. The reason being we want to avoid long running jobs with higher latency that could affect end-user experience. Therefore we have to come up with a per-user at-logon solution.</p>
<p>It is common during migrations to ask users to visit a &#8220;migration&#8221; link in order to get the conversion or mailbox sync started. This is an OK approach and it works fine with Imapsync. The webmail page in question launches Imapsync on the server-side code of the page; quite simple. There&#8217;s an alternative, which is to hijack the IMAP software running on the legacy server. The latter method involves as creating a wrapper around the binary so that not only authentication is performed (as usual) but also an Imapsync session is started in the foreground or background. We won&#8217;t go over this here for now as we&#8217;ll stick with the migration link approach.</p>
<p>In the next installment, we&#8217;ll go over Web migration and then follow it up with database migration.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unixy.net/2008/10/web-application-migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

