====== Utilisation de live-package pour booter Debian en réseau ====== Le programme ''make-live'' fourni par le paquet ''live-package'' permet de générer des liveCD de Debian. Il permet aussi de générer une archive //tarball// pour démarrer une machine en PXE. ===== Documentation ===== * Le site officiel du projet : [[http://debian-live.alioth.debian.org/]] * Le wiki qui donne toutes les informations utiles : [[http://wiki.debian.org/DebianLive/]] ===== Installation sous Sarge ===== La documentation explique la méthode pour installer le programme ''live-package'' sous Sarge car il n'y est pas de base. Ce paquet est disponible uniquement à partir de Etch. Modifier le fichier ''/etc/apt/source.list'' : deb http://www.backports.org/debian sarge-backports main contrib non-free deb http://ftp2.fr.debian.org/debian/ testing main contrib non-free Modifier le fichier ''/etc/apt/preferences'' : Package: * Pin: release a=testing Pin-Priority: 10 Mettre à jour la liste des paquets : apt-get update Installer les paquets : apt-get install -t sarge-backports cdebootstrap apt-get install genext2fs mkisofs squashfs-tools apt-get install -t testing live-package ===== Utilisation de la commande make-live ===== Toutes les valeurs par défaut sont dans ''/etc/make-live.conf''. On peut tout modifier à la ligne de commande. Voici un exemple d'appel : #!/bin/bash make-live -d etch \ -f standard \ --filesystem plain \ --server-address 192.168.0.1 \ --server-path /tftpboot \ -t net \ -m http://ftp2.fr.debian.org/debian \ -p `pwd`/paquet \ -s "main contrib non-free" * -d : le nom de la distribution à prendre comme source (etch, sid) * -f : standard ou minimal * --filesystem : ext2, plain ou squashfs. On prend plain pour faire un netboot, squashfs pour un liveCD * --server-address : adresse du serveur tftp * --server-path : chemin où sera stocker le système netboot sur le serveur tftp * -t : type d'image à générer, net ou iso * -m : mirroir Debian à utiliser * -p : fichier qui contient la liste des paquets à installer * -s : liste des sections à inclure Le fichier ''paquet'' comprend la liste des paquets à installer : # Minimal eject sudo locales manpages manpages-dev manpages-fr manpages-fr-dev manpages-fr-extra debconf adduser apt bsdutils console-data console-tools debianutils gettext-base passwd dnsutils kde-core kdm kde-i18n-fr kdebase-kio-plugins x-window-system-core xorg xfonts-100dpi-transcoded xfonts-75dpi-transcoded desktop-base libttf2 console-setup console-common ssh less bzip2 ccze elinks euro-support zip unzip cupsys-client cupsys-bsd dash alsa-base alsa-utils kmix xmms openoffice.org openoffice.org-l10n-fr openoffice.org-help-fr firefox firefox-locale-fr swf-player wfrench ifrench-gut gimp gimp-help-fr gimp-svg dia xfig xfig-doc xfig-libs transfig gnuplot xpdf gv gs-gpl gsfonts tetex-base tetex-bin texinfo tetex-extra kile kdvi kghostview kile-i18n prosper latex-beamer kpdf a2ps ===== Modification pour booter en réseau ===== Pour générer une distribution bootable en réseau, il faut faire quelques modifications aux scripts de la commande ''make-live'' ainsi qu'à l'initrd et au système final. Pour information voici le contenu du répertoire ''/tftpboot'' : binary/ <- contient la distribution généré creer-netboot/ <- contient les fichiers de travail copie.sh <- pour copier du repertoire debian-live vers /tftpboot/binary debian-live/ <- repertoire de travail de make-live (on peut l'effacer) gen-initrd.sh <- script qui génére un initrd à partir du repertoire init gen.sh <- lance la commande make-live init/ <- repertoire ou se trouve l'initrd decompressé initrd.gz <- initrd compressé post.gen/ <- repertoire qui contient les fichiers de configurations à copier dans binary post.gen.sh <- script qui copie les fichiers de post.gen vers binary ust <- contient les noms des paquest à installer fr.kbd <- map du clavier francais pour pxelinux ghost/ <- repertoire qui contient les images de disquettes ghost initrd.gz <- initrd pour booter avec pxelinux (copier à partir de debian-live) isolinux/ <- sert à rien memdisk <- sert à booter les images de disquette ghost menu.c32 <- menu graphique pour pxelinux mkinitrd.sh <- sert à rien pxelinux.0 <- executable de pxelinux pxelinux.cfg/ <- repertoire ou se trouve la conf de pxelinux vmlinuz <- noyau qui va avec l'initrd pour booter sous linux ==== Modification des scripts make-live ==== La commande ''make-live'' fait appel à des scripts placés dans le répertoire ''/usr/share/make-live/scripts/''. Ces scripts contrôlent chacun un aspect de la génération de la distribution. Le fichier ''23net.sh'' copie la distribution dans un répertoire, ajoute les utilitaires pour le boot tftp, et compresse le tout dans un fichier ''tar.gz''. La dernière étape est inutile, puisqu'on va décompresser l'image. Pour supprimer la génération tu ''tar.gz'' il faut éditer le fichier ''23net.sh'' et commenter la partie suivante : # [...] # Creating tarball # cd "${LIVE_ROOT}" && \ # mv binary "`basename ${LIVE_SERVER_PATH}`" && \ # cd .. && \ # tar cfz binary.tar.gz "`basename ${LIVE_ROOT}`/`basename ${LIVE_SERVER_PATH}`" "`basename ${LIVE_ROOT}`/tftpboot" && \ # mv binary.tar.gz "${LIVE_ROOT}" && \ # cd "${OLDPWD}" && \ # mv "`basename ${LIVE_SERVER_PATH}`" binary # [...] ==== Modification de l'initrd ==== Le fichier ''initrd.gz'' contient les scripts, les utilitaires et les modules du noyau qui vont servir à preparer le système pour qu'il démarre correctement. Grâce aux scripts contenus dans l'initrd, on peut modifier certains fichiers présent sur le disque d'origine, il est ainsi possible de faire des adaptations dans le système de fichier au tout début de la procédure de démarrage. === Décompression === Pour décompresser l'initrd : mkdir init cp initrd.gz init/ cd init gunzip initrd.gz cpio -i < initrd rm initrd === Modification === On suppose que l'initrd est décompressée dans le répertoire ''init''. La plupart des scripts qui vont être exécutés se trouvent dans le répertoire ''init/scripts/casper-bottom/''. Voici les modifications à apporter aux fichiers. == 10adduser == Vers la fin du fichier, on supprimer la personnalisation du fichier ''/etc/sudoers'', on le configure à la main plus tard : #if [ -f /root/etc/sudoers ]; then # if [ "${BUILD_SYSTEM}" == "Ubuntu" ]; then # XXX - awful hack to stop xscreensaver locking the screen (#7150) # echo 'RUNNING_UNDER_GDM="yes"' >> /root/etc/environment # grep -q '^%admin' /root/etc/sudoers && sed -i -e '/^%admin/s/ALL$/NOPASSWD: ALL/' /root/etc/sudoers || echo '%admin ALL=(ALL) NOPASSWD: ALL' >> /root/etc/sudoers # for file in /usr/share/applications/ubiquity-gtkui.desktop /usr/share/applications/kde/ubiquity-kdeui.desktop; do # if [ -f "/root/$file" ]; then # chroot /root install -D -o $USERNAME -g $USERNAME $file /home/$USERNAME/Desktop/$(basename "$file") # break # fi # done # else # We are in debian :-) # echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /root/etc/sudoers # fi #fi == 12fstab == Vers la fin du fichier, il faut ajouter le montage des répertoires des personnels et des étudiants : # [...] cat > $FSTAB < == 15autologin == Vers le haut du fichier, il faut stopper l'execution du script. En effet, nous ne voulons pas de login automatique. # [...] log_begin_msg "$DESCRIPTION" # -- debut modif -- log_end_msg exit 0 # -- fin modif -- if chroot /root [ -f /etc/gdm/gdm-cdd.conf ]; then GDMCONF=/etc/gdm/gdm-cdd.conf else GDMCONF=/etc/gdm/gdm.conf fi # [...] == 20xconfig == Vers le haut du fichier, il faut stopper l'execution du script. La configuration de xorg a déjà eu lieu. # [...] log_begin_msg "$DESCRIPTION" # ----- debut ajout ----- log_end_msg exit 0 # ----- fin ajout ----- if [ "$TERM_TYPE" = "serial" ]; then # Don't bother trying to configure or start X on a serial console rm -f /etc/rc?.d/S??[gxk]dm exit 0 fi # [...] == 25configure_init == Vers le milieu du fichier, on ne souhaite pas que les consoles virtuelles se connectent automatiquement. On met en commentaire une grande partie du code, pour laisser la configuration par défaut de l'//inittab// : # [...] log_begin_msg "$DESCRIPTION" # Arrange for shells on virtual consoles, rather than login prompts #if [ -n "$USERNAME" ]; then # if [ ! -z "${CASPERGETTY}" ]; then # # AUTOMATIC SERIAL CONSOLE # # defconsole=$(sed -e 's%.*console=%console=%' /proc/cmdline) # if echo "${defconsole}" | grep -qs console=ttyS; then # PORT=$(echo "${defconsole}" | \ # sed -e's%^console=%%' -e's%,.*%%') # SPEED=$(echo "${defconsole}" | \ # sed -e 's%^console=ttyS[0-9]\+,%%' \ # -e's%\([0-9]\+\).*%\1%') # if ! ( sed -n -e'/^[^#]/p' /root/etc/inittab | grep -qs ":respawn:/sbin/getty.*${PORT}" ) ; then # IDs="A B C D E F G H I J K L M N O P Q R S T Q U V V X Y Z 0 1 2 3 4 5 6 7 8 9" # for ID1 in $IDs; do # for ID2 in $IDs; do # ID="${ID1}${ID2}" # if ! grep "^${ID}:" /etc/inittab ; then # #make sure it is not already in use # break 2 # fi # done # done # echo "${ID}:2345:respawn:/sbin/casper-getty -L ${PORT} ${SPEED} vt100" \ # >>/root/etc/inittab # fi # fi # else # if [ -f /root/etc/inittab ]; then # sed -i -e "s|^\([^:]*:[^:]*:[^:]*\):.*getty.*\<\(tty[0-9]*\).*$|\1:/bin/login -f $USERNAME /dev/\2 2>\&1|" /root/etc/inittab # fi # if [ "/root/etc/event.d/tty*" != "$(echo /root/etc/event.d/tty*)" ]; then # for f in /root/etc/event.d/tty*; do # sed -i -e "s|^respawn.*|respawn /bin/login -f $USERNAME /dev/$(basename $f) 2>\&1|" $f # done # fi # fi #fi # [...] === Recompression === Pour recompresser l'initrd : cd init/ find . | cpio -o -H newc | gzip -9 -c -n > ../initrd.gz ==== Modification de la distribution ==== La distribution générée n'est pas personnalisée pour fonctionner à l'UFR ST, il n'y a pas d'authentification LDAP par exemple. Nous allons donc personnaliser les fichiers de configuration. Pour simplifier la regénération de différentes version, on va placer les fichiers de configuration personnalisé dans un répertoire, et les copier dans la distribution générée grâce à un script. Il sera ainsi plus facile d'en ajouter. On créé un répertoire ''post.gen'' et on y place tous les fichiers qu'on souhaite personnaliser : mkdir post.gen ls post.gen alsa-utils common-account common-session ldap.conf mountall.sh pam_ldap.conf sudoers bash.bashrc common-auth hostname.sh libnss-ldap.conf nscd.conf profile vga.card.sh cachain.txt common-password kdmrc modules nsswitch.conf resolv.conf Le script qui va faire la mise-à-jour est le suivant : #!/bin/bash NET=/tftpboot/binary/casper/filesystem.dir SRC=post.gen # resolv.conf cp $SRC/resolv.conf $NET/etc/resolv.conf # pam ldap cp $SRC/cachain.txt $NET/etc/ldap/ cp post.gen/ldap.conf $NET/etc/ldap/ cp $SRC/common-account $NET/etc/pam.d/ cp $SRC/common-auth $NET/etc/pam.d/ cp $SRC/common-password $NET/etc/pam.d/ cp $SRC/common-session $NET/etc/pam.d/ cp $SRC/libnss-ldap.conf $NET/etc/ cp $SRC/nscd.conf $NET/etc/ cp $SRC/nsswitch.conf $NET/etc/ cp $SRC/pam_ldap.conf $NET/etc/ # fstab : nfs personnel et etudiant [ -d $NET/home/personnel ] || mkdir $NET/home/personnel [ -d $NET/home/etudiant ] || mkdir $NET/home/etudiant [ -d $NET/opt/java ] || mkdir $NET/opt/java [ -d $NET/opt/eclipse ] || mkdir $NET/opt/eclipse [ -d $NET/opt/mupad ] || mkdir $NET/opt/mupad [ -d $NET/opt/sh ] || mkdir $NET/opt/sh # alsa : diminuer le son cp $SRC/alsa-utils $NET/etc/init.d/ # hostname cp $SRC/hostname.sh $NET/etc/init.d/ [ -L $NET/etc/rcS.d/S02hostname.sh ] && mv $NET/etc/rcS.d/S02hostname.sh $NET/etc/rcS.d/S41hostname.sh # mount -a cp $SRC/mountall.sh $NET/etc/init.d/ # xorg : passer en francais sed -i \ -e "s/\"pc104\"/\"pc105\"/" \ -e "s/\"us\"/\"fr\"/" \ $NET/etc/X11/xorg.conf cp $SRC/vga.card.sh $NET/etc/init.d/ [ -L $NET/etc/rcS.d/S45vga.card.sh ] || (cd $NET/etc/rcS.d/ ; ln -s ../init.d/vga.card.sh S45vga.card.sh) # kdm cp $SRC/kdmrc $NET/etc/kde3/kdm/ # bash, profile cp $SRC/bash.bashrc $NET/etc/ cp $SRC/profile $NET/etc/ # sudo cp $SRC/sudoers $NET/etc/ # modules cp $SRC/modules $NET/etc/ ==== Copie de la distribution dans le répertoire tftp ==== Sur le serveur, le répertoire ''/tftpboot/binary'' est partagé en NFS pour permettre le //netboot//. Il convient donc de copier la distribution dedans : mkdir /tftpboot/binary cd /tftpboot/creer-netboot/debian-live/binary find . | cpio -pumd /tftpboot/binary/ Extrait du fichier ''/etc/export'' : /tftpboot/binary 172.16.0.0/255.255.0.0(ro,async,no_root_squash,no_subtree_check) ==== Dernières configurations ==== Il est possible que certains paquets doivent être configuré plus finement que d'autre. Une fois le système copié dans son répertoire final, il est possible d'utiliser des commandes dans un //chroot//. Il est nécessaire de reconfigurer certains paquets : chroot /tftpboot/binary/casper/filesystem.dir/ dpkg-reconfigure console-data xserver-xorg locales Pour ''xserver-xorg'' il faut répondre : FIXME à remplir...