Faire un LiveCD personnalisé
Généralités
- Un cd ou un dvd est une média en lecture seule. Linux a besoin d'avoir des droits en écriture sur certaines parties du système pour fonctionner correctement (/var, /tmp, /dev, /proc). Il y a beaucoup de façons de résoudre ce problème et toutes utilisent la mémoire ram. Certaines de ces méthodes n'autorisent qu'un accès très limité à certains emplacements essentiels et de ce fait, ne permettent pas à l'utilisateur de modifier en profondeur l'installation ou d'installer de nouveau paquet. D'autres méthodes comme aufs2 qui est utilisées dans ce tutoriel, accorde des droits étendus en écriture à l'utilisateur sur le système. ceci est réalisé en combinant la RAm avec le le système de fichier en lecture seul du CD/DVD live pour le faire passer pour un seul système de fichier avec des accès en lecture/ecriture. Aufs2 doit être monté au démarrage.
- Avec l'installation sur le disque dur, l'emplacement du du système de fichier racine est fixée. Soit il est indiqué au noyeau au démarrage avec le paramêtre " root=/dev/...". Avec un liveCD∕DVD, l'emplacement de la racine n'est pas précisée car la machine peut avoir plusieurs lecteur CD/DVD qui peuvent respecter plusieurs types (scsi, sas , sata, ide ..). Donc pour que le système de fichier racine soit monté, il doit exister un moyen de l'identifier et de charger les modules correspondants et ce même avant de connaître le contenu de la partition racine
- Pour pouvoir être gravé sur un cdrom, le système de fichier doit être compressé au format squashfs. Nous avons besoin donc de le détecter et de disposer des bons modules pour le monter et l'utiliser.
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
- /casper/filesystem.${FORMAT}: Ceci est le contenaire de systeme de fichier qui sera copier sur le disque dur de la machine. Il est compressé en au format squashfs
- /casper/filesystem.manifest: Optionnel. Il n'est utile que si Ubuntu Installer est inclut dans le CD.
- /casper/filesystem.manifest-desktop: Idem
- /casper/vmlinuz: Le noyeau linux. Il est copier à partir de noyeau de l'instalation local
- /casper/initrd.img: L'initramfs qui contient les personnalisations nécessaires au live CD/DVD.
- /boot/grub/grub.cfg: Fichier contenant les options de démarrage grub
- /boot/memtest86+: Fichier optionnel utilisé pour tester la RAM de la machine en mode live
- /md5sum.txt: Fichier optionnel contennant le MD5 checksums pour tous les fichiers du CD
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
- Faire toutes les personnalisations requises. Installer tous les programmes et mettre toutes les données/configuration à conserver sur le liveCD.
- Enlever tous ce qui n'est pas utile
sudo apt-get clean sudo remastersys backup ubuntu_test.iso sudo mv /home/remastersys/remastersys/ubuntu_test.iso ./
- Récupérer l'iso et tester
- Pensez à l'option "dist" qui permet de ne pas sauvegarder les données des utilisateurs
Méthode compliquée
Fixer le variable système
export WORK=~/work export CD=~/cd export FORMAT=squashfs export FS_DIR=casper
- Le répertoire work est l'emplacement des fichier temporaire et l'endroit où nous monteron le système de fichier
- Le répertoire CD contient l'arborescence du CD
- FORMAT est le type de système de fichier à utiliser
- FS_DIR est l'emplacement de l'image de l'actuelle système de fichier dans l'arborescence du CD
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