               Refaire votre monde (avec ``make world'')

  Nik Clayton

   <Nik.Clayton@nothing-going-on.demon.co.uk>

   10 Juillet 1997

   Ce document presuppose que vous ayez installe une version du code
   source de FreeBSD dans le repertoire /usr/src. Ce peut etre la
   derniere version de la branche en cours de developpement -current,
   `a moins que vous ne restiez simplement `a niveau sur la branche
   -stable. Vous pouvez avoir telecharge l'instantane le plus recent,
   ou bien rester `a jour en utilisant les mecanismes fournis par
   CVSup ou CTM.

   Dans les deux cas, vous disposez du code source et voulez
   maintenant mettre `a jour votre systeme.

   Il y a un certain nombre d'etapes `a effectuer pour y arriver, et
   quelques pieges `a eviter en cours de route. Ce document vous
   guide pas `a pas `a chacune de ces etapes.

   Il existe aussi des Traductions de ce document dans d'autres
   langues.

   Version franc,aise de Frederic Haby
   <frederic.haby@mail.dotcom.fr>.

     --------------------------------------------------------------

1. Avertissements prealables

     Faites une sauvegarde : Je n'insisterai jamais assez sur
     l'importance de faire un sauvegarde de votre systeme avant toute
     autre chose. Bien qu'il soit facile de ``refaire le monde''
     (N.d.T.: recompiler FreeBSD) - si vous suivez ces instructions,
     vous ferez forcement des erreurs `a un moment ou `a un autre,
     sans compter les erreurs des autres dans l'arborescence des
     sources qui empecheraient votre systeme de redemarrer.

     Assurez-vous que vous avez bien fait une sauvegarde. Ayez une
     disquette de maintenance `a portee de la main. Je n'ai jamais eu
     `a les utiliser, et, je touche du bois, espere ne jamais devoir
     m'en servir, mais prudence est mere de surete.

     Abonnez-vous `a la bonne liste de diffusion : Les branches
     -stable et -current du code de FreeBSD sont, par nature, en
     developpement. Les gens qui participent au projet FreeBSD sont
     humains, et des erreurs se produisent parfois.

     Ces erreurs sont parfois benignes. Votre systeme affiche
     simplement un nouveau message d'avertissement. Elles peuvent
     aussi etre catastrophiques, et empecher votre systeme de
     redemarrer, detruire vos systemes de fichiers (ou pire).

     Quand de tels problemes se produisent, un avertissement ``heads
     up'' est poste sur la liste de diffusion appropriee, decrivant
     le probleme et les machines concernees. Un message ``all clear''
     est diffuse quand le probleme est resolu.

     Si vous restez `a niveau sur -stable ou -current et ne lisez pas
     <FreeBSD-stable@FreeBSD.ORG> ou <FreeBSD-current@FreeBSD.ORG>,
     vous allez au devant d'ennuis.

     Important : S'il vous plait, ne me posez pas de questions que
     vous devriez poster sur les listes -questions, -current, ou
     -stable. Je n'ai ni le temps ni l'environnement necessaire pour
     diagnostiquer des problemes specifiques, et n'ai probablement
     pas votre reponse. Les membres de ces listes de diffusion sont
     nombreux, experimentes et serviables, aussi, posez leur vos
     questions. Adressez-moi cependant vos commentaires, reponses et
     corrections[1]. Si vous vous adressez `a moi au sujet de ce
     document, merci de m'indiquer le numero de version qui se trouve
     en haut de cette page, que je sache `a quelle version vous
     faites reference.

     Ce document est un effort collectif. De nombreuses personnes y
     ont participe, elles sont mentionnees dans les Contributions en
     fin de document.

     Copyright (c) 1997, 1998 Nik Clayton, All rights reserved.

     Vous pouvez redistribuer et utiliser ce document sous forme de
     source (SGML DocBook) ou 'compile' (HTML, PDF, PostScript, RTF,
     etc..) avec ou sans modifications `a la condition suivante:

       * Le document redistribue doit inclure la notice de copyright
         ci-dessus et l'avertissement ci-dessous, avant le corps du
         document.

     THIS TUTORIAL IS PROVIDED BY NIK CLAYTON ``AS IS'' AND ANY
     EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON
     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     IN ANY WAY OUT OF THE USE OF THIS TUTORIAL, EVEN IF ADVISED OF
     THE POSSIBILITY OF SUCH DAMAGE.

     CE DOCUMENT EST FOURNI PAR NIK CLAYTON ``TEL QUEL'' ET AUCUNE
     GARANTIE EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS NON LIMITEE,
     GARANTIES IMPLICITES DE COMMERCIABILITE ET D'ADEQUATION A UN BUT
     PARTICULIER N'EST DONNEE. EN AUCUN CAS NIK CLAYTON NE SAURAIT
     ETRE TENU RESPONSABLE DES DOMMAGES DIRECTS, INDIRECTS,
     ACCIDENTELS, SPECIAUX OU CONSEQUENTS (Y COMPRIS, MAIS SANS
     LIMITATION, LA FOURNITURE DE BIENS ET SERVICES ANNEXES; DEFAUT
     D'UTILISABILITE, PERTE DE DONNEES OU DE PROFITS; OU INTERRUPTION
     DE TRAVAIL) QUELLE QU'EN SOIT LA CAUSE ET SELON TOUTE DEFINITION
     DE RESPONSABILITE, SOIT PAR CONTRAT, RESPONSABILITE STRICTE, OU
     PREJUDICE (Y COMPRIS NEGLIGENCE OU AUTRES) IMPUTABLE D'UNE FACON
     OU D'UNE AUTRE A L'UTILISATION DE CE DOCUMENT, MEME APRES AVOIR
     ETE AVISE DE LA POSSIBILITE D'UN TEL DOMMAGE.

     --------------------------------------------------------------

