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