<?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>Scott O&#039;Brien</title>
	<atom:link href="http://www.scottyob.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.scottyob.com</link>
	<description>A look at the world through my eyes</description>
	<lastBuildDate>Wed, 25 Apr 2012 03:29:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>High Availability WordPress LAMP Stack &#8211; Part 2</title>
		<link>http://www.scottyob.com/2012/04/13/ha-software/</link>
		<comments>http://www.scottyob.com/2012/04/13/ha-software/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 08:16:30 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[nerd]]></category>
		<category><![CDATA[HA]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/?p=157</guid>
		<description><![CDATA[Setting up the Software Stack This article is the second in a series (see part 1 here).  Please see HA Network for the first part in setting up the network topology to be highly available. It’s all good having a redundant network design, but putting web servers and the like on our hypervisors doesn’t make them redundant. [...]]]></description>
			<content:encoded><![CDATA[<h3>Setting up the Software Stack</h3>
<p>This article is the second in a series (<a href="http://www.scottyob.com/2012/04/13/ha-network/">see part 1 here</a>).  Please see <a href="http://www.scottyob.com/2012/04/13/ha-network/">HA Network</a> for the first part in setting up the network topology to be highly available.</p>
<p>It’s all good having a redundant network design, but putting web servers and the like on our hypervisors doesn’t make them redundant.  In the event where there’s a failure on one of our servers, all virtual machines on that server will die.  Looking at our previous network design, we can see a failure on a web server or database server would cause service outage.</p>
<p><a href="http://www.scottyob.com/wp-content/uploads/2012/04/Old-Network-1.jpg"><img class="aligncenter size-full wp-image-136" title="Old Network-1" src="http://www.scottyob.com/wp-content/uploads/2012/04/Old-Network-1.jpg" alt="" width="241" height="445" /></a></p>
<p>In this example, I’m going to talk about a few pretty cool pieces of software that you can use to make a highly available (HA) service stack for hosting Apache web sites from a MySQL data store.  This post isn’t going to be about all the in’s and out’s of how to accomplish, but hopefully it will answer some questions you might have when setting out to accomplish this task as well as point you to the appropriate articles to help you achieve what you’re after.</p>
<h4>Nginx load balancing proxy</h4>
<p>Lets look first at an example of a previous example.  Lets take a simple network where we have a web server with a client.  The A record for www.example.com points to our web server at 192.168.0.10 (of course we’d use NAT on the firewalls in my example to expose it to the internet).</p>
<p><a href="http://www.scottyob.com/wp-content/uploads/2012/04/skitched-3.jpg"><img class="aligncenter size-full wp-image-158" title="Client Server" src="http://www.scottyob.com/wp-content/uploads/2012/04/skitched-3.jpg" alt="" width="337" height="101" /></a></p>
<p>From my previous post, we can tell that the network topology to reach our web server on 192.168.0.10 is highly redundant, if the server itself, or the physical machine it’s hosted on in the case of virtual machines does die, we can no longer serve web pages.</p>
<p>To solve this problem, we’re going to create multiple web servers. The A record for www.example.com is now no longer going to be pointing to the web server itself, but a proxy server (I recommend <a href="http://wiki.nginx.org/Configuration">Nginx</a>.) Now you can see that if either web server dies, our proxy server is able to start handing out requests through the other server. This method is also recommended because it mitigates load from a single server. If your web site got more popular, we can just start scaling out and adding more web servers into the mix to handle the load. Now, I know what you’re thinking, and yes, we have just moved the single point of failure from the web server to the proxy server, but please read on to find out how to protect that host from failure.</p>
<p><a href="http://www.scottyob.com/wp-content/uploads/2012/04/Proxy-Server-1.jpg"><img class="aligncenter size-full wp-image-159" title="Proxy Server-1" src="http://www.scottyob.com/wp-content/uploads/2012/04/Proxy-Server-1.jpg" alt="" width="484" height="272" /></a></p>
<h4>Heartbeat, keep your servers beating</h4>
<p>In the previous example, we had a server that was a single point of failure.  If the proxy server in this case died, then our web site would go down.  To plan against the failure of this machine, you can set up a tool such as <a href="http://www.howtoforge.com/high_availability_heartbeat_centos">Heartbeat</a>.  An example works like the following, your proxy server above is running the Nginx daemon handling your client’s requests, but it does so using a virtual network adaptor where it’s IP address 192.168.0.10 sits.  You put a second server in here in the mix with the same Nginx daemon and the same configuration, but it’s not running or serving anything, this is known as our slave server.  The slave server is sending heartbeat messages to the master server.  In the event that the master server stops responding to the slave’s heartbeat messages, it assumes the master is down and will create a virtual adaptor assuming the working IP address (192.168.0.10 in our example) and brings up the master services.</p>
<p><a href="http://www.scottyob.com/wp-content/uploads/2012/04/Heartbeat-1.jpg"><img class="aligncenter size-full wp-image-160" title="Heartbeat-1" src="http://www.scottyob.com/wp-content/uploads/2012/04/Heartbeat-1.jpg" alt="" width="453" height="406" /></a></p>
<p>I use heartbeat extensively through my HA configurations. Not only for allowing services to be taken up by a slave in the event of a master failure, but also where I have clusters (for example, a MySQL cluster). When the slave assumes the master’s IP address, it’s handy to write a little script/service here to stop any replication and assume the master’s role.</p>
<p><strong>ProTip:</strong> Managing configuration across your servers when you start creating multiple instances for redundancy can start to get out of hand very quickly. Sometimes you can change a configuration on one server and forget to do it on another. I suggest using a tool like <a href="http://en.wikipedia.org/wiki/Puppet_(software)">Puppet</a> to manage the configuration on your servers for you</p>
<p><strong>ProTip:</strong> From experience, I’ve had situations in failover testing where the failure of a core switch will cause heartbeat to stop receiving heartbeats and fail the servers over, even though the physical and virtual machines themselves are fine. If you’re running the (non-rapid) Spanning Tree Protocol (STP) on your network, I suggest making the timeout for Heartbeat about 45 seconds. This should be enough time to allow for STP convergence before it assumes it’s partner is dead.</p>
<h4>NFS File Store</h4>
<p>In the example above, we’ve got multiple web servers. As I’ve said, this setup could be used to host a HA WordPress site. The problem is that when content that sits on the file system (such as an image or theme uploaded, wordpress upgrade, etc) takes place, it will no longer be in sync with the other web servers. For us, hosting the wordpress installation from an NFS mount point worked fine, which begins a thought on how to make this NFS server highly available.</p>
<p>Just like the previous example, we’re going to use Heartbeat to make sure we’ve got a master and slave, and that when the master fails, the slave will start hosting the NFS services. There’s only one more added piece of complexity here. If the master fails, the slave has none of the data that was stored on the master. To get around this, I’m using a tool called DRBD. DRBD allows a block device to be created and synced across multiple hosts. When you write to this device, data is replicated on the slave too. That way when the master dies and the slave takes it’s roll, it will have all the data that existed previously on the master. A good tutorial to set this up can be found <a href="http://www.howtoforge.com/high_availability_nfs_drbd_heartbeat">HERE</a></p>
<p><strong>ProTip:</strong> Once again from experience, when everything is not working as expected, having the slave be promoted is a horrible thing. If the data has not been replicating for some reason over the past few months and the slave gets promoted with data that’s a few months old, it can be a horrible, horrible thing. I suggest running a tool like Nagios on your stack to monitor EVERYTHING you can think of. A good way to check if your DRBD servers are in sync is to look for the term UpToDate/UpToDate in /proc/drbd.</p>
<h4>MySQL Cluster</h4>
<p>There are two ways of running your MySQL server in high redundancy. One simple method using tools you’ve already used is to have the MySQL data store running over DRBD and have Heartbeat keeping it in track. This is pretty simple to set up and I’m running it on one of my sites without a problem.</p>
<p>The problem with running MySQL in this sort of setup is scale. Putting your web servers behind a load balancing proxy is a good first step in allowing for you to slot more servers in your solution and starting to scale out. Once the bottleneck moves to your MySQL server, running a single active/passive pair over DRBD won’t scale out, only up (more expensive, faster hardware).</p>
<p>The second time I had to set this up, I chose to run my servers in a <a href="http://dev.mysql.com/doc/refman/5.1/en/replication.html">MySQL cluster</a>. This means that whenever a transaction is committed on the master, it is sent to the slave to commit as well. The advantage with this is that it allows you to spread out SELECT queries among your slaves instead of running everything on your one server.</p>
<h4>Word for the wise</h4>
<p>Now we have a highly available network stack in place with highly available system services, we can sleep better knowing that if a system outage were to occur, we have our insurance policy in place knowing that in about 50 seconds, a network issue can converge and services can be automatically moved over to hot standby machines. This does not however give you an excuse to not have a backup strategy in place.</p>
<p>If you’re doing backups as an afterthought, I can recommend setting up an OpenIndiana machine running ZFS on it. Setting it up <a href="http://www.scottyob.com/category/nerd/fileserver-nerd/">like I have</a> off site with rotating snapshots. At our work we do nightly backups and for us it’s as simple as doing a database dump, then rsync’ing everything over to this remote ZFS machine to get snapshotted, feeling safe I can access old data from 6 weeks ago (my nightly snapshot period.)</p>
<h4>What’s to come?</h4>
<p>If you’ve got this far, Thanks for reading and I hope this post pointed you in the right direction to help build highly available services. I think more and more in today’s world people are expecting IT infrastructure to be always up and available. If you don’t have standby servers available, sooner or later, you’re bound to have unhappy customers. I’ve always wanted to build a disaster recovery site, with a highly active database so that in the event of an entire site failing over (think natural disaster, people errors and the like) a site can fail over to another physical disaster recovery (DR) location.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2012/04/13/ha-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>High Availability WordPress LAMP Stack.</title>
		<link>http://www.scottyob.com/2012/04/13/ha-network/</link>
		<comments>http://www.scottyob.com/2012/04/13/ha-network/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 07:27:11 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[nerd]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Juniper]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[SRX]]></category>
		<category><![CDATA[VMWare]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/?p=134</guid>
		<description><![CDATA[Introduction In one of my last little tasks at work, I was asked to eliminate single points of failure in the software and hardware stack without spending a fortune on hardware or software licenses. During the process of ensuring high availability (HA), I realized that many small companies might have similar need, but with more [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>In one of my last little tasks at work, I was asked to eliminate single points of failure in the software and hardware stack without spending a fortune on hardware or software licenses. During the process of ensuring high availability (HA), I realized that many small companies might have similar need, but with more pressing tasks and limited man hours, without a post that talks about all the issues and solutions in one place, many companies and organisations tend to leave single points of failure living with the chance that they’re not going to fail any time soon.</p>
<p>I’ve wanted to write this blog post for a while. After you’ve finished reading this blog post, you should have the knowledge to be able to eliminate the single point of failures in hosting a WordPress website. While I’ve chosen WordPress to be the demonstration of this post, the concepts will work with any apache/mysql LAMP stack software. During the course of this tutorial, I’ll run you through it in two parts. The first part is talking about setting up the physical hosts and topology (using Juniper EX2200 switches, SRX100 border firewall’s and ESXi (free) hypervisors for the software stack.) The second part is talking about setting up the software stack to deliver our LAMP stack in a highly redundant fashion.  However what I won&#8217;t be doing is providing complete configuration examples.  Instead, please consider this post as an overview to help enlighten you and link you to more specific information to help you set this up in your own environment.</p>
<p>This blog post is split up in two parts, this first post in the series talks about setting up the network infrastructure, the second talks about setting up the software stack.</p>
<p>Part 1 (physical topology)<br />
- Network overview<br />
- Setting up dual Switches<br />
- Setting up ESXi network cards.<br />
- Setting up SRX border firewall’s.</p>
<p>Part 2 (software stack)<br />
- Nginx load balancing proxy<br />
- Web Servers.<br />
- NFS File Server<br />
- MySQL cluster.</p>
<h3>Part 1, Physical Topology</h3>
<p>If you’re reading this, I’m guessing your current network topology looks something like</p>
<p>mine used to.  You have a single internet connection, single router/firewall, single switch and a bunch of hosts hanging from that switch.  In the event of a system failure, your system administrator (me in this case) will have to hop in a cab and rush to the server room to fix the problem.</p>
<p><img class="size-full wp-image-136 aligncenter" title="Old Network-1" src="http://www.scottyob.com/wp-content/uploads/2012/04/Old-Network-1.jpg" alt="" width="241" height="445" /></p>
<p>The goal with this tutorial is to attempt to help your administrators sleep at night.  We will eliminate every single point of failure such that in the event of a system outage/failure, the system can self recover with at most a minute of unscheduled down time.</p>
<p><a href="http://www.scottyob.com/wp-content/uploads/2012/04/New-Network.jpg"><img class="aligncenter size-full wp-image-137" title="New Network" src="http://www.scottyob.com/wp-content/uploads/2012/04/New-Network.jpg" alt="" width="307" height="409" /></a></p>
<h4>Physical Switches</h4>
<p>We’ll be replacing the single switch (in my case, unmanaged old gigabit switch) with a pair of managed switches.  Because our bandwidth requirements in this site wasn’t terribly demanding (simple database server, few web, mail servers and the like), a single gigabit Ethernet link to all hosts was all that we required.  If you’re in the same boat I was, I can suggest a pair of Juniper EX2200’s.  If however, you’re going to be pumping some more bandwidth intensive applications through your network (thus require more then gigabit Ethernet connections to the hosts) or have the need for more then a single VLAN and intra-VLAN routing is required (that’s all outside the scope of this tutorial.)  I can strongly recommend you start looking at the EX4200 model switches (set up in a virtual chassis), which can do all your highly available layer 3 IP routing and support multi gigabit Ethernet to your hosts by spanning Ethernet channel across both physical switches.</p>
<h4>Active/Passive Switch Design?</h4>
<p>Ok, so this heading is a lie, but let me explain.  In my switch design with the EX2200’s, I’m using aggregate Ethernet 802.3ad Etherchannel between my two switches. I’ve opted to use 4 physical ports in my 24 port switches (ge-0/0/20 to ge-0/0/23) to give me a 4Gbit/s backbone between them. Obviously with gigabit Ethernet right through the network this isn’t much bandwidth, so the idea is to keep as little data traveling that link as possible (network broadcasts only hopefully!)</p>
<p>First, the following configuration configures the aggregate Ethernet link between the switches:</p>
<pre class="brush: plain; title: ; notranslate">chassis {
    aggregated-devices {
        ethernet {
            device-count 1;
        }
    }
}

[interfaces]
    ge-0/0/20 {
        ether-options {
            802.3ad ae0;
        }
    }
    ge-0/0/21 {
        ether-options {
            802.3ad ae0;
        }
    }
    ge-0/0/22 {
        ether-options {
            802.3ad ae0;
        }
    }
    ge-0/0/23 {
        ether-options {
            802.3ad ae0;
        }
    }
    ae0 {
        aggregated-ether-options {
            lacp {
                passive;
            }
        }
        unit 0 {
            family ethernet-switching {
                port-mode trunk;
                vlan {
                    members all;
                }
            }
        }
    }
</pre>
<p>The only thing you have to watch out for, is that on at least one switch, you set the lacp mode to be <strong>active</strong>.</p>
<h4>Setting up ESXi Network</h4>
<p>In my environment, I’m using the free version of ESXi 4.1. I understand that you may wish to be connecting linux hosts directly. If you’re directly connecting linux hosts, I recommend you look at creating a <a href="http://wiki.centos.org/TipsAndTricks/BondingInterfaces">Bonding Adaptor</a>.  Thought without the more expensive EX4200’s, we’re best sticking with an active-backup setup and should stick with mode=1.</p>
<p>For the ESXi configuration, it’s pretty simple. We connect two NIC’s to the switches. A primary NIC to the primary switch, and a secondary NIC to the secondary switch.</p>
<p>The steps on configuring the vSwitch (virtual switch) are pretty simple. Virtual machines on these ESXi hosts won’t have to do anything special once this setup has been done to take advantage on the physical machines, they’ll just take advantage of our HA network topology.</p>
<p>First, ensure that we have two NIC’s setup on our vSwitch.</p>
<p style="text-align: center;"><img class="aligncenter  wp-image-150" title="vSwitch" src="http://www.scottyob.com/wp-content/uploads/2012/04/vSwitch.jpg" alt="" width="451" height="332" /></p>
<p>Next, look at the following configuration properties I’ve made to the NIC teaming information.  This basic configuration will ensure that when the link on vmnic0 is available (our active switch), it’ll use it.  When the link becomes unavailable, it will fail over to vmnic1.</p>
<p style="text-align: center;"><a href="http://www.scottyob.com/wp-content/uploads/2012/04/vSwitch-1.jpg"><img class="aligncenter  wp-image-151" title="vSwitch-1" src="http://www.scottyob.com/wp-content/uploads/2012/04/vSwitch-1.jpg" alt="" width="451" height="565" /></a></p>
<h5>Setting up border firewall’s</h5>
<p>The last step we’ve got in our highly available infrastructure here is our border firewall’s. Please bare with me on this section, it is the most complicated and there are a few technologies introduced. If there is something I don’t explain completely, please feel free to leave a comment below and I’ll try and explain it better.  I expect you’ll have to jump back and forth between Wikipedia and this article to fully understand what it is we’re doing. Explaining the concepts behind BGP and autonomous systems is beyond the scope of this article.</p>
<p>In my role, I replaced an active/backup GNU based firewall solution (backup being run down to the data center as fast as possible and swap the cables over) with two Juniper SRX100’s configured in an active/passive configuration under a chassis cluster (see SRX100 high availability deployment guide at <a href="http://kb.juniper.net/InfoCenter/index?page=content&amp;id=KB15669">http://kb.juniper.net/InfoCenter/index?page=content&amp;id=KB15669</a>). We had get a second internet connection installed, then make sure that any one link (or firewall itself) can die and still have the system self recover. There are two major tasks that has to happen to make this gateway highly available. Firstly, our internal network hosts will be using one of these firewall’s as their default gateway. If the link to the primary switch, or the primary firewall itself should die, we still want the network hosts to be able to reach their gateway. We will achieve this with “redundant Ethernet” on the cluster. If you’ve come from the cisco networking world before, picture something like this to be like VRRP for the inside hosts. If the main link fails, the MAC and IP address will float over to the other physical port.</p>
<p>Let me give a bit more detail to our new example network topology here in this example so you can gain a better idea of how these settings work.</p>
<p style="text-align: center;"><a href="http://www.scottyob.com/wp-content/uploads/2012/04/Network-Setup.jpg"><img class="aligncenter  wp-image-153" title="Network Setup" src="http://www.scottyob.com/wp-content/uploads/2012/04/Network-Setup.jpg" alt="" width="441" height="438" /></a></p>
<p>For the internal gateway address to fail over to the other switch should your link off Firewall1 die, You’ll want to make the following configuration</p>
<pre class="brush: plain; title: ; notranslate">
chassis {
    cluster {
        reth-count 2;
        redundancy-group 0 {
            node 0 priority 100;
            node 1 priority 1;
        }
        redundancy-group 1 {
            node 0 priority 254;
            node 1 priority 1;
            preempt;
            interface-monitor {
                fe-0/0/1 weight 255;
                fe-1/0/1 weight 255;
            }
        }
    }
}
interfaces {
    fe-0/0/1 {
            fastether-options {
                redundant-parent reth1;
            }
    }
    fe-1/0/1 {
            fastether-options {
                redundant-parent reth1;
            }
    }
}
</pre>
<p>You can see redundancy-group 1 is monitoring the local interfaces going back to the switches.</p>
<p>For the dual WAN links, I won’t go into much detail, but you’ll want to ask your ISP for a second internet connection. Some providers offer a cheap link that they only charge you for once you start flowing data over it (sometimes called a Shadow link). This is perfect as you can flow all your traffic through your primary internet connection, then on failure of it, you’ll move your traffic through the secondary. If you wanted complete redundancy, you could apply for a domain independent subnet (has to be a class C to advertise on world BGP tables) and your own ASN. This will let you use two different internet service providers.</p>
<p>In my case, I’m creating a redundant connection using the same ISP, so I’ve asked for a private ASN to be allocated (see http://en.wikipedia.org/wiki/Autonomous_System_(Internet) ).</p>
<p>For a small network such as ours (especially using the small base level SRX’s) you’ll want to ask your provider to advertise only the default route to you. In turn, you’ll advertise your network’s address space on both connections. On the event that a link dies, the BGP peer on the other end no longer receives updates from you and will no longer attempt to route to it.</p>
<p>The following configuration extract shows how we’d configure out SRX firewall’s to peer with our ISP’s routers. Things of note is that our primary link (the one on the left) has a lower metric-out then the shadow link, meaning a lower MED attribute is sent to our ISP and thus inbound traffic will, by preference use the main connection. The preference values under neighbor will determine the preference we will send traffic under that connection for outbound traffic.</p>
<pre class="brush: plain; title: ; notranslate">routing-options {
    autonomous-system 64512
}

protocols {
    bgp {
        group ISP {
            metric-out 50;
            local-address 1.1.1.2;
            import ISP-in;
            export ISP-out;
            neighbor 1.1.1.1 {
                preference 170;
                peer-as 123;
            }
        }
        group ISP-shadow {
            metric-out 100;
            local-address 1.1.1.6;
            import ISP-in;
            export ISP-out;
            neighbor 1.1.1.5 {
                preference 180;
                peer-as 123;
            }
        }
    }
}
policy-options {
    policy-statement ISP-in {
        term default-in {
            from {
                route-filter 0.0.0.0/0 exact;
            }
            then accept;
        }
        term block {
            then reject;
        }
    }
    policy-statement ISP-out {
        term tnziPublic {
            from {
                protocol direct;
                route-filter 2.2.2.0/26 exact;
            }
            then accept;
        }
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2012/04/13/ha-network/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s the harm in Google DNS?  Performance!</title>
		<link>http://www.scottyob.com/2011/07/02/whats-the-harm-in-google-dns-performance/</link>
		<comments>http://www.scottyob.com/2011/07/02/whats-the-harm-in-google-dns-performance/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 14:40:05 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[nerd]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[routing]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/?p=112</guid>
		<description><![CDATA[On a little side note to the tutorial series I&#8217;ve been writing up lately for building a ZFS fileserver. This one is about Why Google DNS is bad for your performance (well, depending on where you live) A real quick run down, we all know what DNS does yeah? It translates domains like www.scottyob.com into [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both;">On a little side note to the tutorial series I&#8217;ve been writing up lately for building a ZFS fileserver. This one is about Why Google DNS is bad for your performance (well, depending on where you live)</p>
<p style="clear: both;">A real quick run down, we all know what DNS does yeah? It translates domains like www.scottyob.com into IP addresses like 112.140.183.97. A DNS server has a job of translating these domain names to the IP addresses we can use.</p>
<p style="clear: both;">Now, when it comes to Google DNS, if you believe in the propaganda <a href="http://code.google.com/speed/public-dns/">http://code.google.com/speed/public-dns/</a> where Google DNS is said to</p>
<ul style="clear: both;">
<li><a href="http://code.google.com/speed/public-dns/docs/performance.html">Speed up your browsing experience</a></li>
<li><a href="http://code.google.com/speed/public-dns/docs/security.html">Improve your Security. </a></li>
</ul>
<p style="clear: both;">What google doesn&#8217;t tell you is that it interferes with DNS servers that might try and give you a server that&#8217;s close to your home. I&#8217;ve been using Google DNS for months here at home, but only just have I decided against using it, and I&#8217;ll run through exactly what causes some performance issues.</p>
<p style="clear: both;">I was trying to watch a program on iView on TPG&#8217;s internet connection. Now, TPG don&#8217;t have the best international links on peak times, so I first started getting frustrated at them for not letting me watch my iView program with buffer lags on my 8Mbit plan. I checked my Signal to Noise ratio and dropped packets, etc.. it was fine. I checked the bandwith going out on my ppp interface on the router to see if I was maxing out the net connection at home, but nope, that was fine too, so the problem must have been with TPG.</p>
<p style="clear: both;">Looking at what was going on, I did a little traceroute to www.abc.net.au</p>
<blockquote style="clear: both;">
<p style="clear: both;">traceroute: Warning: www.abc.net.au has multiple addresses; using 125.252.224.73<br />
traceroute to a1632.g.akamai.net (125.252.224.73), 64 hops max, 52 byte packets<br />
1 10.1.1.254 (10.1.1.254) 1.919 ms 1.260 ms 1.202 ms<br />
2 * * *<br />
3 202.7.173.17 (202.7.173.17) 27.056 ms 26.317 ms 26.693 ms<br />
4 syd-sot-ken-crt1-ge-5-1-0.tpgi.com.au (202.7.162.173) 26.283 ms 26.884 ms 26.100 ms<br />
5 ix-11-1-0-507.tcore2.tv2-tokyo.as6453.net (116.0.88.21) 153.325 ms 135.736 ms 126.568 ms<br />
6 if-14-0-0-1720.core1.tv2-tokyo.as6453.net (209.58.61.121) 1481.461 ms<br />
if-1-0-0-1715.core1.tv2-tokyo.as6453.net (209.58.61.125) 298.270 ms<br />
if-14-0-0-1720.core1.tv2-tokyo.as6453.net (209.58.61.121) 282.141 ms<br />
7 if-10-0-0-981.core3.hk2-hongkong.as6453.net (116.0.82.85) 208.232 ms<br />
if-5-0-0.core3.hk2-hongkong.as6453.net (116.0.82.1) 199.170 ms<br />
if-10-0-0-981.core3.hk2-hongkong.as6453.net (116.0.82.85) 206.027 ms<br />
8 vlan31.icore1.hk2-hongkong.as6453.net (116.0.82.18) 219.937 ms 204.963 ms 196.273 ms<br />
9 80.150.169.25 (80.150.169.25) 333.519 ms 306.138 ms 307.031 ms<br />
10 80.156.224.6 (80.156.224.6) 358.402 ms 320.029 ms 349.133 ms<br />
11 a125-252-224-73.deploy.akamaitechnologies.com (125.252.224.73) 332.188 ms 331.008 ms 314.833 ms</p>
</blockquote>
<p style="clear: both;">Looking at this traceroute, the first thing I thought was &#8220;Why on earth is ABC hosting it&#8217;s website in hongkong (or so the traffic has to go via hongkong.)? Immediately reject ABC would do this and I blame TPG&#8217;s stupid routing decisions.</p>
<p style="clear: both;">Looking at the IP address further <a href="http://www.dnsstuff.com/tools/ipall/?tool_id=67&amp;token=&amp;toolhandler_redirect=0&amp;ip=125.252.224.73">http://www.dnsstuff.com/tools/ipall/?tool_id=67&amp;token=&amp;toolhandler_redirect=0&amp;ip=125.252.224.73</a> It looks like it&#8217;s hosted in Singapore, and some googling shows akamaitechnologies is the web host for ABC.. ok, so what is going on here?</p>
<p style="clear: both;">then I did a little DIGging around on the ABC domain and check this out.</p>
<p style="clear: both;">Using Google DNS (8.8.8.8, hosted in America)</p>
<blockquote style="clear: both;">
<p style="clear: both;">; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; www.abc.net.au @8.8.8.8</p>
<p style="clear: both;">;; global options: +cmd</p>
<p style="clear: both;">;; Got answer:</p>
<p style="clear: both;">;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 16084</p>
<p style="clear: both;">;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0</p>
<p style="clear: both;">;; QUESTION SECTION:</p>
<p style="clear: both;">;www.abc.net.au. IN A</p>
<p style="clear: both;">;; ANSWER SECTION:</p>
<p style="clear: both;">www.abc.net.au. 882 IN CNAME www.abc.net.au.edgesuite.net.</p>
<p style="clear: both;">www.abc.net.au.edgesuite.net. 21581 IN CNAME a1632.g.akamai.net.</p>
<p style="clear: both;">a1632.g.akamai.net. 2 IN A 63.150.131.41</p>
<p style="clear: both;">a1632.g.akamai.net. 2 IN A 63.150.131.33</p>
<p style="clear: both;">;; Query time: 161 msec</p>
<p style="clear: both;">;; SERVER: 8.8.8.8#53(8.8.8.8)</p>
<p style="clear: both;">;; WHEN: Sun Jul 3 00:37:00 2011</p>
<p style="clear: both;">;; MSG SIZE rcvd: 135</p>
</blockquote>
<p style="clear: both;">And using TPG&#8217;s DNS servers (203.12.160.35)</p>
<blockquote style="clear: both;"><p><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px} span.Apple-tab-span {white-space:pre} -->macshell:~ scott$ dig www.abc.net.au @203.12.160.35</p>
<p>&nbsp;</p>
<p>; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; www.abc.net.au @203.12.160.35</p>
<p>;; global options: +cmd</p>
<p>;; Got answer:</p>
<p>;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 11673</p>
<p>;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0</p>
<p>&nbsp;</p>
<p>;; QUESTION SECTION:</p>
<p>;www.abc.net.au.			IN	A</p>
<p>&nbsp;</p>
<p>;; ANSWER SECTION:</p>
<p>www.abc.net.au.		523	IN	CNAME	www.abc.net.au.edgesuite.net.</p>
<p>www.abc.net.au.edgesuite.net. 12274 IN	CNAME	a1632.g.akamai.net.</p>
<p>a1632.g.akamai.net.	10	IN	A	202.7.177.66</p>
<p>a1632.g.akamai.net.	10	IN	A	202.7.177.83</p>
<p>&nbsp;</p>
<p>;; Query time: 29 msec</p>
<p>;; SERVER: 203.12.160.35#53(203.12.160.35)</p>
<p>;; WHEN: Sun Jul  3 00:38:20 2011</p>
<p>;; MSG SIZE  rcvd: 135</p>
<p style="clear: both;">&nbsp;</p>
</blockquote>
<p>So there we go, hosted in Sydney Australia.. So how does the traceroute compare?</p>
<blockquote><p>macshell:~ scott$ traceroute www.abc.net.au</p>
<p>traceroute: Warning: www.abc.net.au has multiple addresses; using 202.7.177.83</p>
<p>traceroute to a1632.g.akamai.net (202.7.177.83), 64 hops max, 52 byte packets</p>
<p>1  10.1.1.254 (10.1.1.254)  1.711 ms  1.134 ms  1.100 ms</p>
<p>2  * * *</p>
<p>3  202.7.173.17 (202.7.173.17)  27.047 ms  26.072 ms  26.502 ms</p>
<p>4  syd-sot-ken-ak2-83.tpgi.com.au (202.7.177.83)  26.540 ms  26.835 ms  26.540 ms</p></blockquote>
<p>Different nameservers can be set up to resolve to different addresses based on geographic positioning, in more of a first in best dressed kind of effort.  So if you&#8217;re using Google DNS servers (8.8.8.8), it so happens that because this is in America (check out their IP address, CA), then I started getting update servers and the like on DNS that were closest in latency terms to America then Sydney Australia.</p>
<p>Simply by changing from Google DNS servers to my ISP&#8217;s, I get healthier latency, and am no longer sending traffic over saturated overseas links.  So how does this compare with ABC iView?  Well, check it out</p>
<p><img class="alignnone" title="iView before" src="https://img.skitch.com/20110702-1t6mcstm7chcus1ikbictyydp1.jpg" alt="iView before" width="659" height="197" /></p>
<p>And when I&#8217;m using my own ISP&#8217;s DNS</p>
<p><img class="alignnone" title="iView After" src="https://img.skitch.com/20110702-1wq1jcb1g6u8xi7ad5ht1ky124.jpg" alt="" width="651" height="192" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/07/02/whats-the-harm-in-google-dns-performance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Allowing access through NFS &amp; SAMBA</title>
		<link>http://www.scottyob.com/2011/04/04/allowing-access-through-nfs-samba/</link>
		<comments>http://www.scottyob.com/2011/04/04/allowing-access-through-nfs-samba/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 11:53:32 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[FileServer]]></category>
		<category><![CDATA[nerd]]></category>
		<category><![CDATA[CIFS]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/?p=101</guid>
		<description><![CDATA[Cifs Share CIFS (Common Internet File System), the protocol windows users for all it’s ‘windows file sharing’ is the method I’ll allow for my desktops and roaming computers to access files on the file server. Before we begin, Make sure we install the CIFS kernal modules # pkg install SUNWsmbs # pkg install SUNWsmbskr next [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both">
<p style="clear: both">
<h2>Cifs Share</h2>
</p>
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">CIFS (Common Internet File System), the protocol windows users for all it’s ‘windows file sharing’ is the method I’ll allow for my desktops and roaming computers to access files on the file server.</p>
<p style="clear: both">
<p style="clear: both">Before we begin, Make sure we install the CIFS kernal modules</p>
<p style="clear: both">
<blockquote style="clear: both"><p># pkg install SUNWsmbs # pkg install SUNWsmbskr</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">next we issue this command to make sure it auto starts</p>
<p style="clear: both">
<blockquote style="clear: both"><p># svcadm enable -r smb/server</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">I&#8217;ve decided for every day use, I want a data store on the server, so..</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs create datastore/homes # zfs create datastore/homes/scott</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">now, set up compression on my home directory</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs set compression=on datastore/homes</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Time to do some setup so we can log into this share, I&#8217;ll make the box join the workgroup &#8216;home</p>
<p style="clear: both">
<blockquote style="clear: both"><p># smbadm join -w home</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">To start sharing with windows boxes, I need to change the pam.conf file to generate windows passwords too. Add the line below /etc/pam.conf</p>
<p style="clear: both">
<blockquote style="clear: both"><p>other password required pam_smb_passwd.so.1 nowarn</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">reset the password for my user scott, then I&#8217;ll be able to authenticate with him</p>
<p style="clear: both">
<blockquote style="clear: both"><p># passwd scott</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">The next step is setting up guest access. You may remember we created a media share datastore/media. We want to share that with guests to the network (on the trusted subnet anyway). Before we go ahead and set that up, we want to map the windows Guest user to the unix user nobody.</p>
<p style="clear: both">
<blockquote style="clear: both"><p># idmap add winname:Guest unixuser:nobody</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">then we&#8217;ll allow guest access to our media box</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs set sharesmb=name=media,guestok=true datastore/media</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">I also want to make my home directory only accessible by me, so I’m going to own the directory</p>
<p style="clear: both">
<blockquote style="clear: both"><p>chown scott /datastore/homes/scott chgrp staff /datastore/homes/scott chmod 700 /datastore/homes/scott</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">and share it</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs set sharesmb=name=scott datastore/homes/scott</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">So there we have it, a media folder anyone can access, and a ‘scott’ share that I’ll need to authenticate with (HOME\scott user)</p>
<p style="clear: both">
<p style="clear: both"><a href="http://www.scottyob.com/wp-content/uploads/2011/03/image1.png" class="image-link"><img src="http://www.scottyob.com/wp-content/uploads/2011/03/image_thumb1.png" height="355" width="480" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a><br />
<h2>NFS Shares</h2>
</p>
<p style="clear: both">
<p style="clear: both">Now we’ve got CIFS set up for our clients, I want to set up NFS shares for other Linux boxes on the network (at this point, only my router) to be able to access. The idea is that my router will have all the home directories on the FileServer (so it’ll get the advantages of snapshots, etc) we well as not being limited to the dying 60GB hard disk for torrenting and such things.</p>
<p style="clear: both">
<p style="clear: both">As mentioned, I’m only interested in NFS shares with my router at this point, so we’ll make sure my routers IP address (10.12.1.254) is restricted in the shares.</p>
<p style="clear: both">
<p style="clear: both">The first thing we want to try is setting up the nfs mount on our homes directory.</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs set <a href="mailto:sharenfs=root=@10.12.1.254,rw=@10.12.1.254">sharenfs=root=@10.12.1.254,rw=@10.12.1.254</a> datastore/homes</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Now, <strong>on my debian router box</strong> I want to see if I can mount this (assuming the directory /home2/scott exists on the client)</p>
<p style="clear: both">
<p style="clear: both">sudo mount -t nfs -o nfsvers=3 10.12.1.1:/datastore/homes/scott /home2/scott</p>
<p style="clear: both">
<p style="clear: both">and Ta-Da! My home directory is mounted. What I want to do now is to set up auto-mounts. That is, when a directory is accessed for my users home directory, it’d mount it on the fly.</p>
<p style="clear: both">
<p style="clear: both">First, install the autofs package</p>
<p style="clear: both">
<blockquote style="clear: both"><p><span style="color: #484848;">apt-get install autofs</span></p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Add the following line into <strong>/etc/auto.master</strong></p>
<p style="clear: both">
<blockquote style="clear: both"><p><span style="color: #484848;">/home2 /etc/auto.home -–timeout=60</span></p>
</blockquote>
<p style="clear: both">
<p style="clear: both">and the following into the file <strong>/etc/auto.home</strong></p>
<p style="clear: both">
<blockquote style="clear: both"><p>* -fstype=nfs,rw,nosuid,soft,vers=3 server:/datastore/homes/&#038;</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">the <strong>*</strong> and /datastore/homes/&#038; do their magic by automatically mounting the required directory when needed (as long as the /etc/init.d/autofs is started)</p>
<p style="clear: both">
<p style="clear: both">Now lets add a place for our downloads</p>
<p style="clear: both">
<blockquote style="clear: both"><p># zfs create datastore/media/downloads # zfs set sharenfs=root=router,rw=router datastore/media/downloads</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">I chose to just mount this using the automounter under the home2 directory, I added this to the <strong>/etc/auto.home</strong> file</p>
<p style="clear: both">
<blockquote style="clear: both"><p>downloads -fstype=nfs,rw,nosuid,soft,vers=3 10.12.1.1:/datastore/media/downloads</p>
</blockquote>
<p style="clear: both">Pretty neat, now when you head to a directory that&#8217;s not mounted yet (like /home2/scott/) in the linux client, it will auto mount the required NFS volume and presto, we&#8217;ve got ourselves network storage.</p>
<p style="clear: both"><strong>Other posts to come in the series:</strong><br />1. Selecting the hardware<br />2. Installing the Operating System<br />3. Setting up File systems &#038; Snapshots<br />4. Allowing access through NFS &#038; SAMBA<br />5. Setting up encrypted off-site backups<br />6. Configuring Windows &#038; Linux clients to dump backup info to the FileServer<br />7. My router setup, configuring IP tables &#038; torrents on a low-powered server.</p>
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/04/04/allowing-access-through-nfs-samba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3. Setting up FileSystems and Snapshots (part 2)</title>
		<link>http://www.scottyob.com/2011/03/24/3-setting-up-filesystems-and-snapshots-part-2/</link>
		<comments>http://www.scottyob.com/2011/03/24/3-setting-up-filesystems-and-snapshots-part-2/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 18:17:20 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[FileServer]]></category>
		<category><![CDATA[fileserver]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/03/27/3-setting-up-filesystems-and-snapshots-part-2/</guid>
		<description><![CDATA[Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback In part 1 of this blog post, I showed you how I created a script that would, when run, rotate your snapshots on [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><strong>Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback</strong></p>
<p>In <a href="http://www.scottyob.com/?p=88">part 1</a> of this blog post, I showed you how I created a script that would, when run, rotate your snapshots on a ZFS filesystem. For this to be usable, we need to create a mechanism for having it be automatically ran. We&#8217;ll do this with a cronjob.</p>
<p style="clear: both">On Unix systems, the cron daemon is used to execute scheduled commands. Picture it much like windows task scheduler for all you windows kiddies.</p>
<p style="clear: both">I saved the backup script we wrote yesterday to /FileStore/backups.sh. The first thing I want to get running is my hourly backups. To do this, we&#8217;ll start editing our cron file</p>
<blockquote style="clear: both"><p>sudo crontab -e</p>
</blockquote>
<p style="clear: both">The crontab utility is a program used to edit the tables that drive the cron daemon.</p>
<p style="clear: both">On my OSX box, information about how to set up the cron file can be found in &#8216;man 5 crontab&#8217;</p>
<p style="clear: both">Basically, cron examines cron entries once every minute. the fields that we&#8217;ve got to play with are (in this order)</p>
<blockquote style="clear: both"><p> field allowed values<br /> &#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211;<br /> minute 0-59<br /> hour 0-23<br /> day of month 1-31<br /> month 1-12 (or names, see below)<br /> day of week 0-7 (0 or 7 is Sun, or use names)</p>
</blockquote>
<p style="clear: both">Having said that, it&#8217;s time to think about when we want to create our snapshots. Because I intend machines to do their backups to the server on the hour, I&#8217;ll be creating my snapshots at half past the hour. My cron file now looks like this (for hourly snapshots with 24 rotations, daily snapshots with 7 rotations, Weekly snapshots with 4 rotations.</p>
<blockquote style="clear: both"><p>#**Snapshots for the Filesystem**<br />30 * * * * /bin/bash /FileSystem/backups.sh hourly 24<br />30 6 * * * /bin/bash /FileSystem/backups.sh daily 7<br />30 6 * * sun /bin/bash /FileSystem/backups.sh weekly 4</p>
</blockquote>
<p style="clear: both">Now that that concludes our section on setting up my rotating snapshots.</p>
<p style="clear: both"><strong>Other posts to come in the series:<br /></strong>1. Selecting the hardware<br />2. Installing the Operating System<br />3. Setting up File systems &#038; Snapshots<br />4. Allowing access through NFS &#038; SAMBA<br />5. Setting up encrypted off-site backups<br />6. Configuring Windows &#038; Linux clients to dump backup info to the FileServer<br />7. My router setup, configuring IP tables &#038; torrents on a low-powered server.</p>
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/03/24/3-setting-up-filesystems-and-snapshots-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3. Setting up FileSystems and Snapshots (part 1)</title>
		<link>http://www.scottyob.com/2011/03/18/3-setting-up-filesystems-and-snapshots/</link>
		<comments>http://www.scottyob.com/2011/03/18/3-setting-up-filesystems-and-snapshots/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 12:10:36 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[FileServer]]></category>
		<category><![CDATA[fileserver]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/03/18/3-setting-up-filesystems-and-snapshots/</guid>
		<description><![CDATA[Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback Setting up the FileSystems is a trivial task.  First, you can see that when we’ve created a storage pool ‘datastore’ it created a [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback</em></strong></p>
<p>Setting up the FileSystems is a trivial task.  First, you can see that when we’ve created a storage pool ‘datastore’ it created a filesystem for us (also called datastore) that can act as a container for child file systems.  I’m going to go ahead and create a place to store my media and downloads now</p>
<blockquote><p>zfs create datastore/media</p></blockquote>
<p>for now I’ll also want a place to store my backups.  It’s worth noting that while my media filesystem will contain compressed MP3’s and the like, it’s kind of a waste of CPU power to compress it, but my backups will be a lot of PHP pages and what not, so lets go ahead and enable compression on this one</p>
<blockquote><p># zfs create datastore/backups<br />
# zfs set compression=on datastore/backups</p></blockquote>
<p>As appalled as I am of my mums backup habits, one of the requirements of this server was to provide a medium for backing up her data without her having to do anything, so lets set up backup locations for my laptop (MacShell) and a place for mum (mum) assigning both of these 20GB quota’s (ok, MacShell gets 120GB)</p>
<blockquote><p># zfs create datastore/backups/MacShell<br />
# zfs create datastore/backups/mum<br />
# zfs set quota=120G datastore/backups/MacShell<br />
# zfs set quota=20GB datastore/backups/mum<br />
# zfs get datastore/backups/mum</p></blockquote>
<p>Now, the idea is that a cron job will run rsyncing over the files every hour, on the hour.  For many reasons (in case I get a virus and need to revert back, in case somebody hacks in and does bad stuff, etc, etc) I’m going to choose to <a href="http://docs.huihoo.com/opensolaris/solaris-zfs-administration-guide/html/ch06.html">create Snapshots</a> so I can roll back to a previous version.</p>
<p>The convention I want is hourly.HOUR, daily.DAY, weekly.WEEK for up to 7 days and 4 weeks.  This also means that once I delete a file, I won’t recover the space that it took (once a snapshot of the file has been created) in my data pool until the end of the 4 week period.  for instance, hourly.0 will be the last hours snapshot, hourly.1 will be the 2nd last hours snapshot, etc.</p>
<p>the following bash script will take care of the desired snapshots.  It’s based on a concept I took from this <a href="http://blogs.sun.com/mmusante/entry/rolling_snapshots_made_easy">rolling snapshots made easy</a> post but I like <a href="http://www.scottyob.com/wp-content/uploads/2011/03/snapshot.sh">my scripted way of doing rotating snapshots</a> much better.</p>
<blockquote><p>#!/bin/bash</p>
<p>#print out usage<br />
if [ $# -ne 2 ]<br />
then<br />
echo &#8220;Usage: snapshot.sh [snapName] [max]&#8221;<br />
echo &#8220;  eg. snapshot.sh hour 24&#8243;<br />
fi</p>
<p>#if the max snapshot already exists, just delete it<br />
if [ `zfs list -t snapshot | grep datastore@$1.$2 | wc -l` -eq 1 ]<br />
then<br />
zfs destroy -r datastore@$1.$2<br />
fi</p>
<p>#<br />
for ((i=$2-1; i &gt;= 0; i&#8211;)); do<br />
if [ `zfs list -t snapshot | grep datastore@$1.$i | wc -l` -eq 1 ]<br />
then<br />
#this snapshot exists, so we want to move it up one<br />
zfs rename -r datastore@$1.$i @$1.$[$i+1]<br />
fi<br />
done</p>
<p>zfs snapshot -r datastore@$1.0</p></blockquote>
<p>so with this snapshot beauty in place, lets say I had an existing file and structure in place</p>
<blockquote><p>root@thumper:/datastore/backups/MacShell# pwd<br />
/datastore/backups/MacShell<br />
root@thumper:/datastore/backups/MacShell# tree<br />
.<br />
|&#8211; hello_world.txt<br />
`&#8211; someDir<br />
`&#8211; someFile.dat</p>
<p>1 directory, 2 files</p></blockquote>
<p>BUT, I had a snapshot in place</p>
<blockquote><p># /snapshot.sh hourly 24</p></blockquote>
<p>then I did something silly like delete my entire backup directory (Oh No!!)</p>
<blockquote><p># rm -R *<br />
# ls -l<br />
total 0</p></blockquote>
<p>never fear! check the snapshots</p>
<blockquote><p>root@thumper:/datastore/backups/<br />
MacShell/.zfs/snapshot/hourly.0# tree<br />
.<br />
|&#8211; hello_world.txt<br />
`&#8211; someDir<br />
`&#8211; someFile.dat</p></blockquote>
<p>they’ll eventually roll off my snapshot cycle and be removed in 4 weeks with my plan, but hey, pretty good at this point <img src='http://www.scottyob.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>See <a href="http://www.scottyob.com/?p=96">Part 2</a> for a post on how to set up cron jobs to automatically call this script</p>
<p><strong>Other posts to come in the series:<br />
</strong>1. Selecting the hardware<br />
2. Installing the Operating System<br />
3. Setting up File systems &amp; Snapshots<br />
4. Allowing access through NFS &amp; SAMBA<br />
5. Setting up encrypted off-site backups<br />
6. Configuring Windows &amp; Linux clients to dump backup info to the FileServer<br />
7. My router setup, configuring IP tables &amp; torrents on a low-powered server.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/03/18/3-setting-up-filesystems-and-snapshots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2. Installing the Operating System</title>
		<link>http://www.scottyob.com/2011/03/16/2-installing-the-operating-system/</link>
		<comments>http://www.scottyob.com/2011/03/16/2-installing-the-operating-system/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 11:09:50 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[FileServer]]></category>
		<category><![CDATA[fileserver]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/03/17/2-installing-the-operating-system/</guid>
		<description><![CDATA[Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback Installing OS and setup Network For the following set of posts, I have chosen to use VirtualBox to run through how to use [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><strong><em>Note: This post is one in a series aimed to be a tutorial eventually, it’s not currently finalised and at the moment exists as a place for collating thought and collecting feedback</em></strong></p>
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<h2>Installing OS and setup Network</h2>
</p>
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">For the following set of posts, I have chosen to use VirtualBox to run through how to use ZFS in building your FileSystem. The first step is downloading and installing OpenIndiana. Get the latest build from <a href="http://openindiana.org/download/">http://openindiana.org/download/</a> (at the time of writing, I’m using oi-dev-148-x86) and install it onto your system. In VirtualBox I chose to install onto a 64 bit Solaris setup.</p>
<p style="clear: both">
<p style="clear: both">Make a hard disk when you’re setting up your VM image (I called mine OS_SSD1 because the HD is eventually going to be installed onto a solid state drive.) </p>
<p style="clear: both">
<p style="clear: both">Now, the VM is booted, we can start having some fun (SSH into it and Away we go)</p>
<p style="clear: both">
<p style="clear: both">Our first step is to setup the address for the box. I must admit, I’m pretty new to Solaris but from what I’ve found, we’ll run these commands to disable Auto Configuration via DHCP then enable our static config.</p>
<p style="clear: both">
<blockquote style="clear: both"><p>svcadm disable physical:nwam <br />svcadm enable physical:default</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">My fileserver is currently not on a domain (I’ll change this later), so I’ve added the line into my /etc/hosts file</p>
<p style="clear: both">
<blockquote style="clear: both"><p>10.12.1.1 thumper.local thumper</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Put your hostname that you want to use (‘thumper’ for me) in /etc/nodename</p>
<p style="clear: both">
<p style="clear: both">Your default gateway (routers) address should go in /etc/defaultrouter</p>
<p style="clear: both">
<p style="clear: both">The last thing to do is tell the host about what subnet it’s on, For me, I added (for my server subnet)</p>
<p style="clear: both">
<blockquote style="clear: both"><p>10.12.1.0 255.255.255.0</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">The next step is set up your nameserver for DNS (/etc/resolv.conf) mine looks like this</p>
<p style="clear: both">
<blockquote style="clear: both"><p>nameserver 10.12.1.254</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Copy /etc/nsswitch.dns to /etc/nsswitch.conf &#8211; so dns is used.</p>
<p style="clear: both">
<p style="clear: both">Now so the adaptor comes up on boot, find out the status of your network I/O by running</p>
<p style="clear: both">
<blockquote style="clear: both"><p>dladm show-link</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">(for me was e1000g0). Once you have this, you need to ‘plumbe” to set up the software in the kernel to set this interface on the TCP/IP stack.</p>
<p style="clear: both">
<blockquote style="clear: both"><p>ifconfig e100g0 plumb <br />echo 10.12.1.1/24 > /etc/hostname.e100g0</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">Last but not least for your network stack, </p>
<p style="clear: both">
<blockquote style="clear: both"><p>svcadm restart milestone/network</p>
</blockquote>
<p style="clear: both">
<p style="clear: both">From this point on, that concludes the base setup with networking that I’m using for the FileServer. If this happened to be a critical server for you, perhaps you’d consider setting up <a href="http://darkstar-solaris.blogspot.com/2008/09/zfs-root-mirror.html">redundant bootable drives with ZFS</a>. It looks pretty cool.</p>
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<h2>Setting up the storage pool</h2>
</p>
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">
<p style="clear: both">Now we can get into the fun part. The first thing I want to do with this server is be able to store my data on it, so lets set up our storage pool. In my VM I’m using to test this I’ve added the disks I want to include in my pool (1GB disks for this test)</p>
<p style="clear: both">
<p style="clear: both"><a href="http://www.scottyob.com/wp-content/uploads/2011/03/image.png" class="image-link"><img src="http://www.scottyob.com/wp-content/uploads/2011/03/image_thumb.png" height="377" width="487" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a>Once we’ve booted out VM (first thing I always do is ‘sudo bash’ because I’m evil in these silly little test environments). </p>
<p style="clear: both">
<p style="clear: both">I want to find out the device ID’s for these hard disks I just added</p>
<p style="clear: both">
<blockquote style="clear: both"><p style="clear: both">root@thumper:~# iostat -En | egrep Size\|Soft <br />c1t0d0 Soft Errors: 0 Hard Errors: 6 Transport Errors: 0 <br />Size: 0.00GB <0 bytes> <br />c1t1d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 <br />Size: 17.18GB <17179869184 bytes> <br />c1t2d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 <br />Size: 1.07GB <1073741824 bytes> <br />c1t3d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 <br />Size: 1.07GB <1073741824 bytes> <br />c1t4d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 <br />Size: 1.07GB <1073741824 bytes> <br />c1t5d0 Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 <br />Size: 1.07GB <1073741824 bytes> </p>
<p style="clear: both">
</blockquote>
<p style="clear: both">
<p style="clear: both">As we can see, c1t0d0 is my CD-ROM drive, c1t1d0 is my hard disk, so I’ll want to create a Raidz-2 (two redundant drive) storage pool with the drives c1t2d0 c1t3d0 c1t4d0 c1t5d0</p>
<p style="clear: both">
<blockquote style="clear: both"><p>root@thumper:~# <strong>zpool create datastore raidz2 c1t2d0 c1t3d0 c1t4d0 c1t5d0 <br /></strong>root@thumper:~# zpool list <br />NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT <br /><strong>datastore 3.94G 256K 3.94G 0% 1.00x ONLINE</strong> &#8211; <br />rpool 15.9G 4.17G 11.7G 26% 1.00x ONLINE &#8211; <br />root@thumper:~# zfs list <br />NAME USED AVAIL REFER MOUNTPOINT <br /><strong>datastore 128K 1.93G 44.8K /datastore <br /></strong>rpool 4.52G 11.1G 45K /rpool <br />rpool/ROOT 3.61G 11.1G 31K legacy <br />rpool/ROOT/openindiana 3.61G 11.1G 3.58G / <br />rpool/dump 383M 11.1G 383M &#8211; <br />rpool/export 1002K 11.1G 32K /export <br />rpool/export/home 970K 11.1G 32K /export/home <br />rpool/export/home/scott 938K 11.1G 938K /export/home/scott <br />rpool/swap 544M 11.5G 187M &#8211; </p>
</blockquote>
<p style="clear: both">
<p style="clear: both">We can see now we’ve created a pool of storage across our data (that’s zfs raided) that gives us double parity so we can loose two drives and still be running and we’ve got 2GB of usable space here (I’m using 1GB hard disks, in my real production box these will be 1TB disks).</p>
<p style="clear: both">
<p style="clear: both">Other posts to come in the series: <br />1. Selecting the hardware <br />2. Installing the Operating System <br />3. Setting up File systems &#038; Snapshots <br />4. Allowing access through NFS &#038; SAMBA <br />5. Setting up encrypted off-site backups <br />6. Configuring Windows &#038; Linux clients to dump backup info to the FileServer <br />7. My router setup, configuring IP tables &#038; torrents on a low-powered server.</p>
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/03/16/2-installing-the-operating-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1. Selecting the hardware – FileServer Project</title>
		<link>http://www.scottyob.com/2011/03/09/1-selecting-the-hardware-%e2%80%93-fileserver-project/</link>
		<comments>http://www.scottyob.com/2011/03/09/1-selecting-the-hardware-%e2%80%93-fileserver-project/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 11:08:45 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[FileServer]]></category>
		<category><![CDATA[nerd]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[ZFS]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/03/09/1-selecting-the-hardware-%e2%80%93-fileserver-project/</guid>
		<description><![CDATA[Note: This post is one in a series aimed to be a tutorial eventually, it&#8217;s not currently finalised and at the moment exists as a place for collating thought and collecting feedback This will be my first blog post into a guide of setting up a fileserver using Solaris (well, OpenIndiana) and ZFS to create [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><strong><em>Note: This post is one in a series aimed to be a tutorial eventually, it&#8217;s not currently finalised and at the moment exists as a place for collating thought and collecting feedback</em></strong></p>
<p>This will be my first blog post into a guide of setting up a fileserver using Solaris (well, OpenIndiana) and ZFS to create a fileserver that has a main purpose of being a reliable server (the focus on this build is more about reliability then throughput).</p>
<p style="clear: both"><a href="http://www.scottyob.com/wp-content/uploads/2011/03/arrays.jpg" class="image-link"><img class="linked-to-original" src="http://www.scottyob.com/wp-content/uploads/2011/03/arrays-thumb.jpg" height="201" align="right" width="235" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></a>My build will probably be different then most. One of the deciding factors in me choosing my hardware would have to be physical space and energy requirements. With this server, I’ve got this relatively unused space sitting behind my 27” monitor that is reserved for the box and as the primary purpose of this box is to backup and store my data in an effort to become paperless, the power requirements are going to be trying aimed at being energy efficient.</p>
<p style="clear: both">I have found a <a href="http://www.pccasegear.com/index.php?main_page=product_info&#038;cPath=25_1055&#038;products_id=14503">nice tower</a> that I’d like to use that is attractive for a few reasons. It will fit the space behind my monitor nicely but also comes with a very efficient power supply.</p>
<p style="clear: both">For the CPU, at the time of writing (March 2011), the new Sandy Bridge processors are looking like they give a big bang for your buck in terms of power usage. The only problem now is that I have to find a mini-itx motherboard that is compatible with the sandy bridge architecture (has to be mini-itx because of the form factor of the case) and has enough SATA ports (or the ability to expand to meet my requirements) and is compatible with OpenIndiana. So far, the best I&#8217;ve found is the the <a href="http://www.intel.com/products/desktop/motherboards/db-DH67CF/DH67CF-overview.htm">DH67CF</a>. Unfortunately for a fileserver that&#8217;s going to be hosting important information, this build won&#8217;t support ECC memory, which is pretty important as you can see <a href="http://www.nerdblog.com/2009/03/bitrot-huge-disks-and-raid.html">here</a> (probably a better article required to link there) but hopefully not regrettably, I&#8217;ll chose to risk it. </p>
<p style="clear: both">I’ve chosen to go with RAIDZ-2 to give two redundant hard disks in my data pool (with a total of 4 hard drives.) The reason being that if they are coming from the same batch then as hard disks stand, it’s likely that two will fail at more or less a similar time. It’s also worth mentioning for the critical data on my fileserver I’m going to be implementing remote off-site backups so while a dead pool will be frustrating, the likelihood of recovering some data should not be compromised.</p>
<p style="clear: both">I’ve decided that 2TB of storage should be sufficient for my requirements. For my storage array I’ve chosen to go with 4 1TB drives [[ToDo: Choose hard disks and why]] set up in Raidz-2.</p>
<p style="clear: both">Other things that I might require to put in are I/O expansion cards for more SATA drives.</p>
<p style="clear: both">Other posts to come in the series:<br />1. Selecting the hardware<br />2. Installing the Operating System<br />3. Setting up Snapshots<br />4. Allowing access through NFS &#038; SAMBA<br />5. Setting up encrypted off-site backups<br />6. Configuring Windows &#038; Linux clients to dump backup info to the FileServer<br />7. My router setup, configuring IP tables &#038; torrents on a low-powered server.</p>
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/03/09/1-selecting-the-hardware-%e2%80%93-fileserver-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Downloading HTTP in off-peak</title>
		<link>http://www.scottyob.com/2011/01/24/downloading-http-in-off-peak/</link>
		<comments>http://www.scottyob.com/2011/01/24/downloading-http-in-off-peak/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 00:38:18 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[nerd]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[wget]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/01/24/downloading-http-in-off-peak/</guid>
		<description><![CDATA[I want to write a quick and dirty blog post to tell you a little solution on downloading HTTP files in your off-peak usage using linux. The tools I’ll be using for this is my old favourite wget and a new tool, “at”. The at daemon is required to be running first, so on debian [...]]]></description>
			<content:encoded><![CDATA[<p>I want to write a quick and dirty blog post to tell you a little solution on downloading HTTP files in your off-peak usage using linux.</p>
<p>The tools I’ll be using for this is my old favourite <a href="http://www.gnu.org/software/wget/">wget</a> and a new tool, <a href="http://linux.about.com/library/cmd/blcmdl1_at.htm">“at”</a>.</p>
<p>The at daemon is required to be running first, so on debian or ubuntu</p>
<blockquote><p><font color="#484848">/etc/init.d/atd start</font></p>
</blockquote>
<p>Then downloading your file at an off-peak time (4am for me) is as simple as</p>
<blockquote><p><font color="#484848">echo “wget –c <a href="http://ubuntu.virginmedia.com/releases//maverick/ubuntu-10.10-desktop-i386.iso">http://ubuntu.virginmedia.com/releases//maverick/ubuntu-10.10-desktop-i386.iso</a>” | at 04:00</font></p>
</blockquote>
<p>Simple hey <img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.scottyob.com/wp-content/uploads/2011/01/wlEmoticon-smile.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/01/24/downloading-http-in-off-peak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF Automator in OSX</title>
		<link>http://www.scottyob.com/2011/01/16/pdf-automator-in-osx/</link>
		<comments>http://www.scottyob.com/2011/01/16/pdf-automator-in-osx/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 00:09:46 +0000</pubDate>
		<dc:creator>scottyob</dc:creator>
				<category><![CDATA[nerd]]></category>
		<category><![CDATA[OSX]]></category>

		<guid isPermaLink="false">http://www.scottyob.com/2011/01/16/pdf-automator-in-osx/</guid>
		<description><![CDATA[As you may have been aware from my previous blog posts, I&#8217;ve been trying to make my life digital, that means any papers I get, I scan and file on a FileServer (with remote backups, etc, etc). My scanner at home has a document feeder on it. The problem is that it doesn&#8217;t do duplex, [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both;">As you may have been aware from my previous blog posts, I&#8217;ve been trying to make my life digital, that means any papers I get, I scan and file on a FileServer (with remote backups, etc, etc).</p>
<p style="clear: both;">My scanner at home has a document feeder on it. The problem is that it doesn&#8217;t do duplex, only a set of sides. So far, I can scan one side of the document, flip the paper of, then scan the back pages. This will result two PDF&#8217;s with two sets of pages<br />
Set A: 1,3,5,7<br />
SET B: 8,6,4,2</p>
<p style="clear: both;">To merge the two, I could open them both up in Adobe PDF, Preview and start clicking and dragging my time away, but that&#8217;s pointless. I&#8217;d like to introduce you to Automator in OSX.</p>
<p style="clear: both;"><a class="image-link" href="http://www.scottyob.com/wp-content/uploads/2011/01/Merge_Duplex_PDFs.jpg"><img class="linked-to-original" style="text-align: center; display: block; margin: 0 auto 10px;" src="http://www.scottyob.com/wp-content/uploads/2011/01/Merge_Duplex_PDFs-thumb.jpg" alt="" width="380" height="314" /></a>Using a <a href="http://fredericiana.com/2010/03/01/pdftk-1-41-for-mac-os-x-10-6/">pdftk binary for OSX</a> and the automator script above, all I need to do now is select my two pdf documents (Set A &amp; B), right hand click, then select &#8216;Duplex Merge PDF&#8217;s&#8217;. After that, I&#8217;ll have a nice merged.pdf file on my desktop that&#8217;s the resulting page.</p>
<p style="clear: both;">(the shell script uses pdftk to make a /tmp/2.pdf file that&#8217;s a set 2,4,6,8. Copies the Set A to /tmp/1.pdf and then pipes it through some pdf tools built into OSX to merge the sets into 1,2,3,4.. etc</p>
<p style="clear: both;">Who needs to spend lots of money on a duplex scanner hey?</p>
<p><strong>EDIT:<br />
</strong>Please feel free to <a href="http://www.scottyob.com/wp-content/uploads/2011/01/osxDuplexAutomator.zip">download my automator scripts here </a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottyob.com/2011/01/16/pdf-automator-in-osx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