2. Examinez /etc/make.conf

   Reportez-vous au fichier /etc/make.conf. Il contient les valeurs
   par defaut utilisees par la commande make, qui sera employee pour
   la recompilation. Elles sont aussi utilisees toutes les fois que
   vous invoquez make, il est donc bon de vous assurer qu'elles
   comportent les valeurs appropriees `a votre systeme.

   Tout y est, par defaut, en commentaire. Activez les options qui
   vous paraissent utiles. Pour un utilisateur normal (qui ne
   developpe pas), il faut probablement utiliser les definitions de
   CFLAGS et NOPROFILE.

     Version 2.1.7 et anterieures : Si votre machine dispose d'une
     unite de calcul en virgule flottante (386DX, 486DX, Pentium et
     ulterieurs) vous pouvez aussi activer l'option HAVE_FPU.

     Cette definition a disparu depuis la version 2.2.2 de FreeBSD.

   Examinez les autres definitions (COPTFLAGS, NOPORTDOCS et ainsi de
   suite) et decidez de celles qui vous conviennent.

     --------------------------------------------------------------

3. Mettez `a jour le fichier /etc/group

   Le repertoire /etc contient la plupart des informations de
   configuration de votre systeme, ainsi que ses procedures de
   demarrage. Certaines de ces procedures changent d'une version `a
   l'autre de FreeBSD.

   Certains fichiers de configuration sont aussi utilises en
   permanence par le systeme. En particulier, /etc/group.

   Il est arrive que la phase d'installation de ``make world'' ait
   besoin que certains utilisateurs et groupes existent. Il y a de
   fortes chances qu'ils n'aient pas ete definis avant la mise `a
   jour. C'est une source de problemes.

   L'exemple le plus recent concerne l'ajout du groupe ``ppp''
   (renomme par la suite ``network''). Les utilisateurs ont vu leur
   mise `a jour avorter `a l'installation du sous-syteme ppp sous un
   groupe inexistant (chez eux).

   La solution consiste `a examiner le fichier /usr/src/etc/group et
   `a le comparer `a votre propre liste de groupes. S'il y a des
   groupes dans le nouveau fichier qui ne sont pas dans votre
   fichier, copiez-les. De meme, vous devez renommer tout groupe de
   votre fichier /etc/group qui a le meme GID, mais un nom different,
   qu'un groupe du fichier /usr/src/etc/group.

     Astuce : Si vous etes particulierement paranoiaque, vous pouvez
     controler votre systeme pour trouver les fichiers appartenant au
     groupe que vous renommez ou supprimez. Une commande du type:

 # find / -group GID -print

     vous donnera la liste des fichiers appartenant au groupe GID
     (qui peut etre un nom de groupe ou un identifiant numerique).

     --------------------------------------------------------------

