Om mee te beginnen, ga je middels chroot naar de versleutelde partitie en maakt het mountpoint aan voor het bootdevice:
chroot /mnt/efs mkdir /loader |
Maak vervolgens de initiële ramdisk (initrd) aan, welke daarna nodig zal zijn:
cd dd if=/dev/zero of=initrd bs=1k count=4096 mke2fs -F initrd mkdir ramdisk mount -o loop initrd ramdisk |
Als je gebruik maakt van grsecurity, dan kun je de foutmelding "Permission denied" krijgen; in dat geval moet je buiten de chroot-omgeving om de mount opdracht uitvoeren.
Maak de bestandssysteemhiërarchie aan en kopieer hier de vereiste bestanden naartoe:
mkdir ramdisk/{bin,dev,lib,mnt,sbin}
cp /bin/{bash,mount} ramdisk/bin/
ln -s bash ramdisk/bin/sh
mknod -m 600 ramdisk/dev/console c 5 1
mknod -m 600 ramdisk/dev/hda2 b 3 2
mknod -m 600 ramdisk/dev/loop0 b 7 0
cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/
cp /lib/{libncurses.so.5,libtermcap.so.2} ramdisk/lib/
cp /sbin/{losetup,pivot_root} ramdisk/sbin/ |
Het is in orde als je een melding te zien krijgt als "/lib/libncurses.so.5: No such file or directory", of "/lib/libtermcap.so.2: No such file or directory"; bash vereist slechts één van deze twee library's. Je kunt nagaan welke daadwerkelijk is vereist met:
ldd /bin/bash |
Compileer het sleep programma, dat zal voorkomen dat de password prompt zal worden overspoeld door kernelmeldingen (zoals usb apparaten die worden geregistreerd).
cat > sleep.c << "EOF"
#include <unistd.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
if( argc == 2 )
sleep( atoi( argv[1] ) );
return( 0 );
}
EOF
gcc -s sleep.c -o ramdisk/bin/sleep
rm sleep.c |
Maak het initscript aan (vergeet niet "xxxxxx" te vervangen door je gekozen wachtwoord):
cat > ramdisk/sbin/init << "EOF"
#!/bin/sh
/bin/sleep 3
/sbin/losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2
/bin/mount -r -n -t ext3 /dev/loop0 /mnt
while [ $? -ne 0 ]
do
/sbin/losetup -d /dev/loop0
/sbin/losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2
/bin/mount -r -n -t ext3 /dev/loop0 /mnt
done
cd /mnt
/sbin/pivot_root . loader
exec /usr/sbin/chroot . /sbin/init
EOF
chmod 755 ramdisk/sbin/init |
Ontkoppel het loopback device en comprimeer initrd:
umount -d ramdisk rmdir ramdisk gzip initrd mv initrd.gz /boot/ |
Ik adviseer je het systeem met read-only media, zoals een opstartbare CD-ROM, op te starten.
Download syslinux en pak het uit:
wget http://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.10.tar.bz2 tar -xvjf syslinux-2.10.tar.bz2 |
Configureer isolinux:
mkdir bootcd
cp /boot/{vmlinuz,initrd.gz} syslinux-2.10/isolinux.bin bootcd
echo "DEFAULT /vmlinuz initrd=initrd.gz ro root=/dev/ram0" \
> bootcd/isolinux.cfg |
Maak en brand een opstartbaar cd-rom iso-image:
mkisofs -o bootcd.iso -b isolinux.bin -c boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-J -hide-rr-moved -R bootcd/
cdrecord -dev 0,0,0 -speed 4 -v bootcd.iso
rm -rf bootcd{,.iso} |
De bootpartitie kan van pas komen mocht je je opstartbare CD kwijtraken. Denk eraan dat hda1 schrijfbaar en dus onveilig is; gebruik het alleen in geval van nood!
Maak het ext2 bestandssysteem aan en mount het:
dd if=/dev/zero of=/dev/hda1 bs=8192 mke2fs /dev/hda1 mount /dev/hda1 /loader |
Kopieer de kernel en de initiële ramdisk:
cp /boot/{vmlinuz,initrd.gz} /loader |
Als je gebruik maakt van grub:
mkdir /loader/boot
cp -av /boot/grub /loader/boot/
cat > /loader/boot/grub/menu.lst << EOF
default 0
timeout 10
color green/black light-green/black
title Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/ram0
initrd /initrd.gz
EOF
grub-install --root-directory=/loader /dev/hda
umount /loader |
Als je gebruik maakt van lilo:
mkdir /loader/{boot,dev,etc}
cp /boot/boot.b /loader/boot/
mknod -m 600 /loader/dev/hda b 3 0
mknod -m 600 /loader/dev/hda1 b 3 1
mknod -m 600 /loader/dev/ram0 b 1 0
cat > /loader/etc/lilo.conf << EOF
lba32
boot=/dev/hda
prompt
timeout=100
image=/vmlinuz
label=Linux
initrd=/initrd.gz
read-only
root=/dev/ram0
EOF
lilo -r /loader
umount /loader |