Publié le samedi 28 février 2009, mis a jour le dimanche 2 août 2009, par Stephane Malinet
L’initramfs permet d’inclure à la fin du démarrage du noyau un mini système de fichier en mémoire vous permettant de lancer par exemple des outils de detection matériel, decrypter la racine d’un système ,ou , dans mon cas, l’activation des volumes LVM pour la racine de mon système.
Il y a deux possibilités : compiler l’initramfs dans le noyau ou alors en faire une archive. Nous verrons cela au moment de la configuration du noyau.
L’ outils de base nécéssaire à faire un initramfs est sys-apps/busybox, en plus de votre noyau bien sûr. Mais il doit impérativement être compilé statiquement, c’est-à-dire avec les bibliothèques nécéssaires inclues dans le binaire executable afin de le rendre autonome.
USE=static emerge -av1 busybox
Passons à la création de ce mini système qui sera executé avant le vrai
cd /usr/src/
mkdir -p initramfs initramfs/{bin,dev,etc,proc,root,sbin,sys,mnt}
Maintenant mettons le binaire statique de busybox :
cd initramfs
cp -a /bin/bb bin/busybox
L’init est une partie trés importante de votre iniramfs car c’est ce script qui va être exécuté par le noyau.
Créez un fichier init :
touch init && chmod +x init
Editez et mettez le code qui suit :
#!/bin/busybox sh
f_mini_udev()
{
busybox --install -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
}
# mount proc, sys and a mini udev
mount -t proc none /proc
mount -t sysfs none /sys
f_mini_udev
# do your magic here
echo Booting: Initramfs
# LVM
#lvm vgscan
#lvm vgchange -a y
# mount the root filesystem, if error then open a shell
mount -o ro,noatime,logbufs=8 /dev/sda2 /root || exec sh
# clean up
umount /proc
umount /sys
# boot the real thing
exec switch_root /root /sbin/init
Configurez votre noyau comme ce qui suit si vous voulez y inclure l’initramfs :
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/usr/src/initramfs)
Sinon en externe :
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
()
Créez un script vous permettant de générer facilement l’archive cpio
touch /usr/src/mkinitramfs && chmod +x /usr/src/mkinitramfs
Editez et mettez le code qui suit :
#!/bin/bash
cd /usr/src/initramfs
find . | cpio -H newc -o > ../initramfs.cpio
cd ..
cat initramfs.cpio | gzip > initramfs.gz
Executez le script :
/usr/src/initramfs
Copiez votre archive dans /boot
cp /usr/src/initramfs.gz /boot
Ensuite il vous faudra configurer votre chargeur de démarrage.
Editez le fichier /boot/grub/grub.conf :
default 0
timeout 05
splashimage=(hd0,0)/grub/splash.xpm.gz
title=GENTOO 2.6.27 Gentoo R8
root (hd0,0)
kernel /kernel-2.6.27-gentoo-r8 root=/dev/sda2 video=vesafb:mtrr:3,ywrap vga=0x31a
initrd /initramfs.gz
Il ne vous reste plus qu’à rebooter... bonne chance ;-)