FakeRaidHowto

Revision 25 as of 2006-01-15 23:17:21

Clear message

How to configure Ubuntu to access a hardware fakeRAID

This page is a work in progress. I have spent the last week getting Ubuntu Breezy preview installed on my Via SATA fakeRAID and finally have the system dual booting WinXP and Ubuntu Linux on a RAID-0 ( stripe ) between two 36 gig 10,000rpm WD Raptor hard drives. I thought I would create a howto to describe how I did it so that others may benefit from my work.

What is it?

In the last year or two a number of hardware products have come on the market claiming to be IDE or SATA RAID controllers. Virtually all of them are not really hardware RAID controllers. Instead they are simply a multi-channel disk controller that has special BIOS and drivers for the OS to perform the software RAID functions. This has the effect of giving the appearence of a hardware RAID, because the RAID configuration is set up using a BIOS setup screen and the system can be booted from the RAID.

Under Windows, you must supply a driver floppy to the setup process so Windows can access the RAID. Under Linux, the hardware is seen for what it is, which is simply a multi-channel IDE/SATA controller. What this means is that if you have multiple disks configured as a RAID, Linux sees individual disks. This page describes how to get Linux to see the RAID as one disk, and boot from it. In my case, I use a RAID-0 configuration, but this should also apply to RAID-1 and RAID-5.

Background

In recent years there has been a trend to try and pull a bunch of code out of the kernel and into EarlyUserSpace. This includes stuff like nfsroot configuration, md software RAID, lvm, conventional partition/disklabel support, and so on. Early user space is set up in the form of an initramfs which the boot loader loads with the kernel, and this contains user mode utilities to detect and configure the hardware, mount the correct root device, and boot the rest of the system.

Hardware fakeRAID falls into this category of operation. A device driver in the kernel called device mapper is configured by user mode utilities to access software RAIDs and partitions. If you want to be able to use a fakeRAID for your root filesystem, your initramfs must be configured to detect the fakeRAID and configure the kernel mapper to access it.

The How To

The key areas of work that needs done are:

  1. Installing Ubuntu
  2. Installing lilo or grub
  3. Configuring the initramfs to boot the system

Installing Ubuntu

Install dmraid

The standard setup and LiveCDs do not yet contain support for fakeRAID. I used the LiveCD to boot up, and used the package manager to download the dmraid package from the universe repository. You will need to enable packages from Universe in the settings of Synaptic to see the package.

