Initrd for Raid-Boot
From NAS-Central Buffalo - The Linkstation Wiki
Lsuser1985 (Talk | contribs) (→File make-initrd.txt) |
Lsuser1985 (Talk | contribs) m (no longer "work in progress") |
||
| Line 2: | Line 2: | ||
'''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. | '''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 == | == Credits == | ||
Latest revision as of 18:55, 10 May 2011
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.
Contents |
Credits
Some ideas are taken from Debian Lenny on LS-WXL#Create an initrd.
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#Debootstrap. 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:
- Create an empty file and mount it as a filesystem to be able to copy data into
- Into this mounted filesystem
- copy a prepared linuxrc script
- copy all binaries required by linuxrc plus the libraries required by the binaries
- create all required directories and device nodes required
- unmount the filesystem-file
- compress the file and make an initrd out of
For that you will
- Create and edit a text-file/script linuxrc.txt
- Create a text-file/script make-initrd.txt
- Copy both files to your LS
- Fix the line endings
- 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#Personalize the deboostrap) prior to building the initrd.
Detailed description
- Create a text-file/script linuxrc.txt with the content shown below
- Uncomment the line echo "0x..." > ... which matched the device to be used as root
- Create a text-file/script make-initrd.txt with the content shown below
- Change the DEBOOTSTRAP=... line at the top to match your debootstraped environment.
- Copy both files to your LS.
- Now log into your LS and continue there.
- 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 :-)
- Run the script on your LS. Assuming you copied the file to /mnt/disk1/share, the command will be
sh /mnt/disk1/share/make-initrd.txt
- 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.
#!/bin/busybox sh # linuxrc - to be put into the initrd # Mount the /proc and /sys filesystems. 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 # use /dev/md1 as root echo "0x901" > /proc/sys/kernel/real-root-dev # use /dev/md2 as root #echo "0x902" > /proc/sys/kernel/real-root-dev # use /dev/sda6 as root # echo "0x806" > /proc/sys/kernel/real-root-dev # use /dev/sdb6 as root # echo "0x822" > /proc/sys/kernel/real-root-dev # Clean up. umount /proc umount /sys
File make-initrd.txt
Put this into a textfile called make-initrd.txt.
#!/bin/bash
# Licensed under GPL v3 or later
# make-initrd.txt -- This script will be executed on the LS
# edit this line as needed
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
# install some required stuff
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/
# ensure sd? and md exits, even if chrooted installation does not have them
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
# find required libs and install into INITRD/lib
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

