Construire un LiveCD Ubuntu persistant et/ou un PenDrive Linux

…avec Kubuntu 8.04.1 (ça devrait très bien marcher également avec n’importe quel Ubuntu ou Xubuntu 8.04)

Après toutes les étapes qui ont été vues précédemment pour essayer de construire un liveCD persistant à partir d’un liveCD kubuntu 8.04.1, on récapitule maintenant les étapes importantes pour faire un liveCD qui marche (si possible) en mode persistant et son pendant pendrive tel décrit dans l’article précédant chronologiquement celui-ci.
On pourra soit démarrer le linux à partir du CD en mode persistant (ou non persistant aussi d’ailleurs), soit le démarrer directement sur la clef USB (également en mode persistant ou non). En cas de démarrage en mode persistant, on aura la même config quelque soit le mode de démarrage. Il est par ailleurs normalement possible de conserver une partition lisible sous windows sur la clef USB. Les possibilités sont réellement multiples. Bien entendu, pour mettre tout cela sur la clef, il est préférable d’avoir une clef d’une taille conséquente (4 ou 8 Go).

  1. Création du CD à partir d’une image existante
    • on récupère l’image du LiveCD 8.04.1 ici (ne pas sélectionner “alternate CD“) et on la place dans notre répertoire principal que l’on appellera “$test”
    • on récupère la version 1.135 de Casper ici. On peut la placer également dans $test.
    • C’est tout ce que l’on a à télécharger.

    • on développe l’image du CD et on la copie dans un répertoire de travail :

      cd $test
      mkdir iso
      sudo mount -o loop ubuntu-desktop-xxx.iso /cdrom
      sudo cp -a /cdrom/. iso
      sudo umount /cdrom

      n.b.: voir les premières étapes de Comment personnaliser son live cd ubuntu.

    • on peut d’ores et déjà faire un petit peu de nettoyage :

      cd iso
      sudo rm -r autorun.inf pics wubi.exe umenu.exe
      cd ..

      Ce n’est pas grand chose, mais ça ne mange pas de pain.

    • on déplie le squashfs qui est la partition compressée :

      mkdir squashfs
      sudo mount -t squashfs -o loop iso/casper/filesystem.squashfs /cdrom
      sudo cp -a /cdrom/. squashfs
      sudo umount /cdrom

    • on passe en chroot dans le squashfs pour faire quelques opérations de mise à jour

      sudo mount --bind /proc squashfs/proc
      sudo mount --bind /sys squashfs/sys
      sudo cp /etc/resolv.conf squashfs/etc/resolv.conf
      sudo cp /etc/apt/sources.list squashfs/etc/apt/sources.list

      à ce stade, on peut modifier le sources.list si on veut retirer/ajouter des dépots. Une fois ceci fait (pour les détails de qui fait quoi, toujours se reporter ici), on passe en chroot et on fait ce qu’on a à faire :

      sudo chroot squashfs
      apt-get update # mise à jour de la liste des paquets disponibles
      apt-get dist-upgrade # mise à jour des paquets
      apt-get install console-data # sélectionner manuellement le clavier français ("choisir un codage clavier pour votre architecture")

      • pour connaître la liste des paquets installés et la place qu’il prennent, on utilise :
        dpkg-query -W --showformat='${Installed-Size} ${Package}\n' | sort -nr | less
      • On retire un paquet avec :
        apt-get remove --purge ##nom-du-paquet##
      • On installe un paquet avec :
        apt-get install ##nom-du-paquet##
      • On peut repérer et supprimer les paquets de langages un peu lourds qui ne serviront pas :
        dpkg-query -W --showformat='${Package}\n' | grep language
        (garder ceux comportant “fr” et supprimer les autres, sauf “language-selector” de mémoire)
      • une fois toutes les opérations sur les paquets effectuées, on nettoie les restes de paquets :
        apt-get clean
      • On peut alors ressortir du chroot

      umount /sys
      umount /proc
      rm /etc/resolv.conf
      exit

    • on met à jour casper et on ajoute le sleep qui corrige benoitement un bug :
      • décompresser casper dans $test en utilisant par exemple “sudo tar -xzf casper_xxx.tar.gz
      • copier les fichiers qui vont bien vers le squashfs (presque tout se passe dans $test/squashfs/usr/share/initramfs-tools/ ) :

        cd squashfs/usr/share/initramfs-tools
        cp -a $test/casper/scripts/. scripts
        cp -a $test/casper/hooks/. hooks
        cd ..
        cp -a $test/casper/bin/casper-[pr]* casper
        cd ../..
        cp -a $test/casper/bin/casper-[glns]* sbin

        à ce stade, je ne sais pas exactement ce qu’il faut faire des fichiers qui se trouvent dans le “ubiquity-hooks” de casper.

      • on modifie le script casper pour régler (très salement, j’en conviens, mais au moins ça marche) le problème de synchro entre les scripts pour la détection de la partition persistente :
        • ouvrir “$test/squashfs/usr/share/initramfs-tools/scripts/casper” avec l’éditeur de votre choix en mode superutilisateur.
        • trouver les lignes correspondant au montage de la partition persistante (”mkdir -p /cow” vers la ligne 380)
        • insérer une ligne et y ajouter “sleep 5″ par exemple (ou plus, ou moins, suivant l’humeur, chez moi sleep 5 suffit sur tous les pc testés).
        • sauver, quitter, revenir à $test.
    • on repasse en chroot dans le squashfs pour reconstruire le initrd.gz

      sudo mount --bind /proc squashfs/proc
      sudo mount --bind /sys squashfs/sys
      sudo chroot squashfs
      update-initramfs -k all -u
      umount /sys
      umount /proc
      exit

    • on reconstruit le squashfs après avoir modifié “$test/squashfs/etc/casper.conf” si on veut un peu plus personnaliser le système…

      cd $test
      sudo -s
      apt-get install squashfs-tools
      rm iso/casper/filesystem.squashfs
      chmod a+w iso/casper/filesystem.manifest
      chroot squashfs dpkg-query -W --showformat='${Package} ${Version}\n' > iso/casper/filesystem.manifest
      chmod go-w iso/casper/filesystem.manifest
      chmod a+w iso/casper/filesystem.manifest-desktop
      chroot squashfs dpkg-query -W --showformat='${Package} ${Version}\n' > iso/casper/filesystem.manifest-desktop
      chmod go-w iso/casper/filesystem.manifest-desktop
      cd squashfs
      mksquashfs . ../iso/casper/filesystem.squashfs -nolzma -info
      exit

      attention, la ligne mksquashfs est particulièrement longue à exécuter.

    • on place correctement le initrd.gz, pour ça, on peut utiliser “casper-new-uuid”

      cd $test
      cp casper/bin/casper-new-uuid .
      sudo ./casper-new-uuid $test/squashfs/boot/initrd.img-2.6xx $test/iso/casper $test/iso/.disk

    • on met à jour l’image du noyau :
      sudo cp squashfs/boot/vmlinuz-2.6xx iso/casper/vmlinuz
    • on peut changer les paramètres de l’isolinux pour que le boot persistant apparaisse dans le menu de démarrage. On édite le “$test/iso/isolinux/isolinux.cfg” en mode superutilisateur et on y ajoute par exemple les lignes

      LABEL persist
      menu label ^Demarrage en mode persistant (casper-rw/home-rw)
      kernel /casper/vmlinuz
      append file=/cdrom/preseed/kubuntu.seed boot=casper persistent initrd=/casper/initrd.gz splash --

    • On peut également retirer les “quiet” dans les quelques lignes du “isolinux.cfg” pour avoir un affichage un petit peu plus fourni au démarrage.
    • On peut aussi forcer le langage français :
      echo "fr" | sudo tee $test/iso/isolinux/lang
    • on reconstruit la table des sommes MD5 :
      cd iso ; sudo find . -type f -print0 |xargs -0 md5sum |sudo tee md5sum.txt ; cd ..
    • on reforme l’image iso :
      sudo mkisofs -r -V "Custom Ubuntu Live CD" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o custom-live-cd-i386.iso iso
    • rq : ne pas tout de suite effacer les fichiers qui ont servi à construire l’image iso, ils vont resservir par la suite si l’on veut que la clef USB soit elle aussi bootable.

  2. Préparation de la clef USB
    • on ouvre fdisk sur la partition de la clef usb, on efface la partition existante.
      Supposons que la partition de la clef USB qui se monte par défaut soit /dev/sda1, remplacer “x” par “a” dans les lignes suivantes, sinon, adapter…

      sudo umount /dev/sdx1
      sudo fdisk /dev/sdx

      taper “p” (”print”) affiche la partition, “d” permet de l’effacer (”delete”)

    • on crée une partition 1 en fat32 si on veut qu’une partition soit encore visible par windows sur la clef (stockage de données d’échange) :
      taper “n” (pour “new”), puis choisir “partition primaire”, sélectionner une taille. “t” pour “toggle” permet de changer le type de partition, choisir FAT32.
    • création de la partition en FAT16 que l’on va rendre bootable :
      taper “n” (”new”), choisir partition primaire, partition n°2 s’il y a déjà une partition FAT32, donner une taille très légèrement supérieure à la taille de l’image iso obtenue pour le liveCD. Taper “a” pour activer cette partition pour la rendre bootable. “t” puis “6″ (FAT16).
    • création de la partition persistante de type linux. Nouvelle partition, primaire, n° 2 ou 3 suivant ce qui est déjà utilisé. type linux (c’est le type qui est donné par défaut).
    • On quitte fdisk (avec “w” comme “write”) après avoir vérifié par “p” que tout est correct.
    • On formatte les partitions qui ont lieu en nommant la partition persistante correctement.

      sudo mkfs.vfat -F 32 -n data /dev/sdx1 # partition FAT32 (ou bien la formater sous windows)
      sudo mkfs.vfat -F 16 -n kubuntu8 /dev/sdx2 # partition de boot (FAT16)
      sudo mkfs.ext2 -b 4096 -L casper-rw /dev/sdx3

      Dans la dernière ligne, on peut remplacer -L casper-rw par -L home-rw pour un home persistant au lieu d’un root persistant.
      N.b. : En alternative à la partition persistante linux, le fichier persistant en loopback “casper-rw” ou “home-rw” créé avec une commande du style
      dd if=/dev/zero of=/media/hda1/casper-rw bs=1M count=512
      sur une partition non linux et ensuite formaté en ext2 ou ext3 (cf ici) ne peut fonctionner que sur une partition vfat. Cette limitation apparait dans les commentaires des scripts de casper. Par ailleurs, il me semble qu’un fichier vfat doit faire une taille maximale d’un giga.

    • on prépare syslinux pour la partition en FAT16. Installer les packages syslinux et mtools et executer syslinux pour la partition kubuntu8 :

      sudo apt-get install syslinux mtools
      sudo syslinux -sf /dev/sdx2

    • On modifie le liveCD pour qu’il marche sur une clef usb. On ré-utilise les fichiers qu’on avait gardés après la formation de l’image iso. Débrancher et rebrancher la clef USB (manip nécessaire après le fdisk), puis ouvrir la partition kubuntu8 (FAT16) pour qu’elle soit montée au bon endroit (”/media/kubuntu8″)

      cd $test/iso
      sudo cp -rfv casper dists install pool preseed .disk isolinux/* md5sum.txt README.diskdefines install/mt86plus /media/kubuntu8
      cd /media/kubuntu8

      Il faut maintenant renommer le fichier “isolinux.cfg” en “syslinux.cfg” et le modifier légèrement. On l’édite avec les droits super-utilisateur pour remplacer “file=/cdrom/preseed/kubuntu.seed” par “file=/preseed/kubuntu.seed”. On change également “kernel /install/mt86plus” en “kernel /mt86plus” dans la section memory test. On peut sinon se baser sur le fichier “syslinux.cfg” fourni par pendrivelinux.com ici

    • on peut reconstituer les sommes md5 pour un peu plus de propreté :

      cd /media/kubuntu8
      sudo find . -type f -print0 |xargs -0 md5sum |sudo tee md5sum.txt

    • c’est tout !

  3. Ça marche ?
  4. Pour info, avec mes bios, je ne peux pas booter sur une partition qui n’est pas la première partition d’une clef USB. Donc, je ne sais pas si ça peut marcher en réalité de laisser une partition en FAT32 en première partition et de booter sur la suivante.

Aucun commentaire pour le moment

Laissez une réponse