Pour commencer, redéfinissez la racine du système (via chroot) à l'intérieur de la partition chiffrée et créez le point de montage du périphérique d'amorçage :
chroot /mnt/efs mkdir /loader
Ensuite, créez le ramdisque initial (initrd), lequel sera nécessaire par la suite :
cd dd if=/dev/zero of=initrd bs=1k count=4096 mke2fs -F initrd mkdir ramdisk mount -o loop initrd ramdisk
Créez la hiérarchie du système de fichiers et copiez-y les fichiers requis :
mkdir ramdisk/{bin,dev,lib,mnt,sbin}
cp /bin/{bash,mount,umount} 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/
Ne soyez pas surpris si vous voyez un message du genre « /lib/libncurses.so.5: No such file or directory », ou « /lib/libtermcap.so.2: No such file or directory », c'est normal : bash n'a besoin que de l'une de ces deux bibliothèques. Vous pouvez vérifier laquelle est actuellement nécessaire avec la commande suivante :
ldd /bin/bash
Créez le script d'initialisation init (n'oubliez pas de remplacer « xxxxxxxxxx » par la graine que vous avez choisi) :
cat > ramdisk/sbin/init << "EOF"
#!/bin/sh
/sbin/losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2
/bin/mount -r -n -t ext2 /dev/loop0 /mnt
while [ $? -ne 0 ]
do
/sbin/losetup -d /dev/loop0
/sbin/losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2
/bin/mount -r -n -t ext2 /dev/loop0 /mnt
done
cd /mnt
/sbin/pivot_root . loader
exec /usr/sbin/chroot . /sbin/init
EOF
chmod 755 ramdisk/sbin/init
Démontez le périphérique de bouclage (loopback device) et compressez le fichier initrd :
umount -d ramdisk rmdir ramdisk gzip initrd mv initrd.gz /boot/
Je vous conseille vivement de démarrer votre système depuis un média en lecture seule, tel qu'un cd-rom amorçable.
Téléchargez et décompressez syslinux :
wget ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.07.tar.gz tar -xvzf syslinux-2.07.tar.gz
Configurez isolinux :
mkdir bootcd
cp /boot/vmlinuz-2.4.23 bootcd/vmlinuz
cp /boot/initrd.gz syslinux-2.07/isolinux.bin bootcd/
echo "DEFAULT vmlinuz initrd=initrd.gz ro root=/dev/ram0 vga=4" \
> bootcd/isolinux.cfg
Créez et gravez l'image iso sur un cd-rom amorçable :
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}
La partition d'amorçage est un périphérique de démarrage de remplacement : vous en aurez besoin si vous perdez votre CD amorçable. Rappellez-vous que hda1 est un média sur lequel il est possible d'écrire et que cela n'est pas sécurisé ; utilisez-le seulement en cas d'urgence !
Créer et montez le système de fichiers ext2 :
dd if=/dev/zero of=/dev/hda1 bs=8192 mke2fs /dev/hda1 mount /dev/hda1 /loader
Copiez le noyau et le ramdisque initial :
cp /boot/vmlinuz-2.4.23 /loader/vmlinuz cp /boot/initrd.gz /loader/
Si vous utilisez 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 vga=4
initrd /initrd.gz
EOF
grub-install --root-directory=/loader /dev/hda
umount /loader
Si vous utilisez 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
vga=4
EOF
lilo -r /loader
umount /loader