I still remember my Linux nightmares of the previous century. Trying to install Linux and wiping my whole HD while trying to multi boot RedHat 5.0.
It was for a reason that they said you have to be a rocket scientist in order to install Linux properly.
Times have changed, Linux is easy to install. Perhaps two things are different, one is that objectively Linux became much easier to handle and the second is probably the fact I gained much more experience.
In my opinion – one of the reasons that Linux became easier along the years is the improving support for various device drivers. For the home users – it is excellent news. However, for the SysAdmin who deals mostly with servers and some high-end devices, the headache, I believe, still exists.
If you thought that having a NIC without a driver is a problem, I can assure you that having a RAID controller without a driver is ten times the headache.
I bring you here the story of the RocketRAID device, how to remaster initrd and driver disks and of course, how to become a rocket scientist!
With Centos 5.4 you get an ugly error in the middle of the installation saying you have no devices you can partition.
DOH!!! Because it discovered no HDs.
So now you’re asking yourself, where am I going? – Google of course.
RocketRAID 3530 driver page
And you discover you have drivers only for RHEL/CentOS 5.3. Oh! but there’s also source code!
It means we can do either of both:
- Remaster initrd and insert the RocketRAID drivers where needed
- Create a new driver disk and use it
I’ll show how we do them both.
I’ll assume you have the RocketRAID driver compiled for the installation kernel.
In addition, I’m also going to assume you have a network installation that’s easy to remaster.
Remastering the initrd
What do we have?
# file initrd.img
initrd.img: gzip compressed data, from Unix, last modified: Sun Jul 26 17:39:09 2009, max compression
I’ll make it quicker for you. It’s a gzipped cpio archive.
Let’s open it:
# mkdir initrd; gunzip -c initrd.img | (cd initrd && cpio -idm)
It’s open, let’s modify what’s needed.
- modules/modules.alias – Contains a list of PCI device IDs and the module to load
- modules/pci.ids – Common names for PCI devices
- modules/modules.dep – Dependency tree for modules (loading order of modules)
- modules/modules.cgz – The actual modules inside this initrd
Most of the work was done for us already in the official driver package from HighPoint.
Edit modules.alias and add there the relevant new IDs:
lias pci:v00001103d00003220sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003320sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003410sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003510sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003511sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003520sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003521sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003522sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003530sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003540sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00003560sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004210sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004211sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004310sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004311sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004320sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004321sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004322sv*sd*bc*sc*i* hptiop
alias pci:v00001103d00004400sv*sd*bc*sc*i* hptiop
This was taken from the RHEL5.3 package on the HighPoint website.
So now the installer (anaconda) knows it should load hptiop for our relevant devices. But it needs the module itself!
Download the source package and do the usual configure/make/make install – I’m not planning to go into it. I assume you now have your hptiop.ko compiled against the kernel version the installation is going to use.
OK, so the real deal is in modules.cgz, let’s open it:
# file modules/modules.cgz
modules/modules.cgz: gzip compressed data, from Unix, last modified: Sat Mar 21 15:13:43 2009, max compression
# mkdir /tmp/modules; gunzip -c modules/modules.cgz | (cd /tmp/modules && cpio -idm)
# cp /home/dan/hptiop.ko /tmp/modules/2.6.18-164.el5/x86_64
Now we need to repackage both modules.cgz and initrd.img:
# (cd /tmp/modules && find . -print | cpio -c -o | gzip -c9 > /tmp/initrd/modules/modules.cgz)
# (cd /tmp/initrd && find . -print | cpio -c -o | gzip -c9 > /tmp/initrd-with-rr.img)
Great, use initrd-with-rr.img now for your installation, it should load your RocketRAID device!
A driver disk
Creating a driver disk is much cleaner in my opinion. You do not remaster a stock initrd just for a stupid driver.
So you ask what is a driver disk? – Without going into the bits and bytes, I’ll just say that it’s a brilliant way of incorporating a custom modules.cgz and modules.alias without touching the installation initrd at all!
I knew I couldn’t live quietly with the initrd remaster so choosing the driver disk (dd in short) option was inevitable.
As I noted before, HighPoint provided me only a RHEL/CentOS 5.3 driver disk (and binary), but they also provided the source. I knew it was a matter of some adjustments to get it to work also for 5.4.
It is much easier to approach the driver disk now as we are much more familiar with how the installation initrd works.
I’m lazy, I already created a script that takes the 5.3 driver package and creates a dd:
# $1 - driver_package
# $2 - destination of driver disk
local driver_package=$1; shift
local destination=$1; shift
local tmp_mount_dir=`mktemp -d`
dd if=/dev/zero of=$tmp_image count=1 bs=1M && \
mkdosfs $tmp_image && \
mount -o loop $tmp_image $tmp_mount_dir && \
tar -xf $driver_package -C $tmp_mount_dir && \
umount $tmp_mount_dir && \
local -i retval=$?
if [ $retval -eq 0 ]; then
cp -aL $tmp_image $destination
chmod 644 $destination
echo "Driver disk created at: $destination"
rm -f $tmp_image
make_rocketraid_driverdisk rr3xxx_4xxx-rhel_centos-5u3-x86_64-v1.6.09.0702.tgz /tmp/rr.img
Want it for 5.4? – easy. Just remaster the modules.cgz that’s inside rr3xxx_4xxx-rhel_centos-5u3-x86_64-v1.6.09.0702.tgz and replace it with a relevant hptiop.ko module
Edit your kickstart to load the driver disk:
Make sure you have this line in the main section and not meta generated in your %pre section as the driverdisk directive is being processed before the %pre section.
The OS doesn’t boot after installation
You moron! This is because the installation kernel/initrd and the one that boots afterwards are not the same!
You can fix it in one of the 3 following ways:
- Recompile the CentOS/RHEL kernel and repackage it with the RocketRAID driver – pretty ugly, not to mention time consuming.
- Build a module RPM for the specific kernel version you’re going to use – very clean but also very time consuming!
- Just build the module for the relevant kernel in the %post section – my way.
In the %post section of your kickstart, add the following:
(cd /tmp && wget http://UGAT/HA/BAIT/INC/rr3xxx_4xxx-linux-src-v1.6-072009-1131.tar.gz && \
tar -xf rr3xxx_4xxx-linux-src-v1.6-072009-1131.tar.gz && cd rr3xxx_4xxx-linux-src-v1.6 && \
The next boot obviously have a different initrd image. Generally speaking, initrd creation is done after the %post section, so you should not bother about it too much…
Server should boot now. Go play your 12x2TB RAID array.
I hope I could teach you something in this post. It was a hell of a war discovering how to properly do all of these.
Now if you’ll excuse me – I’ll be going to play with spaceships and shoot rockets!