Once the package is installed, it will detect the RAID device and any existing partitions on it, and create devices for them. In my case, initially dmraid created /dev/mapper/via_hfciifae and /dev/mapper/via_hfciifae1 (dmraid -r will show you what's mapped). These devices corresponded to my RAID itself, and the single partition on it that existed at the time, which was my WinXP NTFS partition. You should be able to fire up gparted and select the raw device to partition.

Partition the raid system

You can use gparted to create and delete partitions as you see fit, but at this time, it can not refresh the partition table after it modifies it, so you will need to change the partitions, then manually run dmraid -ay from the command prompt to detect the new partitions, and then refresh gparted before you can format the partition.

I needed to resize my existing NTFS partition to make space for Ubuntu. Gparted currently can not do this on the mapper device so I had to use the ntfsresize program from the command line. Note that ntfsresize only resizes the filesystem, not the partition, so you have to do that manually. Use ntfsresize to shrink the filesystem, note the new size of the filesystem in sectors, then fire up fdisk. Switch fdisk to sector mode with the 'u' command. Use the 'p' command to print the current partition table. Delete the partition that you just resized and recreate it with the same starting sector. Use the new size of the filesystem in sectors to compute the ending sector of the partition. Don't forget to set the partition type to the value it was before. Now you should be able to create a new partition with the free space. In my case, I created an extended partition with 3 logical partitions inside. I made a 50 meg partition for /boot, a 1 gig partition for swap, and the rest for the root.

After saving the new partition table and exiting fdisk, run dmraid -ay again to detect the new partitions. In my case I had the following in /dev/mapper:

via_hfciifae  -- the raw raid volume
via_hfciifae1 -- the NTFS partition
via_hfciifae5 -- /boot
via_hfciifae6 -- swap
via_hfciifae7 -- /

Format your new partitions

Now format your filesystems. In my case I ran an mke2fs on /dev/mapper/via_hfciifae5 and mkreiserfs on /dev/mapper/via_hfciifae7. Once that is done you can mount the new target filesystems. In my case I did:

mkdir /target
mount -t reiserfs /dev/mapper/via_hfciifae7 /target
mkdir /target/boot
mount -t ext2 /dev/mapper/via_hfciifae5 /target/boot
mkdir /target/dev
mount --bind /dev /target/dev
mkdir /target/proc
mount -t proc proc /target/proc
mkdir /target/sys
mount -t sysfs sysfs /target/sys

Install the base system

Now we install the base system. debootstrap installs all base packages and does it setup. Afterwards you need to install some additional packages:

cd /target

apt-get install debootstrap
# install debootstrap to install the base system at the next point

# install base system
debootstrap breezy /target  ## instead of breezy can be any distribution selected

# copy sources list
cp /etc/apt/sources.list etc/apt

# copy resolv.conf
cp /etc/resolv.conf /target/etc

# run in the now installed system
chroot /target

# install ubuntu-base (and other packaged)
apt-get update
apt-get install ubuntu-base linux-k7 ubuntu-desktop dmraid grub
# change grub to lilo if you use lilo
# change k7 to your processor architecture if you don't know, use linux-386.

# the system is installed now.

Installing Grub

To install grub you need to install the grub package.

Now you need to run the grub shell. The command grub-install doesn't work, because the device mapping is not known to grub.

cp /lib/grub/<your-cpu-arch>-pc/stage1 /boot/grub/
cp /lib/grub/<your-cpu-arch>-pc/stage2 /boot/grub/
# grub needs these files to setup itself correctly

grub
# you are now in the grub shell

device (hd0) /dev/mapper/via_hfciifae
# this says grub which mapping the BIOS has

geometry (hd0) 9001 255 63
# the root command complained about bad cylinder numbers without this
# so I gave it this command to tell it the right geometry
# according to fdisk (fdisk -l /dev/mapper/via_hfciifae)

root (hd0,4)
# select the root partition

setup (hd0)
# install grub

quit

If you have installed grub after installing the linux-... package, run now update-grub to add your linux kernel to the boot options. Edit the created menu.lst file to reflect your current raid mappings. update-grub configures hda1 as root because it can't find your current root-device. To add a Windows-Boot to your menu.lst you can use and change the following lines:

title Windows XP
  rootnoverify (hd0,0)
  chainloader +1

Configuring the initramfs

For the kernel to recognize the RAID you have to run the dmraid utility to configure the mapper device. To do this, we need to add dmraid to the initramfs. Debian and Ubuntu supports for this mkinitramfs to add dmraid we need to add some scripts and hooks:

Create a file as /usr/share/initramfs-tools/scripts/local-top/dmraid 

PREREQ=""

prereqs()
{
        echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

modprobe -q dm-mod

/sbin/dmraid -ay

Create a file as /usr/share/initramfs-tools/hooks/dmraid

PREREQ=""

prereqs()
{
        echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/dmraid /sbin

exit 0

Mark both files as executable and change the initramfs file, for this you need the version of you linux kernel use. Show in /boot for the vmlinuz files, the string after the first dash is used as version. I will use 2.6.12-9-k7:

chmod +x /usr/share/initramfs-tools/hooks/dmraid
chmod +x /usr/share/initramfs-tools/scripts/local-top/dmraid

rm /boot/initrd.img-2.6.12-9-k7
update-initramfs -c -k 2.6.12-9-k7

Now you can reboot your computer and use your new system.

Setup your system

Now you need to setup some settings:

Use base-config new to configure system defaults.


CategoryDocumentation CategoryHardware