Page suivante - Page précédente - Table des matières

3. Préparation du serveur

3.1 Compiler un noyau

Il faut prévoir le nécessaire pour supporter root sur nfs. Voici les étapes :

  1. Comme nous utilisons une RedHat 5.2 avec le noyau 2.2, il faut s'assurer que notre distribution est prête pour ce noyau. RedHat fournit un excellent HowTo à ce sujet.
  2. J'utilise le même noyau pour le serveur et les stations pour éviter les conflits vu qu'ils partagent le même répertoire /lib/modules. Si ce n'est pas possible dans votre situation, produisez différentes versions en éditant le numéro de version au début du Makefile. Ces numéros différents devraient éviter les confilts.
  3. En plus des options habituelles, le noyau devrait supporter :
    • ext2 compilé dans le noyau (pour le serveur, ou bien pour les deux)
    • NFS et root-over-NFS compilé (pour le client ou pour les deux) ; pour avoir l'option root-over-NFS, il faut activer ip-autoconfig dans les options réseau. Nous utiliserons bootp comme méthode de configuration.
    • networkcard compilé (pour le client ou les deux)
    • devfs compilé (requis pour le client, également intéressant pour le serveur)
    • tout ce que vous utilisez normalement, les modules pour tous les périphériques présents sur le serveur et les stations.
  4. Il faut éditer ensuite les sources du noyau pour changer le montage root-over-NFS par défaut : /tftpboot/<ip>/root au lieu de /tftpboot/<ip>, de façon à avoir une arborescence propre sous /tftpboot avec un répertoire par station contenant son répertoire racine (un lien vers la racine du serveur en fait) et ses répertoires spécifiques.
    • En 2.0, c'est une ligne de DEFINE dans "include/linux/nfs_fs.h" appelée "NFS_ROOT"
    • En 2.2, c'est un DEFINE dans "fs/nfs/nfsroot.c"
  5. Il reste à compiler le noyau comme d'habitude (cf Kernel-HowTo).
  6. Si vous n'avez pas encore de noeud /dev/nfsroot, créez-le :
    mknod /dev/nfsroot b 0 255
  7. Après avoir compilé le noyau, changez la racine en tapant :
    rdev <path-to-zImage>/zImage /dev/nfsroot
  8. Avant de booter avec devfs, vous devez modifier conf.modules : ajoutez le contenu du fichier conf.modules de la documentation de devfs au conf.modules du système.
  9. Ce nouveau noyau est compilé avec la configuration automatique de l'adresse IP, mais cela va échouer lors du boot du serveur puisque c'est lui-même qui donne les adresses IP. Pour éviter une trop longue attente, ajouter : append="ip=off" à la section linux de /etc/lilo.conf.
  10. relancez lilo et bootez sur le nouveau noyau.
  11. avec devfs, sur le serveur, vous allez perdre tous les liens qui existaient. Sur RedHat, c'est le plus souvent /dev/mouse et /dev/cdrom. Recréez-les. Remettez également vos propriétés personnalisées si vous avez l'habitude d'avoir des particularités sur certaines entrées de /dev. Ensuite enregistrez ce paramétrage de /dev (sous /etc/sysconfig puisque c'est dépendant du type de machine) ainsi :
    • Copiez le fichier rc.devfs de la documentation devfs des sources du noyau vers /etc/rc.d/rc.devfs et rendez-le exécutable
    • Sauvegardez les paramétrages :
      /etc/rc.d/rc.devfs save /etc/sysconfig

3.2 Création et remplissage de /tftpboot, création des liens vers /tmp etc.

La partie automagique

Tout cela est pris en charge par le script ci-dessous. Si on veut le faire manuellement, il suffit de suivre le script pas a pas.

Ce script effectue des actions un peu osées telles que supprimer /tmp, arrêter temporairement syslog, démonter /proc. Donc assurez-vous d'abord que personne n'utilise la machine pendant ce temps, et que X ne tourne pas. Il n'est pas nécessaire de changer de niveau d'exécution, si vous êtes sûr d'être le seul connecté et sur une console en mode texte.

