Tuesday, July 30, 2013

Turning an old NetScaler into something useful

A couple of years ago, we picked up a pair of used NetScaler NS7000s.  We had them in service for a while, but eventually they became obsolete - we didn't have a NetScaler support contract, and there were new features we needed.  So, we replaced the old NetScalers with a different solution.

Last week, I hit upon an idea for a new project, and the NS7000s with their 8 onboard NICs was a perfect hardware platform for me.

For those that don't know, NetScalers run FreeBSD under the hood.  These particular units were running something from the 4.x series.  For comparison, the current release version as of this post is 9.1.

These units boast a single Pentium 4 2.8GHz processor and 1 GB of RAM.  They have dual onboard SATA ports, a single hot-plug 3.5 inch hard drive bay, and the primary IDE is jacked into a CompactFlash reader.  There is also an onboard CF jack, but I have not fiddled with it; presumably, this is the second IDE channel.  The two COM ports are attached to the serial console and the LCD display, respectively.

Step one was to try and recover any useful information from the old hard drives and CF cards.  Bit rot had set in, though, and of the 4 units, only one hard drive was readable.  Not much useful stuff, there - apparently the NetScaler products have root on the CF and /var on the hard drive.

So, I sourced new hard drives and CF cards and got to work.

Day one, I downloaded OpenBSD 5.3 x86 and performed a clean install to a hard drive.  I made a little /etc/rc.local script goodness to capture the output of dmesg to a text file.

I placed the hard drive into one of the NetScalers and fired it up.  I was a little concerned, initially, that the LCD still said Booting...  So, I let the unit sit for about an hour.  Then, I took the hard drive back out and mounted it up somewhere that I could look at the dmesg output.

SUCCESS!  The box booted clean and I could see em0 - em7 listed.

Next step was to identify each interface and get one plumbed up.  This was something of a trial-and-error effort.  I eventually gave up, broke down and purchased a new serial cable so I could get on the console.

Once logged in to the console, building the physical jack to interface map was pretty easy.  On both units, I got the same map, which looks like this (YMMV):
PHY | INT
---------
1/1 | em3
1/2 | em0
1/3 | em5
1/4 | em4
1/5 | em7
1/6 | em6
1/7 | em1
1/8 | em2
I was using a gigabit switch to talk to the unit.  All of the interfaces showed up at 1000baseT when I plugged them in, and herein lies the first real curiosity of this platform.  I was only able to get 1/7 and 1/8 to ping reliably.  The other ports had major packet loss and tremendous response times.  A close inspection of the front bezel shows jacks 1/1 - 1/6 are marked FE (fast ethernet), with 1/7 and 1/8 marked GB.  With this in mind, I tried massaging the interfaces down to 100baseTX and voila!  Working ports 1/1 - 1/6.

The next piece was to get NS7000 Booting... off the LCD console.  Luckily, it was a well documented piece of hardware from Matrix Orbital.  Unfortunately, I haven't been able to get any of the sample code or LCDproc to work with the unit, but I can use tip to connect via the terminal and put characters on the display, so it's just a matter of time.