Initrd for Raid-Boot

If you are going to have Debian and a RAID on your Linkstation, you'll need a initrd for setting up the root filesystem.

Note: An initrd is only required of you have to set up some things to make the system boot, like starting the RAID, loading special modules or starting dm-crypt. If you do not have any of these needs, there is simply no need for an initrd, since the kernel will happily boot from hard disk.

Credits
Some ideas are taken from Debian Lenny on LS-WXL.

What you need beforehand
This guide assumes you already opened your box and bootstrapped Debian as described in Debian Squeeze on 'V' and 'X' Series. You may easily adapt this guide to other directory names or Debian versions. Or you may build the initrd on another device.

The Guide
Basic steps are:
 * 1) Create an empty file and mount it as a filesystem to be able to copy data into
 * 2) Into this mounted filesystem
 * 3) copy a prepared linuxrc script
 * 4) copy all binaries required by linuxrc plus the libraries required by the binaries
 * 5) create all required directories and device nodes required
 * 6) unmount the filesystem-file
 * 7) compress the file and make an initrd out of

For that you will
 * 1) Create and edit a text-file/script linuxrc.txt
 * 2) Create a text-file/script make-initrd.txt
 * 3) Copy both files to your LS
 * 4) Fix the line endings
 * 5) Run the script on your LS

Note: This Guide will install additional software into your debootstraped environment. Thus you may really want to create hddrootfs.buffalo.updated (as described in Debian_Squeeze_on_'V'_and_'X'_Series) prior to building the initrd.

Detailed description
sh /mnt/disk1/share/make-initrd.txt
 * 1) Create a text-file/script linuxrc.txt with the content shown below
 * 2) Uncomment the line echo "0x..." > ... which matched the device to be used as root
 * 3) Create a text-file/script make-initrd.txt with the content shown below
 * 4) Change the DEBOOTSTRAP=... line at the top to match your debootstraped environment.
 * 5) Copy both files to your LS.
 * 6) Now log into your LS and continue there.
 * 7) Find the place on your LS where you copied the files to:
 * If you used the share "share", this should be either /mnt/disk1/share or /mnt/array1/share
 * If you used scp, winscp or so, you'll know where :-)
 * 1) Run the script on your LS. Assuming you copied the file to /mnt/disk1/share, the command will be
 * 1) The initrd file will be initrd.buffalo in your debootstraped environment.

Required linuxrc.txt
Put this into a text-file called linuxrc.txt. You'll need to uncomment the line matching you root device.

mount -t proc none /proc mount -t sysfs none /sys echo 'DEVICE /dev/sd??*' > /etc/mdadm/mdadm.conf mdadm -Eb /dev/sd??* >> /etc/mdadm/mdadm.conf mdadm -As --force echo "0x901" > /proc/sys/kernel/real-root-dev umount /proc umount /sys
 * 1) !/bin/busybox sh
 * 2) linuxrc - to be put into the initrd
 * 1) Mount the /proc and /sys filesystems.
 * 1) use /dev/md1 as root
 * 1) use /dev/md2 as root
 * 2) echo "0x902" > /proc/sys/kernel/real-root-dev
 * 3) use /dev/sda6 as root
 * 4) echo "0x806" > /proc/sys/kernel/real-root-dev
 * 5) use /dev/sdb6 as root
 * 6) echo "0x822" > /proc/sys/kernel/real-root-dev
 * 1) Clean up.

File make-initrd.txt
Put this into a textfile called make-initrd.txt.

DEBOOTSTRAP=/root/debian-squeeze if [ "$1" != chrooted ] ; then if [ ! -d $DEBOOTSTRAP ] ; then echo "debootstrap directory not found, please edit DEBOOTSTRAP in $0" exit 1 fi  DIR=$( cd $(dirname $0) ; pwd) cp "$0" "$DIR/linuxrc.txt" $DEBOOTSTRAP scriptname=$( basename "$0" ) # rerun script in chrooted environment chroot $DEBOOTSTRAP bash -x "$scriptname" chrooted exit $? fi apt-get install --no-install-recommends busybox uboot-mkimage makedev dos2unix cd /tmp [ -f initrd.gz ] && rm initrd.gz dd if=/dev/zero of=initrd bs=1k count=0 seek=3K mke2fs -F -m 0 -b 1024 initrd tune2fs -c0 -i0 initrd mkdir INITRD mount -o loop initrd INITRD mkdir -p INITRD/{bin,lib,dev,etc/mdadm,proc,sbin} cp -a /dev/{null,console,tty,sd{a,b,c,d}?,md*} INITRD/dev/ cd INITRD/dev/ MAKEDEV sda sdb sdc sdd md cd - cp -aL /bin/busybox INITRD/bin/ cp -aL /sbin/mdadm /sbin/pivot_root INITRD/sbin libs2install=$( ldd INITRD/*bin/* | grep -v "^INITRD/" | sed -e 's/.*=> *//' -e 's/ *(.*//' | sort -u ) cp -aL $libs2install INITRD/lib ln -s INITRD/bin/busybox INITRD/bin/sh cp ../linuxrc.txt INITRD/linuxrc dos2unix INITRD/linuxrc chmod +x INITRD/linuxrc umount INITRD gzip initrd mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 -e 0x0 -n initrd -d initrd.gz ../initrd.buffalo
 * 1) !/bin/bash
 * 2) Licensed under GPL v3 or later
 * 3) make-initrd.txt -- This script will be executed on the LS
 * 1) edit this line as needed
 * 1) install some required stuff
 * 1) ensure sd? and md exits, even if chrooted installation does not have them
 * 1) find required libs and install into INITRD/lib