4. Passez en mode mono-utilisateur

   Il vaut mieux recompiler le systeme en mode mono-utilisateur. En
   dehors du fait que cela ira un peu plus vite, la reinstallation va
   modifier un grand nombre de fichiers systemes importants, tous les
   binaires de base, les bibliotheques, les fichiers inclus et ainsi
   de suite. Les modifier quand le systeme est en service (en
   particulier s'il y a des utilisateurs connectes `a ce moment l`a),
   c'est aller au devant de problemes.

   Cela dit, si vous avez confiance en vous, vous pouvez vous en
   passer.

     Version 2.2.5 et ulterieure : Comme decrit plus bas, la version
     2.2.5 et les suivantes de FreeBSD separent la recompilation et
     l'installation. Vous pouvez des lors compiler le nouveau systeme
     en mode multi-utilisateurs et passer en mode mono-utilisateur
     juste pour l'installer.

   En tant que super-utilisateur, vous pouvez passer la commande:

 # shutdown now

   sur un systeme en fonctionnement, pour passer en mode
   mono-utilisateur.

   Ou bien, redemarrez le systeme, et, `a l'invite de demarrage,
   entrez l'indicateur -s. Le systeme redemarrera en mode
   mono-utilisateur. A l'invite de l'interpreteur de commandes,
   executez:

 # fsck -p
 # mount -u /
 # mount -a -t ufs
 # swapon -a

   pour effectuer la verification des systemes de fichiers, remontez
   / en mode lecture/ecriture, et monter tous les autres systemes de
   fichiers UFS listes dans le fichier /etc/fstab, puis activez la
   pagination.

     --------------------------------------------------------------

5. Effacez /usr/obj

   Les composants du systeme reconstruit sont au fur et `a mesure
   places dans les sous-repertoires de /usr/obj (par defaut). Ces
   repertoires masquent ceux de /usr/src.

   Vous pouvez accelerer le travail de ``make world'', et peut-etre
   vous eviter quelques maux de tete en supprimant aussi le
   repertoire /usr/obj.

   Certains fichiers dans /usr/obj sont marques immuables
   (reportez-vous aux pages de manuel de chflags(1) pour plus de
   details). Il faut d'abord supprimer cet indicateur.

 # cd /usr/obj
 # chflags -R noschg *
 # rm -rf *

     --------------------------------------------------------------

6. Recompilez les sources et installez le nouveau systeme

  6.1. Toutes versions

   Vous devez etre dans le repertoire /usr/src, donc:

 # cd /usr/src

   (`a moins, bien sur, que votre code source soit ailleurs, auquel
   cas vous devez aller dans le repertoire correspondant).

   Pour recompiler le systeme, vous utilisez la commande make(1).
   Cette commande lit ses instructions dans le fichier Makefile, qui
   decrit comment reconstruire les modules qui constituent FreeBSD,
   dans quel ordre, et ainsi de suite.

   Le format general de la commande que vous taperez sera:

 # make -x -DVARIABLE cible

   Dans cet exemple, -x est une option que vous donnez `a make(1).
   Reportez-vous aux pages de manuel pour connaitre les options
   disponibles.

   -DVARIABLE transmet une variable au fichier Makefile. Le
   comportement de Makefile est defini par ces variables. Ce sont les
   memes variables que l'on trouve dans /etc/make.conf, et c'est un
   autre moyen de les positionner.

   Par exemple:

 # make -DNOPROFILE=true cible

   est une autre maniere de dire qu'il ne faut pas compiler les
   bibliotheques profilees et correspond aux lignes:

 NOPROFILE=    true
 #   Avoid compiling profiled librairies  
 #   Ne pas compiler les bibliotheques profilees    
        

   du fichier /etc/make.conf.

   cible dit `a make(1) ce que vous voulez faire. Chaque Makefile
   definit un certains nombre de ``cibles'' differentes, et votre
   choix de cibles determine ce qui se passe.

   Il y a des cibles definies dans le fichier Makefile que vous
   n'avez pas `a employer. Ce sont des etapes intermediaires
   utilisees par le processus de recompilation pour decomposer les
   etapes en sous-etapes.

   La plupart du temps, vous n'aurez pas besoin de donner d'options
   `a make(1), et votre commande sera simplement:

 # make cible

     --------------------------------------------------------------

  6.2. Enregistrez le resultat

   C'est une bonne idee d'enregistrer le resultat de make(1) dans un
   ficher. Si quelque chose se passe mal, vous aurez une trace des
   messages d'erreur, et la liste complete de ce qui a ete fait. Meme
   si cela ne vous aide pas `a diagnostiquer ce qui n'a pas marche,
   cela peut aider les autres si vous soumettez votre probleme sur
   une des listes de diffusion de FreeBSD.

   La meilleure fac,on de faire cela est d'utiliser la commande
   script(1), avec en parametre le nom du fichier ou enregistrer les
   resultats. Vous devez faire cela juste avant de recompiler le
   systeme, et taper exit une fois que c'est termine.

 # script /var/tmp/mw.out
 Script started, output file is /var/tmp/mw.out  
 # make world
 ... compile, compile, compile ...        
 # exit
 Script done, ...
        

   Si vous le faites, n'enregistrez pas les resultats dans /tmp. Ce
   repertoire peut etre vide au prochain redemarrage du syteme. Il
   vaut mieux les mettre dans /var/tmp (comme dans l'exemple
   precedent) ou dans le repertoire utilisateur de root.

     --------------------------------------------------------------

  6.3. Version 2.2.2 et anterieure

   /usr/src/Makefile contient la cible ``world'', qui recompile tout
   le systeme et l'installe.

   Utilisez donc:

 # make world

     --------------------------------------------------------------

  6.4. Version 2.2.5 et ulterieure

   A partir de la version 2.2.5 de FreeBSD (de fait, c'est la
   premiere version `a avoir ete creee sur la branche -current, puis
   rapatriee dans la branche -stable entre les versions 2.2.2 et
   2.2.5) la cible ``world'' a ete decomposee en deux: ``buildworld''
   et ``installworld''.

   Comme leurs noms l'indiquent, ``buildworld'' reconstruit la
   nouvelle arborescence dans /usr/obj, et ``installworld''
   l'installe sur la machine.

   C'est tres utile pour deux raisons. Tout d'abord, vous pouvez
   recompiler en toute surete, sans toucher aux composants du systeme
   actuel. Le processus est ``autonome''. Vous pouvez donc executer
   ``buildworld'' sur une machine en mode multi-utilisateurs sans
   redouter d'effets facheux. Je vous recommande neanmoins de
   toujours executer l'etape ``installworld'' en mode
   mono-utilisateur.

   En second lieu, cela vous permet d'utiliser des systemes de
   fichiers montes par NFS pour mettre `a jour les autres machines de
   votre reseau. Si vous avez trois machines, A, B, et C que vous
   voulez mettre `a jour, executez make buildworld et make
   installworld sur A. B et C doivent alors monter par NFS /usr/src
   et /usr/obj depuis A, et vous pouvez alors executer make
   installworld pour installer le systeme recompile sur B et C.

   La cible ``world'' existe toujours et vous pouvez l'utiliser
   exactement comme avec la version 2.2.2. make world execute make
   buildworld suivi de make installworld.

     Note : Si vous utilisez separement make buildworld et make
     installworld, vous devez donner `a chaque fois les memes
     parametres `a make(1).

     Par exemple, si vous executez:

 # make -DNOPROFILE=true buildworld

     vous devrez ensuite installer les resultats avec:

 # make -DNOPROFILE=true installworld

     sinon il essayera d'installer les bibliotheques profilees qui
     n'ont pas ete recompilees `a l'etape make buildworld.

     --------------------------------------------------------------

  6.5. -current et ulterieure

   Si vous etes sur la branche -current, vous pouvez aussi donner
   l'option -j `a make. Cela permet `a make d'executer plusieurs
   programmes simultanement.

   C'est particulierement utile sur une machine avec plusieurs
   processeurs. Neanmoins, comme la compilation est plus gourmande en
   Entrees/Sorties qu'en CPU, c'est aussi utile sur une machine
   mono-processeur.

   Typiquement, sur une machine mono-processeur, vous executeriez:

 # make -j4 cible

   pour autoriser make(1) `a executer 4 programmes simultanement. Les
   constatations empiriques postees sur les listes de diffusion
   montrent que c'est en general ce qui apporte le plus de gain en
   performances.

   Si vous avez une machine multi-processeurs et que vous avez
   configure un noyau SMP, essayez des valeurs entre 6 et 10 et voyez
   quel benefice vous en tirez.

   N'oubliez pas que c'est toujours experimental (au moment ou
   j'ecris ceci), et que des modifications de l'arborescence des
   sources rendent parfois cette possibilite inutilisable. Si vous
   n'arrivez pas `a recompiler avec ce parametre, essayez sans avant
   de signaler votre probleme.

     --------------------------------------------------------------

  6.6. Duree

   En supposant que tout ce passe bien, il vous faudra attendre entre
   une heure et demie et une demi-journee.

   En regle generale, un P6 200MHz avec plus de 32MB de RAM et des
   disques SCSI corrects executera make world en environ une heure et
   demie. Un P133 32MB prendra 5 `a 6 heures. Revoyez ces chiffres `a
   la baisse si vos machines sont plus lentes...

     --------------------------------------------------------------

7. Mettez `a jour /etc

   Recompiler le systeme ne met pas `a jour certains repertoires (en
   particulier, /etc, /var et /usr) pour y installer des fichiers de
   configuration nouveaux ou modifies. Il vous faudra le faire `a la
   main, `a vue, et en utilisant `a bon escient la commande diff.

   Vous ne pouvez pas vous contenter de copier les fichiers de
   /usr/src/etc dans /etc pour que cela marche. Certains de ces
   fichiers doivent d'abord etre ``installes''. En effet le
   repertoire /usr/src/etc n'est pas une simple copie de ce que
   devrait contenir votre repertoire/etc. De plus, il y a des
   fichiers qui doivent etre dans /etc et ne sont pas dans
   /usr/src/etc.

   La fac,on la plus simple de proceder est d'installer les fichiers
   dans un nouveau repertoire, puis de passer en revue les
   differences.

     Sauvegardez vos fichiers actuels dans /etc : Bien qu'en principe
     rien ne sera modifie automatiquement dans ce repertoire,
     prudence est mere de surete. Copiez donc votre repertoire /etc
     dans un endroit sur. Quelque chose du genre:

 # cp -Rp /etc /etc.old

     fera l'affaire (-R fait une copie recursive, -p conserve la
     date, les autorisations des fichiers et ainsi de suite).

   Vous devez creer un jeu de repertoires provisoires pour y
   installer les fichiers de /etc et autres. En general, je les mets
   dans /var/tmp/root; il y a un certain nombre de sous-repertoires
   `a creer. Pour ce faire, executez:

 # mkdir /var/tmp/root
 # cd /usr/src/etc
 # make DESTDIR=/var/tmp/root distrib-dirs distribution

   qui va creer l'arborescence necessaire et y installera les
   fichiers. Un grand nombre des sous-repertoires crees dans
   /var/tmp/root seront vides et devront etre supprimes. La fac,on la
   plus simple de le faire est:

 # cd /var/tmp/root
 # find -d . -type d | /usr/bin/perl -lne \
   'opendir(D,$_);@f=readdir(D);rmdir if $#f == 1;closedir(D);'

   qui fait une recherche en profondeur, examine chaque repertoire,
   et s'il ne contient que 2 fichiers (``1'' n'est pas une faute de
   frappe dans la procedure), i.e. ``.'' et ``..'' supprime le
   repertoire.

   /var/tmp/root contient maintenant tous les fichiers `a installer
   `a l'endroit requis sous /. Vous devez ensuite examiner chacun de
   ces fichiers pour voir en quoi ils different de vos propres
   fichiers.

   Notez que certains des fichiers qui ont ete installes dans
   /var/tmp/root commencent par un ``.'' Au moment ou j'ecris ceci,
   les seuls fichiers concernes sont les fichiers d'initialisation
   des interpreteurs de commandes dans /var/tmp/root/ et
   /var/tmp/root/root/, mais il pourrait y en avoir d'autres (cela
   depend de quand vous lirez ces lignes). Assurez-vous d'utiliser ls
   -a pour ne pas les oublier.

   La maniere la plus simple de proceder est d'utiliser la commande
   diff pour comparer deux fichiers.

   Par exemple:

 # diff /etc/shells /var/tmp/root/etc/shells

   vous indiquera les differences entre votre fichier /etc/shells et
   le nouveau fichier /etc/shells. A partir de l`a, decidez si vous
   allez reporter les modifications que vous y avez apportees ou si
   vous allez simplement recopier le nouveau fichier.

   http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/dircmp.pl
   est une petite procedure Perl (Perl 4.036, qui est installe par
   defaut `a partir de la version 2.0 de FreeBSD) qui compare les
   fichiers de deux repertoires (/etc et /var/tmp/root/etc par
   defaut) et liste les fichiers absents ou differents dans les deux
   repertoires.

     Donnez au nouveau repertoire (/var/tmp/root) un nom qui inclue
     une date, pour pouvoir facilement comparer differentes
     versions : Si vous recompilez frequemment votre systeme, vous
     devrez aussi souvent mettre `a jour /etc, ce qui peut devenir
     une vrai corvee.

     Vous pouvez accelerer le processus en gardant une copie du
     dernier jeu de fichiers reportes dans /etc. La procedure
     suivante vous suggere comment faire.

      1. Recompilez le systeme comme d'habitude. Au moment de mettre
         `a jour /etc et les autres repertoires, donnez au repertoire
         cible un nom base sur la date du jour. Si vous faisiez cela
         le 14 Fevrier 1998, vous pouviez proceder comme suit:

 # mkdir /var/tmp/root-980214
 # cd /usr/src/etc
 # make DESTDIR=/var/tmp/root-980214 \
     distrib-dirs distribution

      2. Reportez les modifications depuis ce repertoire comme decrit
         plus haut.

         Ne supprimez pas le repertoire /var/tmp/root-980214 quand
         vous aurez termine.

      3. Quand vous chargerez la version la plus recente des sources
         et la recompilerez, faites de meme. Vous aurez alors un
         nouveau repertoire, /var/tmp/root-980221 par exemple (si
         vous faites une mise `a jour chaque semaine).

      4. Vous pouvez maintenant voir les modifications intervenues
         d'une semaine `a l'autre avec quelque chose comme:

 # cd /var/tmp
 # diff -r root-980214 root-980221

         qui vous donnera les differences entre tous les fichiers des
         deux repertoires.

         Typiquement, il y aura beaucoup moins de differences
         qu'entre /var/tmp/root-980221/etc et /etc. Comme il y a
         beaucoup moins de differences, il est beaucoup plus facile
         de les reporter dans le repertoire /etc.

      5. Vous pouvez maintenant supprimer le plus ancien des deux
         repertoires /var/tmp/root-*:

 # rm -rf /var/tmp/root-980214

      6. Repetez l'operation chaque fois que vous devez reporter des
         modifications dans /etc.

     Vous pouvez utiliser la commande date(1) pour automatiser la
     generation des noms de repertoires. Par exemple:

 # mkdir /var/tmp/root-`date "+%y%m%d"`

     cree un repertoire dont le nom depend de l'annee, du mois et du
     jour.

     --------------------------------------------------------------

8. Mettez `a jour /dev

     DEVFS : Si vous utilisez DEVFS ce qui suit ne vous concerne
     probalement pas.

   Pour des raisons de securite, cette mise `a jour se fait en
   plusieurs etapes.

   Copiez tout d'abord /var/tmp/root/dev/MAKEDEV dans /dev.

 # cp /var/tmp/root/dev/MAKEDEV /dev

   Prenez maintenant un instantane de l'etat de votre repertoire
   /dev. Il doit indiquer les proprietaires, les droits et les codes
   majeur et mineur de chaque fichier special de peripherique, mais
   pas leur date de derniere mise `a jour. La fac,on la plus facile
   de proceder est d'utiliser la commande awk pour eliminer les
   informations inutiles:

 # cd /dev
 # ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out

   Ensuite, recreez tous les fichiers speciaux de peripheriques:.

 # sh MAKEDEV all

   Reprenez un instantane de l'etat de votre repertoire, cette
   fois-ci dans /var/tmp/dev2.out. Comparez maintenant ces deux
   instantanes pour voir si certains fichiers speciaux de
   peripheriques n'ont pas ete recrees. Il ne devrait pas en manquer,
   mais prudence est mere de surete.

 # diff /var/tmp/dev.out /var/tmp/dev2.out

   Il manquera peut-etre des descripteurs de partitions, il vous
   faudra alors executer des commandes du type :

 # sh MAKEDEV sd0s1

   pour les recreer. Les details dependent de votre installation.

     --------------------------------------------------------------

9. Mettez `a jour /stand

     Note : Cette etape n'est decrite que pour etre exhaustif, elle
     peut etre omise sans danger.

   Pour etre exhaustif, vous pouvez aussi mettre `a jour les fichiers
   de /stand. Ces fichiers sont des liens physiques sur le programme
   /stand/sysinstall. L'edition de liens de cet executable doit etre
   statique, pour qu'on puisse l'utiliser sans qu'aucun autre systeme
   de fichiers (et en particulier /usr) ne soit monte.

 # cd /usr/src/release/sysinstall
 # make all install

     Sources anterieurs au 2 Avril 1998 : Si votre code source date
     d'avant le 2 Avril 1998, ou que la version de votre Makefile est
     inferieure `a 1.68 (pour FreeBSD-current et les systemes 3.x) ou
     `a 1.48.2.21 (pour les systemes 2.2.x), vous devrez ajouter
     l'option NOSHARED=yes comme suit:

 # make NOSHARED=yes all install

     --------------------------------------------------------------

10. Compilez et installez un nouveau noyau

   Pour tirer pleinement parti de votre nouveau systeme, vous devez
   recompiler le noyau. C'est pratiquement indispensable, parce que
   des structures de donnees peuvent avoir change, et des programmes
   comme ps et top ne marcheront pas tant que le systeme et le noyau
   ne seront pas au meme niveau de version.

   Suivez les instructions du "manuel" pour compiler un nouveau
   noyau. Si vous avez dej`a recompile un noyau personnalise examinez
   en detail le fichier de configuration LINT pour voir s'il y a de
   nouvelles options dont vous pourriez tirer parti.

   Une version precedente de ce document suggerait de redemarrer le
   systeme avant de recompiler le noyau. C'est un erreur parce que :

     * Des commandes comme ps, ifconfig and sysctl peuvent ne plus
       fonctionner. Dans ce cas, votre machine ne peut plus se
       connecter au reseau.

     * De meme, des utilitaires essentiels comme mount peuvent aussi
       etre inutilisables, auquel cas /, /usr et ainsi de suite, ne
       peuvent plus etre montes. Il y a peu de chances que cela
       arrive si vous etes sur la branche -stable, mais c'est plus
       probable sur la branche -current apres des modifications
       importantes.

     * Les LKMs ("Loadable Kernel Modules" - modules du noyau `a
       chargement dynamique) reconstruits en meme temps que ``world''
       peuvent "planter" un noyau plus ancien.

   Pour toutes ces raisons, il vaut mieux recompiler et installer un
   nouveau noyau avant de redemarrer.

   Vous devez recompiler le noyau apres avoir termine make world (ou
   make installworld). Si vous ne le faites pas (peut-etre
   voulez-vous vous assurer que le noyau compile avant de mettre `a
   jour le systeme), vous pourriez avoir des problemes. Cela parce
   que votre commande config n'est pas `a niveau avec les sources du
   noyau.

   Dans ce cas, executez:

 # /usr/obj/usr/src/usr.sbin/config NOM_DU_NOYAU

   pour recompiler le noyau avec la nouvelle version de config. Cela
   ne marchera peut-etre pas `a tous les coups. Il est recommande
   d'en finir avec make world (ou make installworld) avant de
   compiler un nouveau noyau.

     --------------------------------------------------------------

11. Redemarrez

   Vous en avez fini. Apres avoir verifie que tout semble etre en
   place, vous pouvez maintenant redemarrez votre systeme. Un simple
   fastboot(8) devrait suffire.

 # fastboot

     --------------------------------------------------------------

12. C'est fini

   Vous devriez maintenant avoir mis `a jour avec succes votre
   systeme FreeBSD. Felicitations.

   Vous aurez peut-etre de petits problemes si des details vous ont
   echappes. Par exemple, il m'est arrive d'effacer le fichier
   /etc/magic au moment de la mise `a jour de /etc, de ce fait, la
   commande file ne marchait plus. Un petit moment de reflexion et
   j'ai trouve que:

 # cd /usr/src/usr.bin/file
 # make all install

   suffisait `a regler ce probleme.

     --------------------------------------------------------------

13. Questions?

  13.1. Dois-je refaire le monde `a chaque evolution?

   Il n'y a pas de reponse toute faite `a cette question, tout depend
   de la nature des evolutions. Je viens juste, par exemple,
   d'executer CVSup, et les fichiers suivants ont ete modifies depuis
   ma derniere recompilation:

 src/games/cribbage/instr.c
 src/games/sail/pl_main.c
 src/release/sysinstall/config.c
 src/release/sysinstall/media.c
 src/share/mk/bsd.port.mk

   Il n'y a pas l`a matiere `a ce que je recompile mon systeme. Je
   vais simplement aller dans les bons sous-repertoires et executer
   make all install, et c'est `a peu pres tout. Mais s'il y a des
   evolutions importantes, par exemple sur src/lib/libc/stdlib alors
   ou je referais, le monde, ou je recompilerais au moins toutes les
   parties du systeme qui sont liees statiquement (de meme que tout
   ce que je pourrais avoir ajoute qui serait lie statiquement).

   En fin de journee, c'est `a vous de voir. Vous prefererez
   peut-etre recompiler votre systeme tous les quinze jours, et
   laisser les modifications s'empiler pendant ces quinze jours. Ou
   bien vous preferez ne recompiler que ce qui a change et vous faire
   confiance pour reperer ce qui en depend.

   Et, bien sur, cela depend de la frequence avec laquelle vous
   voulez faire vos mises `a jour, et de si vous etes sur la branche
   -stable ou sur la branche -current.

     --------------------------------------------------------------

  13.2. Ma compilation echoue avec de nombreuses erreurs "signal 12" (ou
  tout autre numero de signal)

   Cela indique generalement un probleme materiel. (Re)faire le monde
   est un bon moyen de mettre votre materiel sous pression, et mettra
   souvent en evidence des defaillances de la memoire vive. Cela se
   manifeste normalement de soi-meme: le compilation echoue en
   recevant de mysterieux signaux.

   Vous pouvez vous en assurer si vous relancer la compilation et
   qu'elle echoue en un endroit different.

   Dans ce cas, vous ne pouvez guere faire autre chose que
   d'intervertir les differents composants de votre materiel pour
   determiner lequel est en cause.

     --------------------------------------------------------------

  13.3. Puis-je detruire /usr/obj apres avoir fini?

   Tout depend de comment vous voulez refaire le monde par la suite.

   /usr/obj contient tous les fichiers objets generes `a la
   compilation. Normalement, une des premieres etapes de ``make
   world'' est de supprimer ce repertoire et de repartir `a zero.
   Dans ce cas, conserver ce repertoire /usr/obj apres en avoir
   termine ne sert pas `a grand chose, alors que vous economiseriez
   pas mal d'espace disque (au jour d'aujourd'hui environ 150Mo).

   Neanmoins, si vous savez ce que vous faites, vous pouvez faire en
   sorte que ``make world'' saute cette etape. Les reconstructions
   ulterieures seront beaucoup plus rapides, car la plupart des
   sources n'auront pas besoin d'etre recompiles. Le revers de la
   medaille est que des problemes de dependance subtils peuvent se
   manifester, provoquant l'echec de votre recompilation de maniere
   etrange. Cela genere frequemment du bruit sur les listes de
   diffusion de FreeBSD, quand quelqu'un se plaint que sa mise `a
   jour a echoue, sans realiser qu'il a tente de bruler les etapes.

   Si vous aimez vivre dangereusement, passez le parametre
   ``NOCLEAN'' `a make, comme suit:

 # make -DNOCLEAN world

     --------------------------------------------------------------

  13.4. Une recompilation interrompue peut-elle etre reprise?

   Tout depend de jusqu'ou vous etes alle avant de rencontrer un
   probleme.

   En general (mais ce n'est pas une regle absolue) ``make world''
   cree de nouveaux exemplaires des utilitaires de base (comme gcc,
   et make) et des bibliotheques systeme. Ces outils et bibliotheques
   sont ensuite installes. Ils sont ensuite utilises pour se
   reconstruire eux-memes, et installes de nouveau. Le systeme entier
   (y compris maintenant les outils usuels, comme ls ou grep) est
   ensuite recompile avec les nouveaux outils et bibliotheques de
   base.

   Si vous en etes `a cette derniere etape, et que vous le savez
   (parce que vous avez consulte les resultats que vous avez
   enregistres) alors vous pouvez (avec une bonne chance de reussite)
   faire:

 ... regler le probleme ...
 # cd /usr/src
 # make -DNOCLEAN all
          

   qui ne detruira pas les resultats du travail qu'a dej`a effectue
   ``make world''.

   Si vous voyez le message :

 --------------------------------------------------------------
  Building everything..
 --------------------------------------------------------------

   dans les comptes-rendus de ``make world'', cette fac,on de
   proceder est probablement sure.

   Si vous ne voyez pas ce message, ou doutez de vous, alors prudence
   est mere de surete, et il vaut mieux tout reprendre depuis le
   debut.

     --------------------------------------------------------------

  13.5. Puis-je utiliser une seule machine de reference pour mettre `a
  jour plusieurs machines (NFS)?

   On pose souvent la question sur les listes de diffusion de FreeBSD
   de savoir s'il est possible de tout compiler sur une seule machine
   puis d'installer les resultats de cette compilation sur d'autres
   machines du reseau avec make install.

   C'est quelque chose que je n'ai jamais fait, aussi les indications
   qui suivent m'ont-elles ete donnees par d'autres ou deduites des
   Makefiles.

   La marche exacte `a suivre depend de votre version de FreeBSD.

     Note : Vous devrez encore mettre `a jour /etc et /dev sur les
     machines cibles apres cette etape.

     --------------------------------------------------------------

    13.5.1. Version 2.1.7 et anterieures

   Dans un message adresse `a questions@freebsd.org, Antonio Bemfica
   a suggere la methode suivante:

 Date: Thu, 20 Feb 1997 14:05:01 -0400 (AST)
 From: Antonio Bemfica <bemfica@militzer.me.tuns.ca>
 To: freebsd-questions@freebsd.org
 Message-ID: <Pine.BSI.3.94.970220135725.245C-100000@militzer.me.tuns.ca>

 Josef Karthauser a demande:

 > Quelqu'un a-t-il la bonne methode pour mettre `a jour
 > les machines d'un reseau?

 D'abord make world, etc... sur votre machine de reference
 Ensuite, montez / and /usr sur la machine distante:

 machine_de_reference% mount machine_distante:/    /mnt
 machine_de_reference% mount machine_distante:/usr /mnt/usr

 Ensuite, faites make install avec /mnt comme cible:

 machine_de_reference% make install DESTDIR=/mnt

 Repetez cela pour chaque machine de votre reseau.
 Cela marche tres bien dans mon cas.
     
 Antonio

   Ce mecanisme ne fonctionne (autant que je sache) que si vous
   pouvez ecrire sur /usr/src sur le serveur NFS, car ce devait etre
   la cible d'``install'' avec la version 2.1.7 et les precedentes.

     --------------------------------------------------------------

    13.5.2. Version 2.2.0 and ulterieures

   Entre les versions 2.1.7 et 2.2.0 la cible ``reinstall'' a ete
   introduite. Vous pouvez utiliser la methode decrite ci-dessus pour
   la version 2.1.7, en remplac,ant ``install'' par ``reinstall''.

   Cela ne demande plus de droits d'ecriture sur le repertoire
   /usr/src du serveur NFS.

     Note : Un bogue est apparu avec cette cible entre les versions
     1.68 et 1.107 du Makefile, qui impliquait qu'il fallait avoir
     les droits d'ecriture. Ce bogue a ete corrige avant la diffusion
     de la version 2.2.0 de FreeBSD, mais peut encore poser probleme
     si vous avez un vieux serveur sous -stable de cette epoque.

     --------------------------------------------------------------

    13.5.3. Version 2.2.5 et ulterieure

   Comme decrit plus haut, les cibles ``buildworld'' et
   ``installworld'' peuvent etre employees pour recompiler sur une
   machine, puis monter par NFS /usr/src et /usr/obj sur la machine
   distante et y installer le nouveau systeme.

     --------------------------------------------------------------

  13.6. Comment puis-je accelerer make world?

     * Passez en mode mono-utilisateur.

     * Mettez les repertoires /usr/src et /usr/obj sur des systemes
       de fichiers et des disques differents. Si possible, installez
       ces disques sur des controleurs differents.

     * Mieux encore, mettez ces systemes de fichiers sur plusieurs
       disques et utilisez ``ccd'' ("concatenated disk driver" =
       pilote de disques concatenes).

     * Ne compilez pas les bibliotheques profilees (mettez
       ``NOPROFILE=true'' dans /etc/make.conf). Vous n'en avez
       certainement pas besoin.

     * Dans /etc/make.conf, positionnez aussi ``CFLAGS'' `a quelque
       chose comme ``-O -pipe''. L'optimisation ``-O2'' est bien plus
       lente, et la difference d'optimisation entre ``-O'' et ``-O2''
       est en general negligeable. ``-pipe'' dit au compilateur
       d'utiliser des tuyaux (``pipes'') `a la place de fichiers, ce
       qui economise des acces disque (mais utilise plus de memoire).

     * Donnez l'option -j<n> au compilateur (Si vous avez une version
       suffisamment recente de FreeBSD) pour executer plusieurs
       programmes en parallele. Cela ameliore les choses, que vous
       ayez une machine mono- ou multi-processeurs.

     * Le systeme de fichiers qui contient /usr/src peut etre monte
       (ou remonte) avec l'option ``noatime''. De cette maniere, les
       dates de dernier acces aux fichiers ne sont pas enregistrees
       sur disque. Vous n'avez de toute fac,on probablement pas
       besoin de cette information.

         Note : ``noatime'' existe `a partir de la version 2.2.0.

 # mount -u -o noatime /usr/src

         Note : Cet exemple suppose que /usr/src constitue `a lui
         seul un systeme de fichiers. Si ce n'est pas le cas (s'il
         fait partie de /usr par exemple) vous devez indiquez le
         point de montage de ce systeme de fichiers, et non /usr/src.

     * Le systeme de fichiers ou se trouve /usr/obj peut etre monte
       (ou remonte) avec l'option ``async''. Les ecritures sur disque
       se font alors de fac,on asynchrone. En d'autres termes, le
       programme reprend immediatement la main, mais l'ecriture se
       fait quelques secondes apres. Les acces disque sont ainsi
       groupes, et le gain en performances est spectaculaire.

         Note : Rappelez-vous que cette option rend votre systeme de
         fichiers plus fragile. Avec cette option, les risques sont
         accrus qu'en cas de coupure d'alimentation, le systeme de
         fichiers soit irrecuperable quand la machine redemarrera.

         S'il n'y a que /usr/obj sur ce systeme de fichiers, ce n'est
         pas un probleme. S'il contient des informations plus
         sensibles, assurez-vous que vos sauvegardes soient `a jour
         avant d'activer cette option.

 # mount -u -o async /usr/obj

         Note : Comme auparavant, si /usr/obj ne constitue pas un
         systeme de fichiers en soit, remplacez-le dans l'exemple par
         le nom du point de montage qui convient.

     --------------------------------------------------------------

14. Traductions

  14.1. Document original

   L'original de ce document se trouve sur
   http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html.

     --------------------------------------------------------------

  14.2. Japonais

   MAEKAWA Masahide a traduit ce document en Japonais. Sa traduction
   est disponible `a l'adresse
   http://www.rr.iij4u.or.jp/~bishop/FreeBSD/mw.html.

     --------------------------------------------------------------

