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.
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 :
/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 :
/etc/apt/preferences
Package: * Pin: release a=testing Pin-Priority: 10
Mettre à jour la liste des paquets :
apt-get updateInstaller les paquets :
apt-get install -t sarge-backports cdebootstrap apt-get install genext2fs mkisofs squashfs-tools apt-get install -t testing live-package
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"
Le fichier paquet comprend la liste des paquets à installer :
paquet
# 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
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
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 # [...]
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.
Pour décompresser l'initrd :
mkdir init cp initrd.gz init/ cd init gunzip initrd.gz cpio -i < initrd rm initrd
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.
Vers la fin du fichier, on supprimer la personnalisation du fichier /etc/sudoers, on le configure à la main plus tard :
/etc/sudoers
#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
Vers la fin du fichier, il faut ajouter le montage des répertoires des personnels et des étudiants :
12fstab
# [...] cat > $FSTAB <<EOF unionfs / unionfs rw 0 0 tmpfs /tmp tmpfs nosuid,nodev 0 0 etuh-lebon.pedagogie:/home/personnel /home/personnel nfs rw,nolock 0 0 etuh-lebon.pedagogie:/home/etudiant /home/etudiant nfs rw,nolock 0 0 EOF # [...]
Vers le haut du fichier, il faut stopper l'execution du script. En effet, nous ne voulons pas de login automatique.
15autologin
# [...] 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 # [...]
Vers le haut du fichier, il faut stopper l'execution du script. La configuration de xorg a déjà eu lieu.
20xconfig
# [...] 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 # [...]
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 :
25configure_init
# [...] 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 >/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) > /dev/$(basename $f) 2>\&1|" $f # done # fi # fi #fi # [...]
Pour recompresser l'initrd :
cd init/ find . | cpio -o -H newc | gzip -9 -c -n > ../initrd.gz
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/
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 :
/etc/export
/tftpboot/binary 172.16.0.0/255.255.0.0(ro,async,no_root_squash,no_subtree_check)
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 :
à remplir…