Déni : ce script a été testé mais s'il provoque un plantage du serveur, vous êtes seul responsable. Je ne prends aucune responsabilité quoi qu'il arrive. Je répète que ce HowTo est fait pour des administrateurs expérimentés. De plus ce script est fait pour être lancé une fois et une seule. Le lancer une seconde fois endommagera /etc/fstab, /etc/X11/XF86Config, /etc/X11/X et /etc/conf.modules.

Ceci dit, copiez-collez ce script et rendez le exécutable, puis exécutez-le.


#!/bin/sh
SERVER_NAME=`hostname -s`
###
echo creating /etc/rc.d/rc.ws
#this basicly just echos the entire script ;)
echo "#root on nfs stuff
SERVER=$SERVER_NAME
# on a besoin de proc pour mtab, route, etc.
mount -t proc /proc /proc
IP=\`ifconfig eth0|grep inet|cut --field 2 -d ':'|cut --field 1 -d ' '\`
# si le premier montage echoue, c'est qu'on est probablement
# sur le serveur, ou bien que quelque chose ne va pas.
# donc on ne fait la suite que si le premier montage est reussi
mount \$SERVER:/tftpboot/\$IP/sysconfig /etc/sysconfig -o nolock &&
{
 # autres montages
 mount \$SERVER:/home /home -o nolock
 mount \$SERVER:/ /\$SERVER -o ro,nolock
 # creation de /var
 echo Creating /var ...
 mke2fs -q -i 1024 /dev/ram1 1024
 mount /dev/ram1 /var -o defaults,rw
 cp -a /tftpboot/var /
 # configuration reseau
 . /etc/sysconfig/network
 HOSTNAME=\`cat /etc/hosts|grep \$IP|cut --field 2\`
 route add default gw \$GATEWAY
 ifup lo
}
# restauration des périphériques installés
/etc/rc.d/rc.devfs restore /etc/sysconfig
umount /proc" > /etc/rc.d/rc.ws
###
echo splitting runlevel 3 for the client and server
mv /etc/rc.d/rc3.d /etc/rc.d/rc3.server
cp -a /etc/rc.d/rc3.server /etc/rc.d/rc3.ws
rm /etc/rc.d/rc3.ws/*network
rm /etc/rc.d/rc3.ws/*nfs
rm /etc/rc.d/rc3.ws/*nfsfs
rm /etc/rc.d/rc3.ws/S99local
ln -s /etc/sysconfig/rc.local /etc/rc.d/rc3.ws/S99local
ln -s /etc/rc.d/rc3.server /etc/sysconfig/rc3.d
ln -s /etc/sysconfig/rc3.d /etc/rc.d/rc3.d
###
echo making tmp a link to /var/tmp
rm -fR /tmp
ln -s var/tmp /tmp
###
echo moving various files around and create symlinks for them
echo mtab
/etc/rc.d/init.d/syslog stop
umount /proc
touch /proc/mounts
mount /proc
/etc/rc.d/init.d/syslog start
rm /etc/mtab
ln -s /proc/mounts /etc/mtab
echo fstab
mv /etc/fstab /etc/sysconfig
ln -s sysconfig/fstab /etc/fstab
echo X-config files
mkdir /etc/sysconfig/X11
mv /etc/X11/X /etc/sysconfig/X11
ln -s ../sysconfig/X11/X /etc/X11/X
mv /etc/X11/XF86Config /etc/sysconfig/X11
ln -s ../sysconfig/X11/XF86Config /etc/X11/XF86Config
echo conf.modules
mv /etc/conf.modules /etc/sysconfig
ln -s sysconfig/conf.modules /etc/conf.modules
echo isapnp.conf
mv /etc/isapnp.conf /etc/sysconfig
ln -s sysconfig/isapnp.conf /etc/isapnp.conf
###
echo creating a template dir for the ws directories
echo /tftpboot/template
mkdir /home/tftpboot
ln -s home/tftpboot /tftpboot
mkdir /tftpboot/template
mkdir /$SERVER_NAME
echo root
ln -s / /tftpboot/template/root
echo sysconfig
cp -a /etc/sysconfig /tftpboot/template/sysconfig
rm -fR /tftpboot/template/sysconfig/network-scripts
ln -s /$SERVER_NAME/etc/sysconfig/network-scripts \
 /tftpboot/template/sysconfig/network-scripts
echo NETWORKING=yes > /tftpboot/template/sysconfig/network
echo `grep "GATEWAY=" /etc/sysconfig/network` >> /tftpboot/template/sysconfig/network
echo "/dev/nfsroot / nfs defaults 1 1" > /tftpboot/template/sysconfig/fstab
echo "none /proc proc defaults 0 0" >> /tftpboot/template/sysconfig/fstab
echo "#!/bin/sh" > /tftpboot/template/sysconfig/rc.local
chmod 755 /tftpboot/template/sysconfig/rc.local
rm /tftpboot/template/sysconfig/rc3.d
ln -s /etc/rc.d/rc3.ws /tftpboot/template/sysconfig/rc3.d
rm /tftpboot/template/sysconfig/isapnp.conf
echo var
cp -a /var /tftpboot/var
rm -fR /tftpboot/var/lib
ln -s /$SERVER_NAME/var/lib /tftpboot/var/lib
rm -fR /tftpboot/var/catman
ln -s /$SERVER_NAME/var/catman /tftpboot/var/catman
rm -fR /tftpboot/var/log/httpd
rm -f /tftpboot/var/log/samba/*
for i in `find /tftpboot/var/log -type f`; do cat /dev/null > $i; done
rm `find /tftpboot/var/lock -type f`
rm `find /tftpboot/var/run -type f`
echo /sbin/fsck.nfs
echo "#!/bin/sh
exit 0" > /sbin/fsck.nfs
chmod 755 /sbin/fsck.nfs
echo all done

Ajustements manuels

  1. Le script de configuration des stations doit être exécuté au tout début de rc.sysinit, donc il faut ajouter les lignes suivantes après avoir défini le PATH :
    # pour les stations montant root par NFS
    /etc/rc.d/rc.ws
    

  2. Réduisez /etc/rc.d/rc3.ws à un minimum. Il peut être utile de créer un rc.local.ws, à vous de voir. Réseau et nfs sont déja configurés. Voici d'ailleurs la liste de ce qui a déjà été enlevé/mis à jour par le script :
    • réseau
    • système de fichiers NFS
    • NFS
    • rc.local

3.3 Export des systèmes de fichiers appropriés et configuration de bootp

Export des systèmes de fichiers

Par exemple ici à l'Université, j'ajouterai ceci à /etc/exports :


/ *.st.hhs.nl(ro,no_root_squash)
/home *.st.hhs.nl(rw,no_root_squash)

Remplacez les noms de domaine par les vôtres et relancez NFS :

/etc/rc.d/init.d/nfs restart

Pour les utilisateurs de knfsd : il n'est pas possible d'avoir plusieurs exports d'une partition avec des permissions différentes. De même, knfsd ne permet pas de changer de partition (par exemple si un client monte /, et /usr est sur une autre partition, le client n'aura pas accès à /usr). Ainsi, si vous utilisez knfsd, il faudra qu'au moins /home soit sur une partition différente ; le script de préparation du serveur a mis /tftpboot sous /home : il ne nécessite pas une partition supplémentaire. Si vous voulez accéder à d'autres partitions depuis vos clients, exportez les séparément et ajoutez les lignes de montage correspondantes dans /etc/rc.d/rc.ws.

Configurer bootp

  1. Si bootp n'est pas encore installé, c'est le moment de le faire. Il est inclus dans la RedHat.
  2. Editez /etc/inetd.conf et supprimez le commentaire sur la ligne commençant par bootp ; si vous utilisez une bootprom, enlevez également le commentaire pour tftp.
  3. Redémarrez inetd :
    /etc/rc.d/init.d/inetd restart


Page suivante - Page précédente - Table des matières