<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5429435703174479765</id><updated>2012-02-16T19:05:32.972+10:00</updated><title type='text'>Picus Pickings</title><subtitle type='html'>&lt;p align="right"&gt;My place to store information that I will&lt;br&gt;soon forget but may wish that I hadn't.
&lt;p align="right"&gt;
&lt;a href="http://www.linkedin.com/in/agwood680303"&gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_viewmy_160x25.gif" width="160" height="25" border="0" alt="View Adrian Wood&amp;#39;s profile on LinkedIn"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-6035777063391088461</id><published>2011-03-24T21:55:00.003+10:00</published><updated>2011-03-24T22:20:55.993+10:00</updated><title type='text'>Elevate Runas using C#</title><content type='html'>Following on from my last post, I thought I'd share the equivalent for a non-PowerShell situation. In this case, I have a piece of C# code that when compiled into an executable allows elevation of an administrative account to full admin status.&lt;br /&gt;&lt;br /&gt;I'm sure that this has been done a number of ways, specifically, a more polished product is available in the PowerToys collection, I believe (See http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx). This has been provided for some knowledge sharing and as a reminder to me, hopefully someone finds it useful.&lt;br /&gt;&lt;br /&gt;Once compiled, I use elevate.exe as follows (assuming Elevate.exe is in c:\UserData\)...&lt;br /&gt;&lt;br /&gt;To run a pre-elevated command prompt, create a shortcut with a command line similar to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;C:\Windows\System32\runas.exe /u:mydomain\adminuser "c:\userdata\elevate.exe ""%SystemRoot%\system32\cmd.exe"""&lt;/pre&gt;Note the double quoting for correct passing of strings with spaces through two levels.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;References:&lt;br /&gt;&lt;/strong&gt;Adapted from PowerShell example at:&lt;br /&gt;http://stackoverflow.com/questions/1566969/showing-the-uac-prompt-in-powershell-if-the-action-requires-elevation&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;C# Source:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Security.Principal;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;&lt;br /&gt;namespace Elevate&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            if (args.Length &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                WindowsIdentity windowsID = WindowsIdentity.GetCurrent();&lt;br /&gt;                WindowsPrincipal principal = new WindowsPrincipal(windowsID);&lt;br /&gt;&lt;br /&gt;                if (principal.IsInRole(WindowsBuiltInRole.Administrator))&lt;br /&gt;                {&lt;br /&gt;                    Console.WriteLine("No elevation required, already running as an Admin!");&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                string psiArgs = "";&lt;br /&gt;                for (int i = 1; i &amp;lt; args.Length; i++)&lt;br /&gt;                {&lt;br /&gt;                    psiArgs = psiArgs + " " + args[i];&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                // Process.GetCurrentProcess().ProcessName&lt;br /&gt;                ProcessStartInfo psi = new ProcessStartInfo();&lt;br /&gt;&lt;br /&gt;                psi.FileName = args[0];&lt;br /&gt;                psi.Arguments = psiArgs;&lt;br /&gt;                psi.Verb = "runas";&lt;br /&gt;&lt;br /&gt;                try&lt;br /&gt;                {&lt;br /&gt;                    Process proc = Process.Start(psi);&lt;br /&gt;                }&lt;br /&gt;                catch (System.Exception e)&lt;br /&gt;                {&lt;br /&gt;                    Console.WriteLine(e.Message);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("No command-line provided - nothing to elevate!");&lt;br /&gt;                Console.WriteLine(Environment.NewLine + "Usage:" + Environment.NewLine);&lt;br /&gt;                Console.WriteLine("\t" + Process.GetCurrentProcess().ProcessName + " D:\\Path\\to\\CommandToRun.exe");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-6035777063391088461?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/6035777063391088461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=6035777063391088461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6035777063391088461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6035777063391088461'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2011/03/elevate-runas-using-c.html' title='Elevate Runas using C#'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-733953635497924485</id><published>2011-03-24T21:23:00.007+10:00</published><updated>2011-03-24T21:48:49.514+10:00</updated><title type='text'>Elevating Administrative Rights using PowerShell</title><content type='html'>I was a fan of RunAs.exe to achieve a form of compliance to the 'Principal of Least Privilege' under Windows XP. I worked on clerical things, browsing the internet etc, with a non-privileged account and I had my trusty privileged command prompt waiting for that inevitable call to arms. Since moving to Windows 7 recently (yes, I skipped the whole Vista thing), I was missing the ability to do all those little things that are denied from the command-line (try running handle.exe for instance).&lt;br /&gt;&lt;br /&gt;If you use PowerShell and don't want to be denied those little things that separate the administrator from the normal folk, read on.&lt;br /&gt;&lt;br /&gt;Oh, and I won't be getting into philosophical discussions about the right and wrong of an administrator doing the business of administering with privileges enabled - each to his own, I say.&lt;br /&gt;&lt;br /&gt;Anyway, to Launch an interactive PowerShell session with a fully enabled Administrative context:&lt;br /&gt;• Add the code below to the profile of the administrative user (e.g. mydomain\adminuser)&lt;br /&gt;• Start the powershell session using "RunAs.exe /u:mydomain\adminuser "&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Profile Code Starts here&lt;br /&gt;#&lt;br /&gt;function Check-IsAdmin()&lt;br /&gt;{&lt;br /&gt;#reference: http://www.interact-sw.co.uk/iangblog/2007/02/09/pshdetectelevation&lt;br /&gt;#reference: http://www.leastprivilege.com/AdminTitleBarForPowerShell.aspx&lt;br /&gt;&lt;br /&gt;  # Get the Current User's Security Token&lt;br /&gt;  $windowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()&lt;br /&gt;  $principal=new-object System.Security.Principal.WindowsPrincipal($windowsID)&lt;br /&gt;  &lt;br /&gt;  # Check if it has the Administrator access enabled&lt;br /&gt;  return [bool]$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Invoke-Admin() &lt;br /&gt;{&lt;br /&gt;#reference: http://stackoverflow.com/questions/1566969/showing-the-uac-prompt-in-powershell-if-the-action-requires-elevation&lt;br /&gt;&lt;br /&gt;    param ( [string]$program = $(throw "Please specify a program" ),&lt;br /&gt;            [string]$argumentString = "",&lt;br /&gt;            [switch]$waitForExit )&lt;br /&gt;&lt;br /&gt;    $psi = new-object "Diagnostics.ProcessStartInfo"&lt;br /&gt;    $psi.FileName = $program &lt;br /&gt;    $psi.Arguments = $argumentString&lt;br /&gt;    $psi.Verb = "runas"&lt;br /&gt; &lt;br /&gt;    $proc = [Diagnostics.Process]::Start($psi)&lt;br /&gt;    if ( $waitForExit ) {&lt;br /&gt;        $proc.WaitForExit()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Activate Elevated privilege if not already done&lt;br /&gt;if ( (check-isadmin).Equals($false) )&lt;br /&gt;{&lt;br /&gt; Invoke-Admin $(Get-Command powershell.exe).Path&lt;br /&gt; $host.SetShouldExit(0)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-733953635497924485?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/733953635497924485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=733953635497924485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/733953635497924485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/733953635497924485'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2011/03/elevating-administrative-rights-using.html' title='Elevating Administrative Rights using PowerShell'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-5366460778518762263</id><published>2011-03-08T21:58:00.009+10:00</published><updated>2011-03-08T22:50:47.770+10:00</updated><title type='text'>PowerShell's [adsisearcher] FindAll Exposed</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;I've been dabbling with PowerShell for some time but haven’t really got my head into it - mainly because I haven't been working in an environment where I can get the most advantage from it. I've decided to bite the bullet and make PowerShell my new best friend. The first thing I needed to do was to search Active Directory - there's not much point doing things by halves and only working on my local workstation.&lt;br /&gt;&lt;br /&gt;I was initially a little puzzled by the various blogs that I read on the subject, most of which only give a passing treatment of the use of the [adsisearcher] accelerator and the associated .NET Class, particularly when it comes to what is retrieved. Most discussions that I've read imply that the searcher returns only a Path attribute, requiring a second call to retrieve the content of the properties that are teasingly referred to when you do a pipe to Get-Member.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Getting Active &lt;/strong&gt;&lt;br /&gt;So, what's the real story, how can a person dive in, grab all that goodness from Active Directory and move on to the rest of the day in the quickest possible way? Well, I'm not sure If this is the actual quickest way but it works pretty well for me…&lt;br /&gt;&lt;br /&gt;In case you're not familiar with PowerShell's [adsisearcher], we should get a few things straight before we get to the example.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;First, what is [adsisearcher] - simply put, it's a shortcut to accessing a .NET library class (System.DirectoryServices.DirectorySearcher) and is referred to as an accelerator.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Accelerating&lt;/strong&gt;&lt;br /&gt;To see why accelerators are handy and to get a list of all the accelerators that are defined in your PowerShell session, type:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;pre&gt;[System.Type]::GetType("System.Management.Automation.TypeAccelerators")::Get&lt;/pre&gt;Now try entering the following (all on one line): &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;pre&gt;[System.Type]::GetType("System.Management.Automation.TypeAccelerators")::Add("accelerators", [type]::GetType("System.Management.Automation.TypeAccelerators")) &lt;/pre&gt;&lt;/span&gt;What we just did was add a new accelerator to give us a shortcut to the Accelerators function call. Now, to get a list of accelerators, type:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[accelerators]::Get&lt;/pre&gt;And to add a new accelerator, try:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[accelerators]::Add("psping","System.Net.NetworkInformation.Ping")&lt;/pre&gt;Isn't that much easier? OK, yes, a little off-track, but good to know!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Searching... &lt;/strong&gt;&lt;br /&gt;Next, lets look at what information you need to provide to get the results that you're after. The main things that you need to know to get 'what you want to know' are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A query string to define what objects from the Active Directory you want to find.&lt;/li&gt;&lt;li&gt;A list of attributes from the Active Directory objects that you want see.&lt;/li&gt;&lt;li&gt;In a multi-domain environment, you may also want to specifically choose which domain to search as well. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;How about we use an example and assume we want to get a list of computer names from the Active Directory? To achieve this we need to feed an LDAP query to [adsisearcher] that describes what we want - something like this is a good starting point: &lt;pre&gt;objectClass=Computer&lt;/pre&gt;I say starting point because, as far as a query string goes, it's a little broad for an Enterprise scale environment. Do we really want 'all the computers' in the AD? Personally, I'm a server infrastructure type of guy, so what I really want is all the servers in the domain, so I might use:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(&amp;amp;(objectClass=Computer)(operatingSystem=Windows Server*))&lt;/pre&gt;The query string shown above will return all AD objects that are 'Computer' objects that have a 'Windows Server' Operating System installed.&lt;br /&gt;&lt;br /&gt;So to start using the [adsisearcher] accelerator you could use:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$searcher = [adsisearcher]"(&amp;amp;(objectClass=Computer)(operatingSystem=Windows Server*))"&lt;/pre&gt;&lt;strong&gt;Searching Efficiently!&lt;/strong&gt;&lt;br /&gt;So now we get down to the pointy end of the business - it's not good enough to just pull back everything there is to know about the computers in the domain, we need to get specific. By specifying the particular attributes that you want to know about, you save yourself some processing and network bandwidth . Also, other tutorials advocate the use of the 'Path' attribute to re-query the Active Directory to get a reference to an AD object using something like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$searcher.FindAll() ForEach { ([adsi]$_.path).cn }&lt;/pre&gt;The above is &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;not&lt;/span&gt; &lt;/strong&gt;recommended as it is performing a query to find all the objects that match the specified query string (i.e. the filter) and then for each object that it found, perform another lookup to retrieve the cn (i.e. the canonical or common name) of the object . So for a Windows Domain with 1000 servers, perform 1001 directory lookups - ouch!&lt;br /&gt;&lt;br /&gt;A better way to achieve the above is to use the 'PropertiesToLoad' attribute of the [adsisearcher] class. Simply provide a list of attributes that you want included in the results of the search. Either a single value (e.g. cn) or , if required, a comma separated string can be used. The results of the FindAll() method will be a collection of objects with Path and Properties attributes. The Properties attribute of the result collection is itself a collection that corresponds to the values of the AD Object properties.&lt;br /&gt;&lt;br /&gt;Putting it all together, we get:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Query the AD for a list of computers running a Windows Server OS&lt;br /&gt;$searcher = [adsisearcher]"(&amp;amp;(objectClass=Computer)(operatingSystem=Windows Server*))"&lt;br /&gt;&lt;br /&gt;#Add cn to the default ADsPath property in the result set&lt;br /&gt;$searcher.PropertiesToLoad.Add("cn")&lt;br /&gt;&lt;br /&gt;# Loop through the result collection and display the cn property&lt;br /&gt;$searcher.FindAll() ForEach { $_.Properties["cn"] }&lt;/pre&gt;The most important point about the above is that only one query is performed and all required results can be returned in one efficient AD access.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Multiple Domains&lt;/strong&gt;&lt;br /&gt;Coming from a multi-domain environment, I just have to mention the 'SearchRoot' property of the [adsisearcher]. By default, the logged-on user's domain and credentials are used to connect to the Active Directory. To change set focus to the 'mydomain.local' domain before invoking the FindAll method, do something like:&lt;/p&gt;&lt;pre&gt;$searcher.SearchRoot=[adsi]"LDAP://dc=mydomain,dc=local"&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LDAP Syntax&lt;/strong&gt;&lt;br /&gt;For more information on the LDAP syntax used by [adsisearcher], see the '&lt;a href="http://download.microsoft.com/download/3/d/3/3d32b0cd-581c-4574-8a27-67e89c206a54/uldap.doc"&gt;Understanding LDAP&lt;/a&gt;' white paper that gives a comprehensive description of all the elements.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;References:&lt;/strong&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/tags/active+directory/searching+active+directory/"&gt;The Scripting Guys &lt;/a&gt;- practical examples of Searching active Directory.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tfl09.blogspot.com/2008/12/type-accelerators-for-powershell-ctp3.html"&gt;Under the Stairs &lt;/a&gt;- Type Accelerators, handy cmdlet function. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-5366460778518762263?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/5366460778518762263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=5366460778518762263' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/5366460778518762263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/5366460778518762263'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2011/03/powershells-adsisearcher-findall.html' title='PowerShell&apos;s [adsisearcher] FindAll Exposed'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-3201820903515376237</id><published>2010-06-01T21:42:00.009+10:00</published><updated>2010-08-13T17:39:27.592+10:00</updated><title type='text'>Slashed tmp and killed the cluster</title><content type='html'>&lt;h2&gt;A call for help&lt;/h2&gt;&lt;br /&gt;I was asked today to help with diagnosis of a Cluster Resource Group on a Solaris 10 host after the Oracle service shutdown unexpectedly.&lt;br /&gt;&lt;br /&gt;Quick as a flash I checked /var/adm/messages to find that the Resource Group went off-line after the monitor process detected an Oracle fault condition as described by this log entry:&lt;br /&gt;&lt;blockquote&gt;Fault monitor detected error DBMS_ERROR: 4030 DEFAULT Action=RESTART&lt;/blockquote&gt;Intuitively, I guessed that DBMS_ERROR 4030 must be the Oracle error 'ORA-04030' which appears to be correct. A quick google and I have the answer from &lt;a href="http://searchoracle.techtarget.com/answer/ORA-04030-Out-of-process-memory"&gt;techtarget.com&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;How to avoid the ORA-04030 error? It is out of process memory when trying to allocate 2457618 bytes. Please tell me what system parameters need to be changed.&lt;br /&gt;The ORA-04030 error is telling you that an Oracle process has requested memory from the operating system but the OS does not have any memory to give. Possible solutions include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adding more physical memory (RAM) to the database server. &lt;/li&gt;&lt;li&gt;Increasing the temp space on your database server and/or verifying that your temp disk is not full. &lt;/li&gt;&lt;li&gt;Decreasing your database footprint so that it uses less memory. You may want to decrease the SHARED_POOL_SIZE and DB_CACHE_SIZE initialization parameters.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;h2&gt;Thanks, but no thanks...&lt;/h2&gt;The above is the answer I returned to my colleague, who was less than impressed as it didn't satisfy the question of what actually happened. He went on to point out that there were other errors related to /tmp being full and "wasn't that somehow related?".&lt;br /&gt;&lt;br /&gt;Ok he has a point, maybe there's more to this - so back to the drawing board. Putting it all together, I think I've nutted the problem out (my sincere apologies if this is elementary)...&lt;br /&gt;&lt;br /&gt;The cluster consists of a collection of zones/containers with Oracle instances running inside. Originally, the implementor chose to have a separate set of static containers on each cluster node with resources failing between them. Each of the containers has a /tmp mounted on the tmpfs filesystem which is of course mapped to swap. To many large files in /tmp actually causes swap starvation and we soon found that this has an incredibly fast and negative reaction on the stability of the cluster.&lt;br /&gt;&lt;h2&gt;Almost there&lt;/h2&gt;To correct the issue, we've added the 'size=2048' option to the vfstab entry for the swap and dynamically resized the /tmp. So here it is - my point at last - I found some very tricky notes on how to resize /tmp on the tmpfs filesystem dynamically without a reboot even.&lt;br /&gt;&lt;br /&gt;This is very likely unsupported, and I don't know what it might kill but in our situation, there is no way we are going to get an outage to reboot all of the systems to consistently implement this limit. It turns out that this has caused failures in the past that no-one could quite put a finger on.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://ilapstech.blogspot.com/2009/11/grow-tmp-filesystem-tmpfs-on-line-under.html"&gt;Ilap's tech: Grow /tmp Filesystem (TMPFS) on-line under Solaris 10&lt;/a&gt; for the original low-down of how this all works. If you're game (please test it on your own before doing anything rash on a production environment), here's a script to ease setting a size limit for /tmp within a zone (run from the global zone):&lt;br /&gt;&lt;table border="0" width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="BACKGROUND-COLOR: rgb(255,255,153); FONT-FAMILY: 'Courier New'; FONT-SIZE: smaller"&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;# Define the required quota as the hex value derived from:&lt;br /&gt;# (No. of GB x 1024 x 1024 / 8)&lt;br /&gt;#&lt;br /&gt;TMP_QUOTA="0x40000"&lt;br /&gt;TMP_UNLIMITED="0xffffffffffffffff"&lt;br /&gt;&lt;br /&gt;function getMaxAddress {&lt;br /&gt;echo "$1::print vfs_t vfs_data ::print -ta struct tmount tm_anonmax" mdb -k awk '{ print $1 }'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IFS="&lt;br /&gt;"&lt;br /&gt;set -A mountPtrs "`echo "::fsinfo" mdb -k grep "root/tmp" grep "tmpfs" awk '{ print $1 }'`"&lt;br /&gt;&lt;br /&gt;for mountPtr in ${mountPtrs}; do&lt;br /&gt;maxAddress=$(getMaxAddress ${mountPtr})&lt;br /&gt;&lt;br /&gt;# Uncomment the following to set the value&lt;br /&gt;#echo "${maxAddress}/Z ${TMP_QUOTA}" mdb -kw&lt;br /&gt;&lt;br /&gt;# Uncomment the following to read back the value&lt;br /&gt;#echo "${maxAddress}/J" mdb -k&lt;br /&gt;done&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-3201820903515376237?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/3201820903515376237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=3201820903515376237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/3201820903515376237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/3201820903515376237'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/06/slashed-tmp-and-killed-cluster.html' title='Slashed tmp and killed the cluster'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-3750634957385208745</id><published>2010-05-27T08:56:00.013+10:00</published><updated>2010-05-27T11:54:13.025+10:00</updated><title type='text'>Oracle Startup Scripts</title><content type='html'>Please note that this post has no original work of my own - I am posting this because I found it to be a useful example of a set of KSH scripts that save a lot of fiddly work starting Oracle instances.  The scripts are used to automatically start Oracle instances on Solaris 9 and HP-UX and were originally created by a colleague.&lt;br /&gt;&lt;h2&gt;Script 1 - Start them all...&lt;/h2&gt;This script is the controlling script that parses the oratab file to locate all instances that are 'enabled'.  Enabled means that there is a 'Y' in the last column.&lt;br /&gt;&lt;div  style="color:dodgerblue;"&gt;&lt;br /&gt;&lt;table width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding: 5px; vertical-align: top;"&gt;&lt;span style="font-weight: bold;"&gt;NOTE:&lt;/span&gt;&lt;/td&gt;&lt;td style="padding: 5px; vertical-align: top;"&gt;Both of the scripts shown here require that the oratab file is correctly formatted and maintained, the listener is called LSNR_%SID% and the owner of the Oracle binaries is the database owner or 'service account'.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;table border="0" width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: rgb(255, 255, 153); font-family: 'Courier New'; font-size: smaller;"&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;#&lt;br /&gt;#  Start/Restart all instances.&lt;br /&gt;#&lt;br /&gt;ORATAB=/var/opt/oracle/oratab&lt;br /&gt;&lt;br /&gt;if [[ ! -f $ORATAB ]]; then&lt;br /&gt;echo "Oracle not configured on this host."&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;# Produce list SIDs - exclude SIDs where autostart is 'N'&lt;br /&gt;ORA_SIDS=`grep -v ^\# ${ORATAB} | awk -F':' ' $3 !~ /N/ {printf("%s ",$1);}'`&lt;br /&gt;&lt;br /&gt;# Start each SID 1 at a time&lt;br /&gt;  for SID in ${ORA_SIDS}; do&lt;br /&gt;    # Determine ORACLE_HOME&lt;br /&gt;    ORACLE_HOME=`grep "^${SID}:" ${ORATAB} | awk -F':' '{printf("%s",$2)}'`&lt;br /&gt;    export ORACLE_HOME&lt;br /&gt;    if [[ -d ${ORACLE_HOME} ]]; then&lt;br /&gt;        ORACLE_OWNER=`ls -l ${ORACLE_HOME}/bin/oracle | awk '{print $3}'`&lt;br /&gt;        export  ORACLE_OWNER&lt;br /&gt;&lt;br /&gt;        # Is this instance still running&lt;br /&gt;        NUM_PROCS=`ps -ef | grep -v grep | grep -i ora_pmon_${SID}$ | wc -l`&lt;br /&gt;        if [[ ${NUM_PROCS} -ne 0 ]]; then&lt;br /&gt;           echo "`date` ERROR: Need to manually shutdown $SID"&lt;br /&gt;        else&lt;br /&gt;           # Start SID&lt;br /&gt;           ORACLE_SID=$SID&lt;br /&gt;           export ORACLE_SID&lt;br /&gt;           su $ORACLE_OWNER -c "`dirname $0`/ora_start_sid $SID"&lt;br /&gt;        fi&lt;br /&gt;    fi&lt;br /&gt;  done&lt;br /&gt;fi&lt;br /&gt;#&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h2&gt;Script 2 - Start an instance&lt;/h2&gt;This script is called by the above to start an individual named oracle instance - it can also be used separately to do the same.&lt;br /&gt;&lt;table border="0" width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: rgb(255, 255, 153); font-family: 'Courier New'; font-size: smaller;"&gt;&lt;br /&gt;#!/bin/ksh&lt;br /&gt;#&lt;br /&gt;#       Start any Oracle Instance.&lt;br /&gt;#&lt;br /&gt;#       Parameter 1 (opt) oracle_sid&lt;br /&gt;#                 2 (opt) startup in progress flag&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;ORATAB=/var/opt/oracle/oratab&lt;br /&gt;&lt;br /&gt;# Use the current sid if not specifically provided&lt;br /&gt;if [[ $1 != "" ]]; then&lt;br /&gt;ORACLE_SID=$1&lt;br /&gt;export ORACLE_SID&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# Set required Oracle Environment variables&lt;br /&gt;ORACLE_HOME=`grep "^${ORACLE_SID}:" ${ORATAB} | awk -F':' '{printf("%s",$2)}'`&lt;br /&gt;export ORACLE_HOME&lt;br /&gt;ORACLE_OWNER=`ls -l $ORACLE_HOME/bin/sqlplus | awk '{print $3}'`&lt;br /&gt;export ORACLE_OWNER&lt;br /&gt;ORACLE_BASE=`echo $ORACLE_HOME | cut -d "/" -f 1-3`&lt;br /&gt;export ORACLE_BASE&lt;br /&gt;&lt;br /&gt;# Assume if an instance specific version of the listener.ora exists it's the right one.&lt;br /&gt;if [[ -f ${ORACLE_HOME}/network/admin/listener.ora ]]; then&lt;br /&gt;TNS_ADMIN=${ORACLE_HOME}/network/admin&lt;br /&gt;export TNS_ADMIN&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# if we are root - call self and run as correct user&lt;br /&gt;if [[ "`id -u`" -eq 0 ]]; then&lt;br /&gt;su $ORACLE_OWNER -c "$0 $1 $2"&lt;br /&gt;exit&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# set defaults&lt;br /&gt;umask 2&lt;br /&gt;JOB_ST=0&lt;br /&gt;&lt;br /&gt;# Set up flag and use as temp file&lt;br /&gt;if [[ $2 != "" ]]; then&lt;br /&gt;TMP=$2&lt;br /&gt;touch $2&lt;br /&gt;else&lt;br /&gt;TMP=/tmp/oradata.$$&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# put the correct Oracle_home first in the path just in case.&lt;br /&gt;PATH=${ORACLE_HOME}/bin:${PATH}&lt;br /&gt;&lt;br /&gt;# Determine the correct connection method (svrmgrl does not exist in Oracle 9)&lt;br /&gt;if [[ -f $ORACLE_HOME/bin/svrmgrl ]]; then&lt;br /&gt;SQLDBA=$ORACLE_HOME/bin/svrmgrl&lt;br /&gt;CONNECTSTR="connect internal"&lt;br /&gt;else&lt;br /&gt;SQLDBA="$ORACLE_HOME/bin/sqlplus /nolog"&lt;br /&gt;CONNECTSTR="connect / as sysdba"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;echo "`date` Starting Oracle Instance ${ORACLE_SID}"&lt;br /&gt;$SQLDBA &lt;&lt;&gt; $TMP&lt;br /&gt;$CONNECTSTR&lt;br /&gt;startup&lt;br /&gt;exit;&lt;br /&gt;_EOF_&lt;br /&gt;&lt;br /&gt;# Check logs&lt;br /&gt;grep  'ORA-' $TMP &gt; /dev/null&lt;br /&gt;if [[ $? -eq 0 ]]; then&lt;br /&gt;echo "ERROR-Starting ${ORACLE_SID}."&lt;br /&gt;cat $TMP&lt;br /&gt;JOB_ST=1&lt;br /&gt;else&lt;br /&gt;echo "`date` Oracle Database ${ORACLE_SID} started successfully"&lt;br /&gt;$ORACLE_HOME/bin/lsnrctl start LSNR_${ORACLE_SID}&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# Start dbconsole (Oracle10.x)&lt;br /&gt;ls -d $ORACLE_HOME | grep -E '10.1|10.2' &gt; /dev/null&lt;br /&gt;if [[ $? -eq 0 ]]; then&lt;br /&gt;echo "Starting Oracle EM dbconsole"&lt;br /&gt;$ORACLE_HOME/bin/emctl resetTZ agent&lt;br /&gt;$ORACLE_HOME/bin/emctl start dbconsole&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;#       Cleanup and exit&lt;br /&gt;rm -f $TMP&lt;br /&gt;exit $JOB_ST&lt;br /&gt;#&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-3750634957385208745?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/3750634957385208745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=3750634957385208745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/3750634957385208745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/3750634957385208745'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/05/oracle-startup-scripts.html' title='Oracle Startup Scripts'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-8182958112225065224</id><published>2010-05-23T18:37:00.010+10:00</published><updated>2010-05-23T23:16:00.432+10:00</updated><title type='text'>Replicated Hitachi SAN Storage for Microsoft Fail-over Clusters</title><content type='html'>&lt;h2&gt;Introduction &lt;/h2&gt;This article describes the method used to implement a stretch cluster, built on top of a Microsoft Windows 2003 Server connected to an HDS SAN.&lt;br /&gt;&lt;br /&gt;The term 'Stretch Cluster' describes the situation where the storage behind the Cluster Disk Resource(s) is replicated to a SAN at a separate site. By separating the cluster nodes between sites and replicating the back-end storage to a SAN Array local to each node, a higher level of availability can be achieved.&lt;br /&gt;&lt;br /&gt;The method used to replicate storage is very much dependent on the tools provided by the storage vendor and usually come with some associated licensing or consultation costs.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;History&lt;/h2&gt;A few years back, our company looked at the prospect of modifying our Microsoft Cluster design to include 'Stretch Clusters' to provide high-availability for the file and print servers. Initially, the applications was deemed to be unimportant and not requiring the extra costs associated with the Tier 1 storage and Truecopy licenses required.&lt;br /&gt;&lt;br /&gt;With the explosion of storage requirements for file and print and other clustered applications within the organisation, the situation was recently reviewed. I had seen a colleague implement the concept on HP-UX and also personally configured the same thing for a Solaris cluster, so thought it wouldn't be too difficult. I was right and wrong at the same time...&lt;br /&gt;&lt;br /&gt;The HP-UX implementation was built using custom scripts, where Solaris has built-in support for HDS and EMC. Both Operating Systems have there challenges and Windows is no exception.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Connecting the Dots&lt;/h2&gt;There are a number of ways to achieve the functionality we required, but for flexibility and ease of implementation, a solution based on a custom 'Generic Script' resource was devised.&lt;br /&gt;&lt;br /&gt;I'm assuming that the reader is familiar with most of the building blocks required to build a cluster with replicated, SAN attached storage. Typically, connecting to the secondary copy of the replicated storage is a manual process that is included in a backup or some recovery procedure. What a stretch cluster provides is automatic fail-over to the replicated storage, and reversal of the replication stream to make the LUNs writable at the active end after fail-over.&lt;br /&gt;&lt;br /&gt;Essentially, the steps include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Configure a basic cluster with shared storage on a single SAN Array (not covered here)&lt;/li&gt;&lt;li&gt;Add replicated LUNS using the usual truecopy configuration for your HDS SAN (also, not covered here)&lt;/li&gt;&lt;li&gt;Write a Generic Script Resource handler to manage the interactions with the SAN&lt;/li&gt;&lt;li&gt;Add the Generic Script Resource to the same Resource Group as one or 'Physical Disk' resources backed by replicated SAN storage.&lt;/li&gt;&lt;li&gt;Make the 'Physical Disk' resource(s) with a dependency on the Generic Script resource. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Writing a VBScript Based Resource Handler&lt;/h2&gt;The Microsoft notes on creating a Script Resource are included in the References section below and I don't want to go over the same content. What I would like to share is the main pitfalls that snagged my first attempt at this and some tips to manage them.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pitfall #1 - Over-confidence&lt;br /&gt;I decided it was simple before I began and launched into a full-featured prototype that I tested as a stand-alone script. The idea was that I would make it work and then just plug it in - hey presto! Trust me on this - start simple and work your way up.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pitfall #2 - The 'WScript' Object&lt;br /&gt;Having written a lot of VBScript over the years, I am very comfortable with WScript.Sleep, WScript.CreateObject, WScript.Echo etc... The &lt;a href="http://msdn.microsoft.com/en-us/library/at5ydy31(VS.85).aspx"&gt;WScript Object&lt;/a&gt; does not exist.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE&lt;/b&gt;: This is not to say that you can't use 'set x = CreateObject("WScript.Shell")', because you can - instantiating other objects is a whole other thing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pitfall #3 - The KISS principal&lt;br /&gt;This is along the lines of Pitfall #1 with a more specific target - keep things simple in regard to global declarations at the top of the Script.  Using constructs like:&lt;br /&gt;&lt;br /&gt;Dim A : A = "Hello World"&lt;br /&gt;&lt;br /&gt;are allowed in VBScript if you want to save some space, but it doesn't seem to work under the Generic Script Resource parser.&lt;br /&gt;&lt;br /&gt;If your find that you can't even create the script resource in the Cluster Administration utility and are getting an error #80020009, you've either got syntax errors or are using something 'tricky' like the above.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pitfall #4 - Logging&lt;br /&gt;Use the cluster log effectively and watch it closely when attempting to create or change the state of your shiny new resource script. The &lt;b&gt;Resource.LogInformation&lt;/b&gt; in-built function allows you to write directly to the cluster log as defined in your cluster configuration.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE&lt;/b&gt;: By default the cluster log entries are written to &lt;i&gt;C:\Windows\Cluster\cluster.log&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The End Result&lt;/h2&gt;&lt;br /&gt;The end result of all my labour comes in the form of a Windows Script Component to encapsulate the HDS horcm CCI utiliy logic (this is the command-line interface into HDS Storage) and a 'Generic Script Resource' handler script.&lt;br /&gt;&lt;br /&gt;Most of the horcm logic is ported from the HP-UX solution that has been running for years in a production environment, so the concept is well tested.&lt;br /&gt;&lt;br /&gt;None of the supplied scripts have any warranty or implied fit for purpose - feel free to use them as examples of how similar tasks might be done in your environment.&lt;br /&gt;&lt;br /&gt;Download wcsTCutil components from &lt;a href='http://sites.google.com/site/picuspickings/wcstcutil'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;References&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.sun.com/app/docs/doc/820-4679/gfltk?a=view"&gt;Configure replicated Storage on Solaris Clusters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa373089(v=VS.85).aspx"&gt;Using the Generic Script Resource Type&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-8182958112225065224?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/8182958112225065224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=8182958112225065224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8182958112225065224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8182958112225065224'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/05/replicated-hitachi-san-storage-for.html' title='Replicated Hitachi SAN Storage for Microsoft Fail-over Clusters'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-6541083256067733969</id><published>2010-02-27T10:25:00.003+10:00</published><updated>2010-02-27T10:35:19.585+10:00</updated><title type='text'>Who's doing what to whom</title><content type='html'>While 'playing' around with the Resource Pools facility of Solaris 10, I restarted the pools and pools/dynamic services to see the effect.  Not surprisingly, all the zones that had an associated resource pool were reset to use the default pool.  Not such a bad thing in the context of a lightly loaded test machine - a heavily used production system may have a different impact.&lt;br /&gt;&lt;br /&gt;To reset the pools to the original configuration is easy enough using the &lt;em&gt;poolbind&lt;/em&gt; command:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;poolbind -p Zone_pool -i zoneid myzone&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;What I didn't see straight away was how to answer the question 'Which resource pool(i.e. which processor set) is associated with each zone at the moment?'.  The answer can be found using the command:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;ps -eZ -o zone,pset | sort -u&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The above command lists the zone and pset (processor set) fields for each process and then removes duplicates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-6541083256067733969?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/6541083256067733969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=6541083256067733969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6541083256067733969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6541083256067733969'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/02/whos-doing-what-to-whom.html' title='Who&apos;s doing what to whom'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-4239579300815760225</id><published>2010-01-24T23:04:00.009+10:00</published><updated>2010-01-26T21:25:19.349+10:00</updated><title type='text'>Alarm, Alarm!!! - Solaris Swap is exhausted - Part 2</title><content type='html'>&lt;u&gt;The Test&lt;/u&gt;&lt;br /&gt;In &lt;a href="http://picuspickings.blogspot.com/2010/01/alarm-alarm-solaris-swap-is-exhausted.html"&gt;Part 1&lt;/a&gt; of this topic, I stated that I did some testing.  The testing was to confirm the state of swap on a Solaris host and validate the use of specific SNMP values to correctly monitor when swap was exhausted.&lt;br /&gt;&lt;br /&gt;Read on to see how this was done and why it's good to do your own testing and see that documentation is not always the last word.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;The environment&lt;/u&gt;&lt;br /&gt;All of the hosts used are virtual hosts running on &lt;a href="http://www.vmware.com"&gt;VMWare&lt;/a&gt; Server which may be limiting in some load testing scenarios.  In this case it's good enough and quite easy to exhaust available memory.&lt;br /&gt;&lt;br /&gt;The monitoring host is a CentOS 5.4 installation with net-snmp, net-snmp-libs and net-snmp-utils installed.  This could be any operating system running &lt;a href="www.net-snmp.org"&gt;Net-SNMP&lt;/a&gt;, I used CentOS as that's where I am installing Nagios and it has the &lt;a href="http://linux.die.net/man/1/watch"&gt;watch&lt;/a&gt; utility installed.&lt;br /&gt;&lt;br /&gt;The monitored host has OpenSolaris snv_111b installed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Testing&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Start two separate sessions on the monitored OpenSolaris host and one on the CentOS host to remotely observe the SNMP results.&lt;br /&gt;&lt;br /&gt;On the CentOS host run:&lt;br /&gt;&lt;code&gt;watch snmpwalk -v2c -c public sol .1.3.6.1.4.1.2021.4&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;On one of the OpenSolaris hosts, run:&lt;br /&gt;&lt;code&gt;vmstat -S 5 2000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, to consume the memory on the OpenSolaris host, I use variations of:&lt;br /&gt;&lt;code&gt;stress --vm 1 --vm-bytes 640M -v&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As I only have 512MB allocated to my virtual machine, 640M is adequate to stress the host.  Increase the vm or vm-bytes values to start more processes or use more memory for each process respectively.  If you find that the command fails, you're probably using too much memory or creating too many processes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Results&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Watching the various screens you should see the following things happening:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;memTotalFree.0&lt;/em&gt; will track vmstat's &lt;em&gt;swap&lt;/em&gt; &lt;br /&gt;&lt;li&gt;&lt;em&gt;memAvailReal.0&lt;/em&gt; will track vmstat's &lt;em&gt;free&lt;/em&gt; value.&lt;br /&gt;&lt;li&gt;When vmstat's &lt;em&gt;swap&lt;/em&gt; and memTotalFree drop below the &lt;em&gt;memMinimumSwap.0&lt;/em&gt; threshold, the flag &lt;em&gt;memSwapError.0&lt;/em&gt; is set to 1 and the &lt;em&gt;memSwapErrorMsg.0&lt;/em&gt; states that the system is running out of swap space.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;According to the documentation for vmstat and Net-SNMP:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;swap is available swap space (Kbytes)&lt;br /&gt;&lt;li&gt;free is the size of the free list (Kbytes)&lt;br /&gt;&lt;li&gt;memTotalFree is &lt;blockquote&gt;The total amount of memory free or available for use on this host.  This value typically covers both real memory and swap space or virtual memory.&lt;/blockquote&gt;.&lt;br /&gt;&lt;li&gt;memAvailReal is &lt;blockquote&gt;The amount of real/physical memory currently unused&lt;br /&gt;or available.&lt;/blockquote&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;These numbers don't appear to line up for me, maybe they do on different combinations of versions or platforms.  Feel free to comment if you have some revelations.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;References&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weather.ou.edu/~apw/projects/stress/"&gt;Stress Testing Tool called 'stress'&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://centos.org"&gt;CentOS&lt;/a&gt; is a derivative of &lt;a href="http://redhat.com"&gt;Red Hat&lt;/a&gt; Linux.&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.opensolaris.org"&gt;OpenSolaris&lt;/a&gt; is a &lt;a href="http://www.sun.com"&gt;Sun Microsystems&lt;/a&gt; OpenSource Project.&lt;br /&gt;&lt;li&gt;&lt;a href="http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html"&gt;Net-SNMP ucdavis MIB reference&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-4239579300815760225?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/4239579300815760225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=4239579300815760225' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4239579300815760225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4239579300815760225'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/01/alarm-alarm-solaris-swap-is-exhausted_24.html' title='Alarm, Alarm!!! - Solaris Swap is exhausted - Part 2'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-8568167015647480762</id><published>2010-01-24T22:19:00.011+10:00</published><updated>2010-01-24T23:32:16.313+10:00</updated><title type='text'>Alarm, Alarm!!! - Solaris Swap is exhausted - Part 1</title><content type='html'>&lt;strong&gt;&lt;u&gt;The Problem&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;I recently witnessed a Solaris server die a painful death by memory starvation, which was credited to an un-tuned Oracle 11g instance having it's way.&lt;br /&gt;&lt;br /&gt;The obvious questions were asked after the event, including - 'How do we stop this happening again?'.  One suggestion was to monitor all the Solaris hosts to ensure that, in the event that swap is running low, we will at least know about it before the system falls in a heap (no pun intended).  &lt;br /&gt;&lt;br /&gt;So, how do we do this?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;The approach&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Nagios is the tool of choice in this case, which implies SNMP Monitoring by default (for this particular organisation).  Some testing led me to the NET-SNMP UCDavis MIB values: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;memSwapError (.1.3.6.1.4.1.2021.4.100.0)&lt;br /&gt;&lt;li&gt;memSwapErrorMsg (.1.3.6.1.4.1.2021.4.101.0)&lt;br /&gt;&lt;li&gt;memAvailSwap (.1.3.6.1.4.1.2021.4.4.0)&lt;br /&gt;&lt;li&gt;memMinimumSwap (.1.3.6.1.4.1.2021.4.12.0)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;According to the Net-SNMP notes, memSwapError and memSwapErrorMsg are triggered when '&lt;em&gt;memAvailSwap is less than the desired minimum (specified by memMinimumSwap)&lt;/em&gt;'.  In Part 2 of this topic, I'll show how to check that this is actually what happens on your configuration.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Unexpected Fruit&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;The main point of this blog is to highlight where/how to set memMinimumSwap which eluded me for a while.  At first it appeared that this value is a hard-coded value as evidenced by a sampling of a number of different hosts.  The value returned is always 16000 which turns out to be the default.&lt;br /&gt;&lt;br /&gt;Reading throught the Net-SNMP source code, you find that a more meaningful value can be set in snmpd.conf using the &lt;i&gt;swap&lt;/i&gt; directive to supply a number of kilobytes. e.g. To change from the 16MB default to 32MB, use:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;swap 32000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now I can use Nagios and the check_snmp plug-in to monitor the value returned by memSwapError - if it's 0, there are no problems; if it returns 1, the system has fallen below the defined threshold and is in some trouble.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;References&lt;/u&gt;:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html"&gt;Net-SNMP MIB Reference&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Solaris 10 snmpd.conf - /etc/sma/snmp/snmpd.conf&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-8568167015647480762?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/8568167015647480762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=8568167015647480762' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8568167015647480762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8568167015647480762'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2010/01/alarm-alarm-solaris-swap-is-exhausted.html' title='Alarm, Alarm!!! - Solaris Swap is exhausted - Part 1'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-6874587085647886767</id><published>2009-12-06T16:57:00.009+10:00</published><updated>2009-12-06T22:47:51.268+10:00</updated><title type='text'>Booting a CentOS network install from a USB Stick</title><content type='html'>&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;I have recently been playing with CentOS 5.4 with a view to test out some Bare Metal recovery solutions. Rather than cut a CD, I thought I'd try booting from a USB stick which, after a bit of fiddling turned out to be not too hard. There are a number of descriptions of how to do this on the net, each with there own twist.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;The purpose I had in mind is a direct replacement for the netinstall CD provided with the CentOS distribution CD set. I intended to use the USB stick to allow me to easily start a kickstart process.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Preparation&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;To start, you need access to the netinstall cd. Ok, so this sounds a bit counter intuitive, if I've got the CD why not just use that - well, I have the CD in ISO form and play around with VMWare a bit, so, the ISO is just mounted as a Virtual CD. You can also do this using Microsoft's, &lt;a href="http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe"&gt;Virtual CD -ROM&lt;/a&gt; software.&lt;br /&gt;&lt;br /&gt;You also need to have a working copy of syslinux installed - I tend to use the syslinux provided with the CentOS distribution also.&lt;br /&gt;&lt;br /&gt;To install the syslinux tools use the command:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# yum install syslinux&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;Of course, you also need a sacrificial USB stick (see Warning below!). Using syslinux, we are going to update the boot block and add some files. In theory, this should'nt adversely affect the utility of the USB stick for other purposes, but just in case, backup any files that are already there.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;strong&gt;&lt;u&gt;Method&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;To make a bootable USB stick for use with a kickstart installation, do the following: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mount the USB stick on the computer with syslinux installed. &lt;/li&gt;&lt;/ul&gt;&lt;p style="BACKGROUND-COLOR: lightblue"&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;br /&gt;CentOS automatically mounts the USB stick under /media - the mount point changes depending on the label applied to the USB stick with the default being /media/disk.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Update the boot block using: syslinux /dev/sdb1&lt;/li&gt;&lt;/ul&gt;&lt;p style="BACKGROUND-COLOR: lightblue"&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;br /&gt;Be sure to substitute the appropriate device name for your installation i.e. /dev/sdb1 was derived by executing '&lt;strong&gt;df&lt;/strong&gt;' and using the device name associated with the mount point '&lt;strong&gt;/media/disk&lt;/strong&gt;'.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Copy files from the netinstall CD (mounted as &lt;em&gt;/media/CentOS&lt;/em&gt;) to the USB stick using:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cp /media/CentOS/syslinux/* /media/disk&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rename isolinux.cfg to syslinux.cfg using:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# mv /media/disk/isolinux.cfg /media/disk/syslinux.cfg&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Unmount the USB stick using:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# umount /media/disk&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Congratulations, you now have a bootable USB stick that is a direct replacement for the netinstall CD provided with the CentOS distribution.&lt;/p&gt;&lt;p&gt;To boot the installation, configure the target computer to boot from the USB stick using the boot settings in the BIOS.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Extra information&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The above works great as a starting point for your own custom kickstart boot disk. I tweak it a little to save myself a bit of messing around at the boot prompt by editing the syslinux.cfg file as follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Change the default boot option to ks i.e. replace '&lt;em&gt;default linux&lt;/em&gt;' with '&lt;em&gt;default ks&lt;/em&gt;'.&lt;/li&gt;&lt;li&gt;Change the timeout to a shorter period by changing '&lt;em&gt;timeout 600&lt;/em&gt;' to '&lt;em&gt;timeout 100&lt;/em&gt;'.&lt;/li&gt;&lt;li&gt;Update the arguments for the ks boot option to include the path to the kickstart configuration file e.g. replace '&lt;em&gt;append ks initrd=initrd.img&lt;/em&gt;' with '&lt;em&gt;append ks=ftp://path_to_ks_file/ks.cfg init=initrd.img&lt;/em&gt;'&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="BACKGROUND-COLOR: wheat"&gt;&lt;strong&gt;WARNING:&lt;/strong&gt;&lt;br /&gt;I trashed my USB stick configuration a couple of times (yes, it took more than one time for me to realise), because I had the line '&lt;em&gt;clearpart all&lt;/em&gt;' in my &lt;em&gt;ks.cfg&lt;/em&gt;. Be sure to specifically list the drives that are OK to re-partition using something like '&lt;em&gt;clearpart --drives=sda,sdb --initlabel&lt;/em&gt;' which clears only the first two SATA drives.&lt;/p&gt;&lt;br /&gt;&lt;p style="BACKGROUND-COLOR: lightblue"&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;&lt;br /&gt;If you did get caught like I did, you can use the &lt;a href="http://panasonic.jp/support/global/cs/sd/download/sd_formatter.html"&gt;Panasonic SDFormatter&lt;/a&gt; to reformat the USB stick to reset the whole process and start again.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;References&lt;/u&gt;&lt;/strong&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/Installation_Guide-en-US/s1-kickstart2-options.html"&gt;Redhat Kickstart Options&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sysresccd.org/Howto_install-usb-stick"&gt;HOWTO Install-USB-Stick&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-6874587085647886767?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/6874587085647886767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=6874587085647886767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6874587085647886767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6874587085647886767'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2009/12/booting-centos-network-install-from-usb.html' title='Booting a CentOS network install from a USB Stick'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-8399319153095788591</id><published>2008-07-25T15:39:00.004+10:00</published><updated>2008-07-25T15:44:43.164+10:00</updated><title type='text'>Cheap as chips backups</title><content type='html'>I was playing backups on the week-end and found that the combination of Robocopy and Volume Shadown Copies is great for a no budget situation.&lt;br /&gt;&lt;br /&gt;The process is outlined here: &lt;a href="http://www.eggheadcafe.com/tutorials/aspnet/f6972828-1e81-4cd4-ae0c-36196a82ed25/workstation-open-file-bac.aspx"&gt;Egghead Cafe Tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To make it work, you need robocopy (Windows Resource Kit Tools), the VSHADOW.EXE utility found in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0B4F56E4-0CCC-4626-826A-ED2C4C95C871&amp;amp;displaylang=en"&gt;Volume ShadowCopy Service SDK&lt;/a&gt; and last but not least, &lt;a href="http://www.ltr-data.se/opencode.html"&gt;a utility called dosdev.exe&lt;/a&gt; that connects a shadow copy snapshot to a drive letter to allow easy access to the files.&lt;br /&gt;&lt;br /&gt;Possible uses: Replicating Virtual Machine drives, at home backup ????&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-8399319153095788591?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/8399319153095788591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=8399319153095788591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8399319153095788591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8399319153095788591'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/07/cheap-as-chips-backups.html' title='Cheap as chips backups'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-8913390382730622800</id><published>2008-05-26T21:29:00.003+10:00</published><updated>2008-05-26T22:11:16.664+10:00</updated><title type='text'>Linux and the health of your disk</title><content type='html'>&lt;p&gt;The CentOS NAS has been singing along for over a month now with no performance problems that I'm aware of. The trick to this is that I've only the word of the people using the system that it's working as expected - so what metrics are important when checking the performance of the disk on the NAS. &lt;/p&gt;&lt;p&gt;Because the system is an iSCSI based solution, the system connect to the NAS and use the iSCIS LUNs like local disk. This presents a couple of different ways to monitor disk performance which are both necessary to get a complete picture of how things are going. &lt;/p&gt;&lt;p&gt;&lt;u&gt;Disk IO on the NAS Server&lt;/u&gt;&lt;br /&gt;To check the local performance, I have employed the help of the System and Server Status pages of the Webmin Management UI. A simple script (being a windows guy doesn't help here) was written to return an error if the Disk IO is above a pre-determined threshold. &lt;/p&gt;&lt;p&gt;I don't like to re-invent things so I checked what Google has discovered from other peoples ponderings and came up with a few interesting bits: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.linuxquestions.org/linux/articles/Jeremys_Magazine_Articles/Hunting_I_O_Bottlenecks_with_iostat"&gt;http://www.linuxquestions.org/linux/articles/Jeremys_Magazine_Articles/Hunting_I_O_Bottlenecks_with_iostat&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.weborial.com/how-to/iowait.shtml"&gt;http://www.weborial.com/how-to/iowait.shtml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Which led to the following script:&lt;br /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/ksh&lt;br /&gt;# SCRIPT:       /usr/local/bin/check_iostat&lt;br /&gt;# VERSION:      1.0&lt;br /&gt;# CREATED:      26/05/08&lt;br /&gt;# LAST UPDATED: 26/05/08&lt;br /&gt;# AUTHOR:       Adrian Wood&lt;br /&gt;# DECRIPTION:   Check the iowait value returned by the iostat command.  A high value for iowait indicates&lt;br /&gt;#               that the disk io subsystem is spending too much time waiting to service requests&lt;br /&gt;#               i.e. the system is io bound.# PARAMS:       None&lt;br /&gt;#&lt;br /&gt;# Inspired by examples at: http://www.weborial.com/how-to/iowait.shtml&lt;br /&gt;#&lt;br /&gt;# CHANGES:&lt;br /&gt;&lt;br /&gt;IOSTAT="/usr/bin/iostat -c"     #The iostat command to run&lt;br /&gt;THRESHOLD=40                    #The threshold that is considered dangerous (in whole numbers)&lt;br /&gt;&lt;br /&gt;# function to extract the fourth token of the last line of the&lt;br /&gt;get_iowait() {&lt;br /&gt;   $IOSTAT  grep -v avg-cpu  grep -v Linux  grep "."  {&lt;br /&gt;        while read line; do&lt;br /&gt;                iowait=(` echo $line  cut -d ' ' -f4 `)&lt;br /&gt;        done }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#Get the current iowait value from iostatget_iowait&lt;br /&gt;#if the value returned is greater than the defined threshold, flag an alarm.&lt;br /&gt;if [ $iowait -gt $THRESHOLD ] ; then&lt;br /&gt;        echo WARNING: The iowait value of $iowait has exceeded the defined threshold of $IOWAIT_THRESHOLD.&lt;br /&gt;        echo Some investigation into the performance of the disk i/o subsystem is required to&lt;br /&gt;        echo determine if this condition should and/or can be corrected.&lt;br /&gt;        exit 1&lt;br /&gt;else&lt;br /&gt;        exit 0&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;hr /&gt;&lt;br /&gt;&lt;p&gt;To use the above, copy the text into a script on your CentOS server with Webmin installed, make it executable using the chmod +x command and schedule it to run using the Webmin System and Server Status interface. &lt;/p&gt;&lt;p&gt;Notes on the System and Server Status menu of webmin can be found at: &lt;a href="http://doxfer.com/Webmin/SystemAndServerStatus"&gt;http://doxfer.com/Webmin/SystemAndServerStatus&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Disk IO from an iSCSI Client Perspective&lt;/u&gt;&lt;/p&gt;&lt;p&gt;I'm assuming a windows system for this section of the discussion as a Linux system would be treated the same as above.  The readily available method for monitoring the disk performance on a Windows System is to crank up Perfmon.  For real-time analysis, that's Start - Run - Perfmon ; or for collecting information for later, try the Performance Logs and Alerts snap-in of the Computer Management console (Start - Run - compmgmt.msc).&lt;/p&gt;&lt;p&gt;The important counters to check include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Avg. Disk sec/Write and Avg. Disk sec /Read&lt;br /&gt;Both of these counters are found under Physical and Logical Disk counters categories.  A value of greater than 25ms over a significant period means that the disk is running slow.&lt;/li&gt;&lt;li&gt;Disk Transfers/sec&lt;br /&gt;If this value falls below 80 I/O's per second when the above thresholds are exceeded, there may be too many LUN's using the same disk on the NAS.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For more information on thresholds and counters for Windows Monitoring, see the article at &lt;a href="http://technet.microsoft.com/en-us/library/cc296652.aspx"&gt;http://technet.microsoft.com/en-us/library/cc296652.aspx&lt;/a&gt; describing the PAL tool.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-8913390382730622800?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/8913390382730622800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=8913390382730622800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8913390382730622800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/8913390382730622800'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/05/linux-and-health-of-your-disk.html' title='Linux and the health of your disk'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-287086228272766974</id><published>2008-05-15T13:17:00.008+10:00</published><updated>2008-06-23T10:17:29.265+10:00</updated><title type='text'>LDAP Authentication for Tomcat 4.x Administration</title><content type='html'>I occasionally have a need to restart an application running in a number of Tomcat environments that I inherited. The default installation (for version 4.1 at least) doesn't seem have an active administrative account and is tied to a local users .xml file when it does.&lt;br /&gt;&lt;br /&gt;Tomcat can be configured to authenticate against the local Active Directory which is much easier for global administration and for removing the need to remember yet another password. Once configured, AD Authentication can be used for both application and administration access.&lt;br /&gt;&lt;br /&gt;The following steps are what I use to configure the authentication for the Tomcat installations that I manage:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Enabling LDAP Authentication&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download ldap.jar to the server\lib directory&lt;/li&gt;&lt;li&gt;Add the following section to the server.xml file: &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;lt;Realm className="org.apache.catalina.realm.JNDIRealm" debug="0"&lt;br /&gt;connectionname="&lt;strong&gt;cn=service account name,ou=full,ou=path,dc=domain,dc=com,dc=au&lt;/strong&gt;"&lt;br /&gt;connectionPassword="&lt;strong&gt;service account password&lt;/strong&gt;"&lt;br /&gt;connectionURL="&lt;strong&gt;ldap://domain.com.au:389&lt;/strong&gt;"&lt;br /&gt;referrals="follow" roleBase="&lt;strong&gt;ou=full,ou=path,ou=to,ou=groups,dc=domain,dc=com,dc=au&lt;/strong&gt;"&lt;br /&gt;roleName="sAMAccountName"&lt;br /&gt;roleSearch="member={0}"&lt;br /&gt;roleSubtree="false"&lt;br /&gt;userBase="&lt;strong&gt;dc=domain,dc=com,dc=au&lt;/strong&gt;"&lt;br /&gt;userSearch="sAMAccountName={0}"&lt;br /&gt;userSubtree="true"&lt;br /&gt;/&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Connecting the application&lt;/u&gt;&lt;/p&gt;&lt;p&gt;Before the AD Authentication can be used, the application needs to be configured to refer to the appropriate group. This is achieved via the web.xml file that is present in the WEB-INF directory of the deployed application. For the built-in &lt;strong&gt;manager&lt;/strong&gt; and &lt;strong&gt;admin&lt;/strong&gt; applications it seems to be fine to directly edit these, for other applications, it may be best to refer to your deployment process to ensure that it won't get over-written.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Locate the web.xml file (eg. &lt;tomcatroot&gt;\server\webapps\admin\WEB-INF)&lt;/li&gt;&lt;li&gt;Find the &lt;role-name&gt;... &lt;/ROLE-NAME&gt;tags and replace the role name with the name of the AD group to be used to control access. There should be two of these, one in a security-role section and one in a auth-constraint section.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;u&gt;Importan&lt;/u&gt;&lt;u&gt;t points&lt;/u&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;After all of the configuration steps are completed, a restart of Tomcat is required to activate the changes.&lt;/li&gt;&lt;li&gt;All of the bits that are site-specific are in bold eg. userPassword is a litteral string that does not change.&lt;/li&gt;&lt;li&gt;For the above to work, the account that will be used must be in the OU as defined by the &lt;strong&gt;userPattern&lt;/strong&gt; parameter and the account must be a direct member of the group defined in the role-name parameter of the application.&lt;/li&gt;&lt;li&gt;The name of the group and service account needs to be the Pre-Windows 2000 name of the group or account.&lt;/li&gt;&lt;li&gt;The account referred to as service account only needs the privilege to query the AD, no changes are made - don't give this account extra privilege as the password is in plain text in the Tomcat configuration file.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;u&gt;References&lt;/u&gt;&lt;/p&gt;&lt;p&gt;The following references were used to compile the working configuration:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tomcat.apache.org/connectors-doc/reference/workers.html"&gt;http://tomcat.apache.org/connectors-doc/reference/workers.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="externalLink" title="External link to http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/" href="http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/" target="_blank"&gt;http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="externalLink" title="External link to http://issues.apache.org/bugzilla/show_bug.cgi?id=27648" href="http://issues.apache.org/bugzilla/show_bug.cgi?id=27648" target="_blank"&gt;http://issues.apache.org/bugzilla/show_bug.cgi?id=27648&lt;/a&gt;&lt;/li&gt;&lt;li&gt;LDAP Provider - &lt;a class="externalLink" title="External link to http://java.sun.com/products/jndi/index.jsp" href="http://java.sun.com/products/jndi/index.jsp" target="_blank"&gt;http://java.sun.com/products/jndi/index.jsp&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-287086228272766974?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/287086228272766974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=287086228272766974' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/287086228272766974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/287086228272766974'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/05/ldap-authentication-for-tomcat.html' title='LDAP Authentication for Tomcat 4.x Administration'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-1835847420338499740</id><published>2008-04-21T15:22:00.010+10:00</published><updated>2008-04-22T09:31:23.679+10:00</updated><title type='text'>What type of Computer have you got?</title><content type='html'>I was asked today how would I identify the type of computer a script or batch file is running on. Of course, we're talking about a Windows platform and if you do a search on Google you'll find that WMI will give you the answer but most references talk about how to do it using VBScript (a couple of these references are listed below). When trying to do this from a batch file on Windows for XP and above, you can use WMIC.exe to do the same thing, as follows:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;@echo off&lt;br /&gt;for /f "delims={}" %%i in ('"wmic systemenclosure get chassistypes | find&lt;br /&gt;"{""') do set chassisType=%%i&lt;br /&gt;&lt;br /&gt;If %chassisType% geq 9 if %chassisType% leq 10 goto Laptop&lt;br /&gt;If %chassisType% geq 3 if %chassisType% leq 4 goto Desktop&lt;br /&gt;&lt;br /&gt;::Not specifically looking for this type.&lt;br /&gt;Echo Chassis Type is: %chassisType%&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:Laptop&lt;br /&gt;Echo Running on a Laptop&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:Desktop&lt;br /&gt;Echo Running on a Desktop&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The values for the Chassis Type are:&lt;br /&gt; 1 - Other&lt;br /&gt; 2 - Unknown&lt;br /&gt; 3 - Desktop&lt;br /&gt; 4 - Low Profile Desktop&lt;br /&gt; 5 - Pizza Box&lt;br /&gt; 6 - Mini Tower&lt;br /&gt; 7 - Tower&lt;br /&gt; 8 - Portable&lt;br /&gt; 9 - Laptop&lt;br /&gt; 10 - Notebook&lt;br /&gt; 11 - Hand Held&lt;br /&gt; 12 - Docking Station&lt;br /&gt; 13 - All in One&lt;br /&gt; 14 - Sub Notebook&lt;br /&gt; 15 - Space-Saving&lt;br /&gt; 16 - Lunch Box&lt;br /&gt; 17 - Main System Chassis&lt;br /&gt; 18 - Expansion Chassis&lt;br /&gt; 19 - Sub Chassis&lt;br /&gt; 20 - Bus Expansion Chassis&lt;br /&gt; 21 - Peripheral Chassis&lt;br /&gt; 22 - Storage Chassis&lt;br /&gt; 23 - Rack Mount Chassis&lt;br /&gt; 24 - Sealed-Case PC&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;For examples on how it's done with VBScript, see the references below.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;References:&lt;/u&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/scriptcenter/guide/sas_cpm_btnz.mspx?mfr=true"&gt;Microsoft Windows 2000 Scripting Guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/hey0921.mspx"&gt;Hey, Scripting Guy&lt;/a&gt; Article &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-1835847420338499740?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/1835847420338499740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=1835847420338499740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/1835847420338499740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/1835847420338499740'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/04/what-type-of-computer-have-you-got.html' title='What type of Computer have you got?'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-6463021511418829103</id><published>2008-04-19T10:33:00.004+10:00</published><updated>2008-04-19T12:05:27.606+10:00</updated><title type='text'>Windows 2008 Resources</title><content type='html'>While looking into Windows 2008, I have come across a few handy resources which I hope to add to this list for handy access:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;eBooks&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.goldnetgroup.com/windows-server-2008-the-definitive-guide-1283.html"&gt;The Definitive Guide to Windows 2008&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nexus.realtimepublishers.com/DGBWS2K8I.htm"&gt;The Definitive Guide to Building a Windows 2008 Infrastructure (WIP)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=518d870c-fa3e-4f6a-97f5-acaf31de6dce&amp;amp;displaylang=en"&gt;Windows Server 2008 Step-by-Step Guides &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.netbks.com/operating-system/windows-server-2008-unleashed_2474.html"&gt;Windows Server 2008 Unleashed&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-6463021511418829103?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/6463021511418829103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=6463021511418829103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6463021511418829103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/6463021511418829103'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/04/windows-2008-resources.html' title='Windows 2008 Resources'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-4293361874384591379</id><published>2008-04-17T21:45:00.003+10:00</published><updated>2008-04-17T22:08:25.668+10:00</updated><title type='text'>Zipping through your files</title><content type='html'>I came across the situation yesterday where I have a bunch of directories full of files, being added to constantly and the owner of the directory insists that all the files are required. This is not such a problem as the files aren't particularly large. The application producing the files is having lots of issues with performance on the disk and finding a file has become a huge problem as the directories typically contain anywhere from 50 to 1,000,000+ files.&lt;br /&gt;&lt;br /&gt;It immediately occured to me that the delete command has a /s parameter that would be handy, if only the auditing were turned off - it was a pleasant day dream.&lt;br /&gt;&lt;br /&gt;So, the current thought is that I just need to clean things up a little and I've posted the basis for the clean-up exercise below. A script that uses the &lt;a href="http://www.info-zip.org/"&gt;info-zip &lt;/a&gt;command line utility zip.exe to run through the directory, adding anything older than the current interval specified. It's not the speediest process for the number of files in question but it works well enough and can be scheduled to run daily which will keep things trim.&lt;br /&gt;&lt;br /&gt;&lt;div bgcolor="wheat"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;br /&gt;' Description: Zip files into separate daily, weekly or monthly zip files&lt;br /&gt;'&lt;br /&gt;' Requirements: VBScript and zip.exe from http://www.info-zip.org/&lt;br /&gt;'&lt;br /&gt;' Usage: cscript //nologo ZipArchive.vbs [/d/w/m] /p:directoryToArchive [/a:directoryForZips] [/v]&lt;br /&gt;'&lt;br /&gt;&lt;br /&gt;'Set the locale to get a predictable Date format&lt;br /&gt;setlocale "en-au"&lt;br /&gt;&lt;br /&gt;'Global Settings&lt;br /&gt;Const PATH_UTIL = "C:\Utilities"&lt;br /&gt;Const CMD_ZIP = "%UTILPATH%\zip.exe -D -m %ZIPFILE% %FILETOZIP%&lt;zipfile&gt;&lt;filetozip&gt;"&lt;br /&gt;&lt;br /&gt;Const INTERVAL_DAILY = 1&lt;br /&gt;Const INTERVAL_WEEKLY = 2&lt;br /&gt;Const INTERVAL_MONTHLY = 3&lt;br /&gt;&lt;br /&gt;'FileSystem and Shell objects&lt;br /&gt;Set objFSO = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;Set objShell = CreateObject("Wscript.Shell")&lt;br /&gt;&lt;br /&gt;'Defaults&lt;br /&gt;strTargetPath = "C:\Temp"&lt;br /&gt;intInterval = INTERVAL_DAILY&lt;br /&gt;&lt;br /&gt;'Process any arguments provided&lt;br /&gt;set objArgs = WScript.Arguments&lt;br /&gt;&lt;br /&gt;'The source path&lt;br /&gt;If objArgs.Named.Exists("p") Then strTargetPath = objArgs.Named("p")&lt;br /&gt;&lt;br /&gt;'The destination for storing zips.&lt;br /&gt;If objArgs.Named.Exists("a") Then&lt;br /&gt;        strArchivePath = objArgs.Named("a")&lt;br /&gt;Else&lt;br /&gt;        'If nothing provided, assume an Archive directory directly under&lt;br /&gt;        'the source directory.&lt;br /&gt;        strArchivePath = objFSO.GetFolder(strTargetPath) &amp;amp; "\Archive"&lt;br /&gt;End If 'objArgs.Named.Exists("a")&lt;br /&gt;&lt;br /&gt;'The interval for grouping of files into a single zip - if more than&lt;br /&gt;'1 interval is specified, the most specific is used.&lt;br /&gt;If objArgs.Named.Exists("m") Then intInterval = INTERVAL_MONTHLY&lt;br /&gt;If objArgs.Named.Exists("w") Then intInterval = INTERVAL_WEEKLY&lt;br /&gt;If objArgs.Named.Exists("d") Then intInterval = INTERVAL_DAILY&lt;br /&gt;&lt;br /&gt;bVerbose = objArgs.Named.Exists("v")&lt;br /&gt;set objArgs = Nothing&lt;br /&gt;&lt;br /&gt;'Determine which date is the oldest to keep&lt;br /&gt;Select Case intInterval&lt;br /&gt;        Case INTERVAL_DAILY : dteRetainFrom = CDate(Day(Now) &amp;amp; "/" &amp;amp; Month(Now) &amp;amp; "/" &amp;amp; Year(Now))&lt;br /&gt;        Case INTERVAL_WEEKLY : dteRetainFrom = CDate(DateAdd("d", Now, 1-DatePart("w", Now)))&lt;br /&gt;        Case INTERVAL_MONTHLY : dteRetainFrom = CDate("01/" &amp;amp;&lt;br /&gt;Month(Now) &amp;amp; "/" &amp;amp; Year(Now))&lt;br /&gt;End Select 'intInterval&lt;br /&gt;&lt;br /&gt;'Check Archive Directory exists&lt;br /&gt;If Not objFSO.FolderExists(strArchivePath) Then&lt;br /&gt;           WScript.Echo "Archive Directory missing: " &amp;amp; strArchivePath&lt;br /&gt;           WScript.Quit&lt;br /&gt;End If 'Not objFSO&lt;br /&gt;&lt;br /&gt;'Dump anything older than the first of the month into an appropriate&lt;br /&gt;'zip file in the Archive Directory.&lt;br /&gt;&lt;br /&gt;If bVerbose Then WScript.Echo "Setting current directory to: " &amp;amp; strTargetPath&lt;br /&gt;objShell.CurrentDirectory = strTargetPath&lt;br /&gt;intCount = 0&lt;br /&gt;&lt;br /&gt;'Loop through the files adding to the appropriate zip file as you go.&lt;br /&gt;For Each objFile in objFSO.GetFolder(objShell.CurrentDirectory).Files&lt;br /&gt;        dteCreated = objFile.DateCreated&lt;br /&gt;        intCount = intCount + 1&lt;br /&gt;        If DateDiff("d", dteRetainFrom, dteCreated) &lt; 0 Then&lt;br /&gt;                Select Case intInterval&lt;br /&gt;                        Case INTERVAL_DAILY : strZipDate = Year(dteCreated) &amp;amp; Right("00" &amp;amp; Month(dteCreated), 2) &amp;amp; Right("00" &amp;amp; Day(dteCreated), 2)&lt;br /&gt;                        Case INTERVAL_WEEKLY : strZipDate = Year(dteCreated) &amp;amp; "_" &amp;amp; Right("00" &amp;amp; DatePart("ww", dteCreated), 2)&lt;br /&gt;                        Case INTERVAL_MONTHLY : strZipDate = Year(dteCreated) &amp;amp; Right("00" &amp;amp; Month(dteCreated), 2)&lt;br /&gt;        End Select 'intInterval&lt;br /&gt;strZIPFile = strArchivePath &amp;amp; "\Archive_" &amp;amp; strZipDate &amp;amp; ".zip"&lt;br /&gt;strCmd = Replace(CMD_ZIP, "%ZIPFILE%&lt;zipfile&gt;", strZIPFile)&lt;br /&gt;strCmd = Replace(strCmd, "%UTILPATH%&lt;utilpath&gt;", objShell.ExpandEnvironmentStrings(PATH_UTIL))&lt;br /&gt;strCmd = Replace(strCmd, "%FILETOZIP%&lt;filetozip&gt;", objFile.Name)&lt;br /&gt;&lt;br /&gt;If bVerbose Then&lt;br /&gt;        WScript.Echo intCount &amp;amp; ". Archiving " &amp;amp; objFile.Name &amp;amp; " to " &amp;amp; strZIPFile&lt;br /&gt;Else&lt;br /&gt;        'Display a count of files as the are processed.&lt;br /&gt;        WScript.StdOut.Write vbCR &amp;amp; intCount&lt;br /&gt;        Wscript.sleep 200&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;objShell.Run strCmd, 0, true&lt;br /&gt;&lt;br /&gt;End If 'DateDiff&lt;br /&gt;Next 'objFile&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-4293361874384591379?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/4293361874384591379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=4293361874384591379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4293361874384591379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4293361874384591379'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/04/zipping-through-your-files.html' title='Zipping through your files'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-4347221357757443441</id><published>2008-04-17T20:13:00.003+10:00</published><updated>2008-04-17T21:24:28.978+10:00</updated><title type='text'>A CentOS OS Installation</title><content type='html'>The build I used for my &lt;a href="http://www.centos.org/"&gt;CentOS &lt;/a&gt;based NAS is pretty simple when all the kinks are worked out, I thought publishing the detail may help someone else get through a little more quickly.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="color:#330033;"&gt;Hardware Platform&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;The following system specification was used to build and test these installation notes:&lt;br /&gt;&lt;br /&gt;System: ASUS RS260-E4/RX8&lt;br /&gt;CPU: 2 x Dual Core 3.00GHz Intel(R) Xeon(TM) CPU's&lt;br /&gt;Memory: 4Gb&lt;br /&gt;Disks: 8 x 500Gb SAS&lt;br /&gt;RAID: MegaRAID 8300XLP&lt;br /&gt;Network: 2 x 1Gb Adapters&lt;br /&gt;&lt;br /&gt;The choice of ASUS was not mine - I am more used to the tier 1 providers (HP, Compaq, IBM) and found the hardware a little harder to work with, specifically trying to find drivers for this and the Windows 2005 Virtual Server.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;OS Installation&lt;/u&gt;&lt;br /&gt;None of the following is very technical or challenging, but it is the way I did it:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Boot from the CentOS distribution CD (No. 1 of 7)&lt;/li&gt;&lt;li&gt;At the boot: prompt, press the &lt;strong&gt;Enter&lt;/strong&gt; key to initiate a graphical mode installation&lt;/li&gt;&lt;li&gt;If this is the first time the CD has been used, press &lt;strong&gt;Enter&lt;/strong&gt; to test the media:&lt;br /&gt;&lt;br /&gt;If you chose to test the media, press &lt;strong&gt;Enter&lt;/strong&gt; to initiate the Test and wait for the test to complete.&lt;br /&gt;&lt;br /&gt;If errors are displayed, the CD should be replaced as the installation may not complete successfully, otherwise, press &lt;strong&gt;Enter&lt;/strong&gt; to eject the CD.&lt;br /&gt;&lt;br /&gt;If the CD is out at this point, push it back in and continue with the installation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tab across to &lt;strong&gt;Skip&lt;/strong&gt; or &lt;strong&gt;Continue&lt;/strong&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;At the Welcome Screen for the GUI Mode Installation, click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;English (English)&lt;/strong&gt; as the language to use during installation.&lt;/li&gt;&lt;li&gt;Select the &lt;strong&gt;U.S. English&lt;/strong&gt; Keyboard option and click &lt;strong&gt;Next&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NOTE:&lt;/strong&gt;If this is a re-installation, then carefully read the options presented and choose the most appropriate option. These instructions were not intended for use with an Upgrade process.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;On the partitioning screen, select &lt;strong&gt;Create custom layout&lt;/strong&gt;. and select the disk drives to be used for this installation (if there’s only 1 it will be preselected) and click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;From the Disk Setup screen:&lt;br /&gt;&lt;br /&gt;Click &lt;strong&gt;New&lt;/strong&gt; and set the values to be:&lt;br /&gt;- Mount point: /boot&lt;br /&gt;- File System Type: ext3&lt;br /&gt;- Allowable Drives: sda&lt;br /&gt;- Size: 100Mb&lt;br /&gt;- Fixed Size&lt;br /&gt;&lt;br /&gt;Click &lt;strong&gt;New&lt;/strong&gt; and set the values to be:&lt;br /&gt;- File System Type: swap&lt;br /&gt;- Allowable Drives: sda&lt;br /&gt;- Size: 2048Mb&lt;br /&gt;- Fixed Size&lt;br /&gt;&lt;br /&gt;Click &lt;strong&gt;New&lt;/strong&gt; and set the values to be:&lt;br /&gt;- Mount point: /&lt;br /&gt;- File System Type: ext3&lt;br /&gt;- Allowable Drives: sda&lt;br /&gt;- Size: 4096Mb&lt;br /&gt;- Fixed Size&lt;br /&gt;&lt;br /&gt;Calculate: [Remaining Disk Capacity - 512MB]&lt;br /&gt;&lt;br /&gt;Click &lt;strong&gt;New&lt;/strong&gt; and set the values to be:&lt;br /&gt;- File System Type: physical volume (LVM)&lt;br /&gt;- Allowable Drives: sda&lt;br /&gt;- Size: [value calculated above]&lt;br /&gt;- Fixed Size&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Double-click&lt;/strong&gt; the Free partition of sda and set the Mount point to &lt;strong&gt;/cluster&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Double-click&lt;/strong&gt; each of the remaining Free partitions and change the File System Type to be &lt;strong&gt;physical volume (LVM)&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;LVM&lt;/strong&gt;:&lt;br /&gt;- Set the Volume Group Name to: vg0&lt;br /&gt;- Ensure all Physical Volumes are selected.&lt;br /&gt;- Click &lt;strong&gt;OK&lt;/strong&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ensure the option for The GRUB boot loader will be install on ... is selected, click &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;From the Network Configuration screen:&lt;br /&gt;&lt;br /&gt;Select &lt;strong&gt;eth0&lt;/strong&gt; and click &lt;strong&gt;Edit&lt;/strong&gt;&lt;br /&gt;- &lt;strong&gt;De-select&lt;/strong&gt; Use dynamic IP configuration (DHCP)&lt;br /&gt;- &lt;strong&gt;De-select&lt;/strong&gt; Enable IPv6 support&lt;br /&gt;- Ensure &lt;strong&gt;Activate on Boot&lt;/strong&gt; is selected&lt;br /&gt;- Enter the IP Address (Address) and Subnet mask (Netmask) for the &lt;strong&gt;Storage&lt;/strong&gt; Subnet&lt;br /&gt;- Click &lt;strong&gt;OK&lt;/strong&gt; to save changes&lt;br /&gt;&lt;br /&gt;Select &lt;strong&gt;eth1&lt;/strong&gt; and click &lt;strong&gt;Edit&lt;/strong&gt;&lt;br /&gt;- &lt;strong&gt;De-select&lt;/strong&gt; Use dynamic IP configuration (DHCP)&lt;br /&gt;- &lt;strong&gt;De-select&lt;/strong&gt; Enable IPv6 support&lt;br /&gt;- Ensure &lt;strong&gt;Activate on Boot&lt;/strong&gt; is selected&lt;br /&gt;- Enter the IP Address and Subnet mask for the &lt;strong&gt;Heartbeat&lt;/strong&gt; Subnet&lt;br /&gt;- Click &lt;strong&gt;OK&lt;/strong&gt; to save changes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Select the &lt;strong&gt;Set the hostname manually&lt;/strong&gt; option and enter the hostname&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;, then locate &lt;strong&gt;Australia/Brisbane&lt;/strong&gt; on the world map and confirm that the location is updated from America/New_York after clicking on the map.&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; and enter the Root password twice&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; and wait for the required software to be catalogued ready for installation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;De-select&lt;/strong&gt; Desktop - Gnome and select Server - GUI&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; to begin installation of software.&lt;/li&gt;&lt;li&gt;After the software is installed, remove the CD and click &lt;strong&gt;Reboot&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-4347221357757443441?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/4347221357757443441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=4347221357757443441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4347221357757443441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/4347221357757443441'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/04/centos-os-installation.html' title='A CentOS OS Installation'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-9063003066575216633</id><published>2008-04-15T20:25:00.000+10:00</published><updated>2008-04-15T21:51:01.967+10:00</updated><title type='text'>Openfiler put on the 'one day maybe' list</title><content type='html'>So it's a couple of months later and I still haven't posted any observations on Openfiler. The main reason being that I've had to shelve the project and start from scratch. As a result, I didn't have a whole lot of time to be reflecting on my success.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So what went wrong...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For me, the main gotcha was the update mechanism. The basic concept for Openfiler is great - an appliance built from OpenSource components and presented as a complete product. However, the choice of conary for the update manager has me confused. The linux base seems to be of a Redhat flavour, the project started out with CentOS as the base distribution but it doesn't readily support update via RPM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm not a linux guru which only becomes a problem when you need to get down and dirty with the inner workings of linux. This became necessary when I tried to use my shiny new NAS appliance with a Microsoft Cluster. Of course, the first version of the iSCSI Enterprise Target (aka IETD) that is reported to work with Microsoft Clustering is 0.4.15 - the version included with the released Openfiler is (was) of course, 0.4.14. The obvious path was to follow the update process to install the new and required version of IETD. To cut a long story short, the update didn't work, failing to update the kernel module associated with IETD. I tried so many things and ended up with a barely functioning iSCSI Target installation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the end, I went back to first principles and looked at what I was actually trying to achieve - an OpenSource implementation of an iSCSI NAS. I now have a working implementation of iSCSI Enterprise Target running on a CentOS platform serving a 64-Bit Windows 2003 Cluster running Windows Virtual Server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maybe one day I'll need to revisit the Openfiler solution, but for this exercise I found the 'roll your own' solution to be much less troublesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-9063003066575216633?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/9063003066575216633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=9063003066575216633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/9063003066575216633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/9063003066575216633'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2008/04/openfiler-put-on-one-day-maybe-list.html' title='Openfiler put on the &apos;one day maybe&apos; list'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5429435703174479765.post-5112033543005988030</id><published>2007-12-19T12:25:00.000+10:00</published><updated>2007-12-18T18:28:34.999+10:00</updated><title type='text'>iSCSI for mere mortals</title><content type='html'>iSCSI has been around for a while and like most things of this type it's an expensive exercise to set up a good working product. However, thanks to some helpful people willing to share the fruits of their labour there are a number of options available for the price of the hardware and your time.&lt;br /&gt;&lt;br /&gt;One of these products is &lt;a href="http://www.openfiler.com/"&gt;Openfiler&lt;/a&gt; - a NAS Server (Network Attached Storage) based on rPath Linux and providing iSCSI, Samba, NFS and Web Services in a ready made package. Obviously, I've been focussing on the iSCSI aspect due to some needs I've been trying to address around providing a clustered storage solution.&lt;br /&gt;&lt;br /&gt;So far, so good - I now have two servers configured and running as a clustered solution and I'm working through tuning the performance to achieve speeds equivalent to direct attached storage .&lt;br /&gt;&lt;br /&gt;I am hoping to post some observations about the current (2.2) and soon to be released upgrade (2.3) versions of Openfiler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5429435703174479765-5112033543005988030?l=picuspickings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://picuspickings.blogspot.com/feeds/5112033543005988030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5429435703174479765&amp;postID=5112033543005988030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/5112033543005988030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5429435703174479765/posts/default/5112033543005988030'/><link rel='alternate' type='text/html' href='http://picuspickings.blogspot.com/2007/12/iscsi-for-mere-mortals.html' title='iSCSI for mere mortals'/><author><name>Adrian</name><uri>http://www.blogger.com/profile/17527776922520143259</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_2u0pcaiocE4/S15w-vJoCbI/AAAAAAAAAFw/eq1hxb6cBmE/S220/Adrian_small1.PNG'/></author><thr:total>0</thr:total></entry></feed>
