Also: Fuer ein Fake-RAID benoetigst Du dmraid, und natuerlich den Device-Mapper, denn darauf baut dmraid auf.
Um das System booten zu koennen benoetigst Du eine Partition ausserhalb des RAID, und zwar muss darauf der Kernel liegen, also eine Partition fuer /boot. Diese muss nicht gross sein, erfahrungsgemaess sind 30MB schon weit mehr als ausreichend.
Zusaetzlich muss das RAID vom Kernel aktiviert werden, was, wenn ich mich nicht irre, ueber diesen Aufruf geschieht:
Dies muss natuerlich passieren bevor der Kernel das Root-Dateisystem (welches sich ja im RAID befindet) mountet. Um das zu erreichen brauchst Du eine Initial RamDisk (InitRD) oder besser (da der Nachfolger von InitRD) ein InitRamFs.
Gentoo sollte eigentlich all dies bieten koennen, denn selbst mein EasyLFS kann dies, in der kommenden Version 0.4, und Gentoo sollte doch etwas ausgereifter sein.
Alternativ kannst Du das InitRamFs auch selbst bauen, all zu schwer ist das nicht. Du brauchst ein paar Tools und ein Init-Script welches die Root-Partition nutzbar macht und startet.
Als Beispiel mal das Init-Script welches ich zur Zeit in der Dev-Version von EasyLFS im InitRamFs einsetze.
Code:
#!/bin/sh
/bin/mount proc -t proc /proc
/bin/mount sysfs -t sysfs /sys
/bin/udevstart
if [ -x /sbin/mdadm ] && [ -r /etc/mdadm.conf ]; then
/sbin/mdadm --assemble --scan
fi
if [ -x /sbin/dmraid ]; then
/sbin/dmraid -ay
fi
if [ -x /sbin/lvm ]; then
if [ "$(/sbin/lvm lvscan | /bin/grep root)" != "" ]; then
/sbin/lvm vgchange -ay
fi
fi
if [ -x /sbin/cryptsetup ] && [ -r /etc/cryptroot ]; then
CRYPTROOT=$(/bin/cat /etc/cryptroot)
/sbin/cryptsetup luksOpen ${CRYPTROOT} cryptroot
fi
ROOTDEV=$(/sbin/findfs LABEL=elfsroot)
if [ "${ROOTDEV}" != "" ]; then
ROOTFS=$(/bin/fstype ${ROOTDEV} | /bin/grep FSTYPE | /bin/awk -F '=' '{ print $2 }')
echo "Found root-device ${ROOTDEV} with file-system ${ROOTFS}"
/bin/mount -t ${ROOTFS} ${ROOTDEV} /easylfs
cd /easylfs
RUNLEVEL=$(/bin/cat /easylfs/etc/inittab | /bin/grep id | /bin/awk -F ':' '{ print $2 }')
exec /bin/run-init /easylfs /sbin/init ${RUNLEVEL}
else
echo "No root-device found!"
fi
Hier ist im Grunde alles drin, Software-RAID, Fake-RAID, LVM und verschluesselte Root-Dateisysteme koennen hier aktiviert werden.
Ein paar der Tools kommen aus KLibC (wie z.B. run-init), die meisten aber (wie z.B. cat oder awk) sind GNU-Tools.
Mit dem folgenden Script kopiere ich Programme in das InitRamFs.
Code:
#!/bin/sh
if [ ! -r ${1} ] || [ "${2}" = "" ] || [ ! -w ${2} ]; then
exit 0
fi
if [ "$(echo ${1} | grep lib)" != "" ]; then
echo "Copying library: ${1}"
cp ${1} ${2}/lib
else
if [ "$(echo ${1} | grep bin)" != "" ]; then
if [ "$(echo ${1} | grep sbin)" != "" ]; then
echo "Copying superuser binary: ${1}"
cp ${1} ${2}/sbin
else
echo "Copying binary: ${1}"
cp ${1} ${2}/bin
fi
else
echo "Not copying unknown file: ${1}"
fi
fi
for ENTRY in $(ldd ${1}); do
if [ "$(echo ${ENTRY} | grep /)" != "" ]; then
FILENAME=$(echo ${ENTRY} | sed 's@^.*/@@')
if [ ! -r ${2}/lib/${FILENAME} ]; then
${0} ${ENTRY} ${2}
fi
fi
done
Hierbei wird eben nicht nur das Programm selbst kopiert, sondern eben auch von diesem benoetigte Libraries, natuerlich rekursiv, da die Libraries moeglicherweise auch wieder andere Libraries voraussetzen.
Schlussendlich, wenn das InitRamFs fertig ist (testen kannst Du es z.B. mit chroot), muss dieses in den Kernel gebacken werden. Anders als eine InitRD wird das InitRamFs fest in den Kernel integriert, und liegt nicht in einer externen Datei.
Aber wie zuvor erwaehnt sollte Gentoo eigentlich in der Lage sein Dir all dies abzunehmen. Wie Du das aber veranlasst weiss ich nicht da ich mit Gentoo bislang nichts gemacht habe.