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 <<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

# [...]

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 >/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

# [...]

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...