15. Contributions

   Les personnes suivantes ont contribue d'une fac,on ou d'une autre
   `a la redaction de ce document. Soit directement en suggerant des
   modifications ou des ameliorations ou en signalant des erreurs,
   soit par leurs messages sur les listes de diffusion de FreeBSD, ou
   j'ai puise sans scrupule de l'information. Mes remerciements `a
   tous.

     * Antonio Bemfica, bemfica@militzer.me.tuns.ca

     * Sue Blake, sue@welearn.com.au

     * Brian Haskin, haskin@ptway.com

     * Kees Jan Koster, kjkoster@kjkoster.org

     * A Joseph Kosy, koshy@india.hp.com

     * Greg Lehey, grog@lemis.com

     * Wes Peters, softweyr@xmission.com

     * Joseph Stein, joes@wstein.com

     * Studded, studded@dal.net

     * Axel Thimm Axel.Thimm@physik.fu-berlin.de

     * Matthew Thyer Matthew.Thyer@dsto.defence.gov.au

  Notes

   [1] En anglais !                                                   

     --------------------------------------------------------------

        Ce document, ainsi que d'autres peut etre telecharge sur
                   ftp.FreeBSD.org/pub/FreeBSD/doc/.

Pour toutes questions `a propos de FreeBSD, lisez la documentation avant
                 de contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.
