= 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