Faire un LiveCD personnalisé

Généralités

Linux propose une approche de solution pour résoudre cette problématique : "initial root filesystem or initramfs" (système racine primaire). Il est également utilisé dans les installations sur disques durs et ajoute de la flexibilité aux processus de démarrage. initramfs est un system de ficher virtuel. Il est compressé grace à CPIO (qui est un format d'archive similaire à tar) et contient un shell minimal et les modules noyeau nécessaires ua montage des fichiers racine et un certains nombres de scripts pour les processus pendant le démarrage. Le plus important de ces scripts est init à la racine de l'initramfs.

Fonctionnement

Le boot loader charge le noyeau et l'initramfs en mémoire et démarre le noyeau. Le noyeau décompresse l'initramfs et le monte comme système de fichiers racine primordial et cherche le script init dans le systeme de fichier qu'il vient de monter. S'il le trouve, il l'excécute et le passe la main pour continuer le démarrage. L'init s'occupe ensuite de trouver le vrai système de fichier et le monte. Toute autre opération nécessaire au démarrage du systeme via les média de type liveCD eput (et doit même) être intégrée dans les scripts présents dans l'initramfs.

Comment crée t-on l'initramfs

Bien que cela soit possible de le faire manuellement, cela n'est pas conseillé. Il existe des outils pour céer et mettre à jour un initramfs comme la commande update-initramfs. Mieux, ces outils permettent d'inclure des scripts personnalisés dans l'initramfs en les placant simplement dans les certains répertoires (/usr/share/initramfs/scripts).

Il n'y même pas besoin d'écrire ces scripts car il existe des paquets débian qui proposent des scripts dédiés au démarrages de liveCD/DVD comme par exemple caper. L'installation de casper dépose les scripts de casper sur les bons répertoires pour qu'ils soient pris en compte lors de la contruction de l'initramfs.

Arborescence d'un liveCD

(CD ROOT)
|-------+casper
|       |-------filesystem.${FORMAT}    
|       |-------filesystem.manifest
|       |-------filesystem.manifest-desktop
|       |-------vmlinuz
|       |-------initrd.img
|
|-------+boot
|       |--------+grub
|       |        |--------grub.cfg
|       |
|       |-------memtest86+
|
|--------md5sum.txt

Réalisation d'un liveCD personnalisé

Méthode simple :remastersys

sudo echo "deb http://www.remastersys.com/repository lucid/" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install remastersys -y
man remastersys # voir les options disponibles

sudo apt-get clean
sudo remastersys backup ubuntu_test.iso
sudo mv /home/remastersys/remastersys/ubuntu_test.iso ./

Méthode compliquée

Fixer le variable système

export WORK=~/work
export CD=~/cd
export FORMAT=squashfs
export FS_DIR=casper

Création des répertoires

sudo mkdir -p ${CD}/{${FS_DIR},boot/grub} ${WORK}/rootfs

Installation des paquets nécessaires

sudo apt-get update && sudo apt-get install grub2 xorriso squashfs-tools qemu

quemu est optionnel. Il permet juste de tester le cd live. On peu aussi utiliser virtualbox

Copier des données

sudo rsync -av --one-file-system --exclude=/proc/* --exclude=/dev/* \
--exclude=/sys/* --exclude=/tmp/* --exclude=/home/* --exclude=/lost+found \
--exclude=/var/tmp/* --exclude=/boot/grub/* --exclude=/root/* \
--exclude=/var/mail/* --exclude=/var/spool/* --exclude=/media/* \
--exclude=/etc/fstab --exclude=/etc/mtab --exclude=/etc/hosts \
--exclude=/etc/timezone --exclude=/etc/shadow* --exclude=/etc/gshadow* \
--exclude=/etc/X11/xorg.conf* --exclude=/etc/gdm/custom.conf \
--exclude=/etc/lightdm/lightdm.conf --exclude=${WORK}/rootfs / ${WORK}/rootfs

On peut également utiliser cp, mais rsync offre la possibilité directement d'exclure des emplacement et de limiter la copier une seule partition

Si le /boot est sur une autre partition, il faudra la copier avec :

sudo cp -av /boot/* ${WORK}/rootfs/boot

Personnalisation

Il est possible de retrouver dès le démarrage un environnement personnalisé avec le cd live en les mettant dans le "${WORK}/rootfs/etc/skel" . Par example pour concerver les configurations de l'environnement kde c'est :

sudo cp -rpv --parents ~/.kde ${WORK}/rootfs/etc/skel

Faire un chroot dans le nouveau système

sudo mount  --bind /dev/ ${WORK}/rootfs/dev
sudo mount -t proc proc ${WORK}/rootfs/proc
sudo mount -t sysfs sysfs ${WORK}/rootfs/sys
sudo chroot ${WORK}/rootfs /bin/bash

Maintenant vous êtes dans un chroot

LANG=

Quelques réglages

apt-get update

Si vous utilisez gnome

apt-get install ubiquity ubiquity-frontend-gtk

Si vous utilisez kde

apt-get install ubiquity ubiquity-frontend-kde

Ensuite installer tous les programmes qui doivent de trouver par défaut sur le liveCD/DVD

sudo apt-get install vim most gparted vlc

Nettoyer le cache de paquets

sudo apt-get clean

Mettre à jour initramfs

mettre à jour modules.dep

depmod -a $(uname -r) && update-initramfs -u -k $(uname -r)

Initramfs est chargé de préparer l'environnement nécessaire au démarrage sur le CD/DVD. le mettre à jour lui permet de disposer des scripts live installer avec casper

Enlever les utilisateurs non système

Les utilisateurs nons système sont ceux avec des uid => 1000. Un utilisateur avec l'uid 999 est supprimé car nous le réservons pour l'utilisateur liveCD

for i in `cat /etc/passwd | awk -F":" '{print $1}'`;
do;
        uid=`cat /etc/passwd | grep "^${i}:" | awk -F":" '{print $3}'`;
        [ "$uid" -gt "998" -a  "$uid" -ne "65534"  ] && userdel --force ${i} 2>/dev/null;
done;

Nettoyage du système

Nettoyage des logs

find /var/log -regex '.*?[0-9].*?' -exec rm -v {} \;

Les fichiers logs restant sont mis à zéro même su le système se plaint de leur suppression

find /var/log -type f | while read file
do
        cat /dev/null | tee $file
done

rm /etc/resolv.conf /etc/hostname;
exit;

Préparer l'arborescence du CD

Copier le kernel et l'initramfs mis à jour et le memtest dans le chroot

export kversion=`cd ${WORK}/rootfs/boot && ls -1 vmlinuz-* | tail -1 | sed 's@vmlinuz-@@'`
sudo cp -vp ${WORK}/rootfs/boot/vmlinuz-${kversion} ${CD}/${FS_DIR}/vmlinuz
sudo cp -vp ${WORK}/rootfs/boot/initrd.img-${kversion} ${CD}/${FS_DIR}/initrd.img
sudo cp -vp ${WORK}/rootfs/boot/memtest86+.bin ${CD}/boot

Générer le manifest

Uniquement utile si on installe l'installer Ubiquity. Cela génère 2 fichiers (filesystem.manifest & filesystem.manifest-desktop).

sudo chroot ${WORK}/rootfs dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee ${CD}/${FS_DIR}/filesystem.manifest
sudo cp -v ${CD}/${FS_DIR}/filesystem.manifest{,-desktop}

REMOVE='ubiquity casper user-setup os-prober libdebian-installer4'

for i in $REMOVE ;
do
        sudo sed -i "/${i}/d" ${CD}/${FS_DIR}/filesystem.manifest-desktop;
done;

Ces 2 fichiers sont utilisés par l'installateur ubiquity lors de l'installation sur le disque. Ils ne sont que des listes de paquets. Ubiquity compare ces 2 fichiers et supprime les paquets spécifiques filesystem.manifest. Ainsi lors de l'installation, les paquets comme casper qui ne sont utiles que dans une cession live sont supprimés. Les paquets à supprimer lors de l'instalation sont définis dans la variable $REMOVE.

Démonter les répertoires

sudo umount ${WORK}/rootfs/proc
sudo umount ${WORK}/rootfs/sys
sudo umount ${WORK}/rootfs/dev

Covertir le répertoire en saquashfs

sudo mksquashfs ${WORK}/rootfs ${CD}/${FS_DIR}/filesystem.${FORMAT} -noappend

Il est important de vérifier que la taille finale peut être contenu dans un CD/DVD

Faire filesystem.size

echo -n $(sudo du -s --block-size=1 ${WORK}/rootfs | tail -1 | awk '{print $1}') | sudo tee ${CD}/${FS_DIR}/filesystem.size

Calculer le MD5

find ${CD} -type f -print0 | xargs -0 md5sum | sed "s@${CD}@.@" | grep -v md5sum.txt | sudo tee -a ${CD}/md5sum.txt

Faire de Grub le bootloader sur le cd

sudo vi ${CD}/boot/grub/grub.cfg

Et y copier le texte suivant

set default="0"
set timeout=10

menuentry "Ubuntu GUI" {
linux /casper/vmlinuz boot=casper quiet splash
initrd /casper/initrd.img
}

menuentry "Ubuntu in safe mode" {
linux /casper/vmlinuz boot=casper xforcevesa quiet splash
initrd /casper/initrd.img
}

menuentry "Ubuntu CLI" {
linux /casper/vmlinuz boot=casper textonly quiet splash
initrd /casper/initrd.img
}

menuentry "Ubuntu GUI persistent mode" {
linux /casper/vmlinuz boot=casper persistent quiet splash
initrd /casper/initrd.img
}

menuentry "Ubuntu GUI from RAM" {
linux /casper/vmlinuz boot=casper toram quiet splash
initrd /casper/initrd.img
}

menuentry "Check Disk for Defects" {
linux /casper/vmlinuz boot=casper integrity-check quiet splash
initrd /casper/initrd.img
}

menuentry "Memory Test" {
linux16 /boot/memtest86+.bin
}

menuentry "Boot from the first hard disk" {
set root=(hd0)
chainloader +1
}

Construire le CD/DVD

sudo grub-mkrescue -o ~/live-cd.iso ${CD}

Eventuellement le tester avec

qemu -cdrom ~/live-cd.iso -boot d

Et nettoyer l'espace de travail

[ -d "$WORK" ] && rm -r $WORK $CD

Tester

ZAO/Réunions/201201/custom_livecd (dernière édition le 2012-01-17 18:40:21 par FranckKouyami)