
                   The Unix and Internet Fundamentals HOWTO

by Eric S. Raymond

   v1.1, 3 Dcembre 1998
     _________________________________________________________________

   _Ce document dcrit les principes fondamentaux des ordinateurs de type
   PC, des systmes d'exploitation de type UNIX et d'Internet dans un
   langage non technique. (Traduction franaise Philippe Malinge
   pmal@easynet.fr) _
     _________________________________________________________________

1. Introduction

1.1 Sujet de ce document

   Ce document est conu pour aider les utilisateurs de Linux et
   d'Internet qui dsirent apprendre en faisant. Bien que ce soit un bon
   moyen d'acqurir des comptences, quelquefois cela laisse de
   singulires lacunes dans la connaissance des bases -- lacunes qui
   peuvent rendre difficile la rflexion crative ou perturber fortement,
   par manque d'un modle mental clair sur ce qu'il devrait se passer.

   J'essaierai de dcrire clairement, dans un langage simple, comment
   tout marche. La prsentation sera adapte aux personnes qui utilisent
   Unix ou Linux sur du matriel de type PC. Cependant, je ferai ici
   couramment rfrence  'Unix' : ce que je dcrirai se retrouvera sur
   toutes les plates-formes et sur toutes les variantes d'Unix.

   Je suppose que vous utilisez un PC avec un processeur de type Intel.
   Les dtails diffrent quelque peu si vous utilisez un processeur Alpha
   ou PowerPC ou une autre machine Unix, mais les concepts de base
   restent les mmes.

   Je ne voudrais pas rpter les choses, alors vous allez devoir faire
   attention, mais cela veut dire que vous retiendrez chaque mot que vous
   lirez. C'est une bonne ide que de tout parcourir rapidement la
   premire fois ; vous devrez y revenir et relire un certain nombre de
   fois afin de digrer ce que vous avez appris.

   C'est un document en permanente volution. Je prvois d'ajouter des
   chapitres en rponse aux feedbacks, ainsi vous pourrez priodiquement
   le passer en revue.

1.2 Ressources rattaches

   Si vous lisez dans l'espoir d'apprendre comment 'hacker', vous devrez
   lire How To Become A Hacker FAQ. Il y a beaucoup de liens vers
   d'autres ressources utiles.

1.3 Nouvelles versions de ce document

   Les nouvelles versions de 'Unix and Internet Fundamentals HOWTO'
   seront postes priodiquement dans comp.os.linux.help et
   news:comp.os.linux.announce et news.answers. Elles pourront tre
   tlcharges  partir de divers sites Linux WWW ou FTP, y compris la
   page d'accueil du LDP.

   Vous pouvez accder  la dernire version (en anglais) de ce document
   sur le World Wide Web via l'URL
   http://sunsite.unc.edu/LDP/HOWTO/Unix-Internet-Fundamentals-HOWTO.html
   .

1.4 Ractions et corrections

   Si vous avez des questions ou des commentaires  propos de ce
   document, vous pouvez envoyer vos courriers lectroniques  Eric S.
   Raymond,  esr@thyrsus.com. Toutes suggestions ou critiques seront les
   bienvenues. Seront spcialement apprcis les liens hypertexte vers
   des explications plus dtailles ou vers des concepts propres. Si vous
   trouvez des erreurs dans ce document, faites-le moi savoir afin que je
   puisse les corriger dans la nouvelle version. Merci.

2. Anatomie de base de votre ordinateur

   Votre ordinateur possde un processeur  l'intrieur duquel se font
   rellement les calculs. Il possde une mmoire interne (ce que les
   gens DOS/Windows dsignent par ``RAM'' et que les gens UNIX dsignent
   souvent par ``core''). Le processeur et la mmoire rsident sur la
   _carte mre_ qui est le coeur de votre ordinateur.

   Votre ordinateur possde un cran et un clavier. Il a un (ou des)
   disque(s) dur(s) et un lecteur de disquettes. L'cran et vos disques
   ont des _cartes contrleur_ que l'on connecte sur la carte mre et qui
   aident l'ordinateur  piloter ces priphriques externes. Votre
   clavier est trop simple pour ncessiter une carte spare ; le
   contrleur est intgr dans le chssis du clavier.)

   Nous dcrirons plus tard en dtails comment fonctionnent ces
   priphriques. Pour l'instant, quelques notions de base afin de garder
    l'esprit comment ils fonctionnent ensemble :

   Tous les lments internes de votre ordinateur sont connects par un
   _bus_. Physiquement, le bus est ce sur quoi vous connectez vos cartes
   contrleur (carte vido, contrleur disque, carte son si vous en avez
   une). Le bus est l'autoroute emprunte par les donnes entre votre
   processeur, votre cran, votre disque et le reste.

   Le processeur, qui fait tout marcher, ne peut rellement voir tous les
   lments directement ; il doit communiquer avec eux via le bus, le
   seul sous-systme qui soit effectivement trs rapide, qui accde
   directement  la mmoire (le core). Afin que les programmes puissent
   s'excuter, ils doivent tre en mmoire _core_.

   Lorsque votre ordinateur lit un programme ou une donne sur le disque,
   il se passe rellement les choses suivantes : le processeur utilise le
   bus pour envoyer une requte de lecture du disque  votre contrleur
   de disque. Quelques instants aprs, le contrleur de disque utilise le
   bus pour signaler  l'ordinateur qu'il a lu la donne et qu'il l'a
   mise  un certain endroit de la mmoire. Le processeur peut utiliser
   le bus pour aller chercher ce qu'il y a  cet endroit de la mmoire.

   Votre clavier et votre cran communiquent galement avec le processeur
   via le bus mais d'une manire plus simple. Nous exposerons cela plus
   loin. Pour l'instant vous en savez suffisamment pour comprendre ce
   qu'il se passe lorsque vous allumez votre ordinateur.

3. Que se passe-t-il lorsque vous allumez votre ordinateur ?

   Un ordinateur sans programme qui s'excute est juste un tas inerte
   d'lectronique. La premire chose que doit faire un ordinateur
   lorsqu'il est allum est de dmarrer un programme spcial appel
   _systme d'exploitation_. Le travail du systme d'exploitation est
   d'aider les autres programmes de l'ordinateur  travailler, en
   traitant les dtails mprisables du contrle du matriel de
   l'ordinateur.

   Le processus de dmarrage du systme d'exploitation est appel
   _booting_ (originalement c'tait _bootstrapping (laage des
   chaussures)_, allusion  la difficult d'enfiler soi mme ses
   chaussures `par les lacets'. Votre ordinateur sait comment booter car
   les instructions de boot sont stockes dans un de ses composants, le
   composant BIOS (ou Basic Input/Output System).

   Le composant BIOS dit o aller chercher,  une place fixe sur le
   disque dur de plus basse adresse (le _disque de boot_), un programme
   spcial appel _chargeur de boot (boot loader)_ (sous Linux le
   chargeur de boot est appel LILO). Le chargeur de boot est charg en
   mmoire puis lanc. Le travail du chargeur de boot est de dmarrer le
   systme d'exploitation rel.

   Le chargeur fait cela en allant chercher un _noyau_, en le chargeant
   en mmoire et en le dmarrant. Lorsque vous bootez Linux et voyez
   "LILO" sur l'cran suivi par une succession de points, c'est qu'il
   charge le noyau. (Chaque point signifie qu'il vient de charger un
   autre _bloc du disque_ du code du noyau.)

   (Vous pouvez vous demander pourquoi le BIOS ne charge pas le noyau
   directement -- pourquoi ces deux tapes du processus avec le chargeur
   de boot ? C'est que le BIOS n'est pas vraiment intelligent. En fait il
   est carrment stupide, et Linux ne l'utilise jamais aprs avoir boot.
   A l'origine, j'ai programm sur des PC 8-bits primitifs avec de petits
   disques : littralement ils ne pouvaient accder  suffisamment de
   disque pour charger le noyau directement. L'tape du chargeur de boot
   vous permet de dmarrer plusieurs systmes d'exploitation  partir de
   diffrents emplacements de votre disque, dans le cas o Unix n'est pas
   assez bon pour vous.)

   Une fois que le noyau dmarre, il doit chercher autour de lui, trouver
   le reste du matriel et tre prt pour excuter des programmes. Il
   fait cela non pas en fouillant  des adresses mmoire ordinaires, mais
    des _ports d'Entre/Sortie_ -- des adresses spciales du bus,
   senses avoir une carte contrleur de priphriques en attente de
   commandes  cet endroit. Le noyau ne fouille pas au hasard ; il a un
   ensemble de connaissances qui lui permet de savoir ce qu'il est sens
   trouver ici, et comment les contrleurs rpondraient s'ils taient
   prsents. Ce processus est appel _Exploration automatique_.

   La plupart des messages que vous voyez au moment du boot sont
   l'exploration de votre matriel par le noyau  travers les ports
   d'Entre/Sortie, le chiffrage de ce qui est disponible et l'adaptation
    votre machine. Le noyau Linux est extrmement bon pour cela,
   meilleur que la plupart des autres Unix et _tellement_ meilleur que
   DOS ou Windows. En fait, beaucoup de vieux adeptes de Linux pensent
   que l'ingniosit des explorations de Linux lors du boot (qui lui
   permettent de s'installer relativement simplement) ont t une raison
   de s'panouir dans le monde des expriences des Unix libres pour
   attirer une masse critique d'utilisateurs.

   Mais rendre le noyau compltement charg et s'excutant n'est pas la
   fin du processus de boot ; c'est juste la premire tape (quelquefois
   appele _niveau d'excution 1 (run level 1)_).

   L'tape suivante du noyau est de s'assurer que vos disques sont OK.
   Les systmes de fichiers sur disques sont des choses fragiles ; s'ils
   ont t endommags par une panne matrielle ou par une coupure
   soudaine d'alimentation lectrique, il y a de bonnes raisons de
   rtablir l'intgrit avant que votre Unix ne puisse aller plus loin.
   Nous parlerons plus tard de ce que l'on dit  propos de comment les
   systmes de fichiers peuvent devenir mauvais.

   L'tape suivante du noyau est de lancer plusieurs _dmons_. Un dmon
   est un programme comme un spouleur d'imprimante, un serveur de mail ou
   un serveur WWW qui se cache en arrire-plan en attendant d'avoir des
   choses  faire. Ces programmes spciaux doivent coordonner plusieurs
   requtes qui peuvent entrer en conflit. Il y a des dmons car il est
   souvent plus facile d'crire un programme qui s'excute constamment et
   qui sait tout des requtes, plutt que d'essayer de s'assurer qu'un
   troupeau de copies (chacune traitant une requte et toutes s'excutant
   en mme temps) ne se gneraient pas mutuellement. La collection
   particulire de dmons que le systme dmarre peut varier, mais
   inclura presque toujours un spouleur d'imprimante (un dmon
   garde-barrire de votre imprimante).

   Une fois que tous les dmons ont dmarr, nous sommes dans le _niveau
   d'excution 2 (run level 2)_. L'tape suivante est la prparation pour
   les utilisateurs. Le noyau dmarre une copie d'un programme appel
   getty pour surveiller votre console (et peut tre d'autres copies pour
   surveiller des ports-srie entrants) Ce programme est celui duquel
   jaillit le prompt login sur votre console. Nous sommes maintenant dans
   le _niveau d'excution 3 (run level 3)_ et prts pour votre connexion
   et l'excution de vos programmes.

   Quand vous vous connectez (en donnant un nom et un mot de passe), vous
   vous identifiez auprs de getty et de l'ordinateur. Il excute
   maintenant un programme appel (assez naturellement) login, qui
   ralise des tches ancillaires et dmarre un interprteur de
   commandes, le _shell_. (Oui getty et login pourraient tre un seul et
   mme programme. Ils sont spars pour des raisons historiques que nous
   n'expliciterons pas ici.)

   Dans la section suivante, nous parlerons de ce qui se passe lorsque
   vous excutez des programmes  partir du shell.

4. Que se passe-t-il lorsque vous excutez des programmes  partir du shell?

   Le shell normal vous donne le prompt '$' que vous voyez aprs vous
   tre connect (cependant vous pouvez le modifier et mettre autre
   chose). Nous ne parlerons pas de la syntaxe du shell et des choses
   faciles que vous pouvez voir sur votre cran ici ; alors que nous
   'jetterons un oeil' sur ce qu'il se passe du point de vue de
   l'ordinateur.

   Aprs la phase de boot et avant que vous n'excutiez un programme,
   vous pouvez penser  votre ordinateur comme tant un zoo de processus
   qui attendent qu'il se passe quelque chose. Ils attendent des
   _vnements_. Un vnement, ce peut tre l'enfoncement d'une touche ou
   un dplacement de la souris. Ou, si votre machine est connecte  un
   rseau, un vnement peut tre un paquet de donnes venant de ce
   rseau.

   Le noyau est un de ces processus. C'en est un spcial, car il contrle
   le moment o les autres processus _utilisateur_ peuvent s'excuter, et
   c'est normalement le seul processus qui accde directement au matriel
   de la machine. En fait, les processus utilisateurs font des requtes
   au noyau lorsqu'ils veulent obtenir une entre clavier, crire sur
   votre cran, lire ou crire sur votre disque ou juste autre chose que
   consommer quelques bits en mmoire. Ces requtes sont appeles _appels
   systme_.

   Normalement toute Entre/Sortie passe par le noyau de manire  ce
   qu'il puisse ordonnancer les oprations et viter ainsi aux processus
   de se marcher les uns sur les autres. Quelques processus utilisateur
   sont autoriss  contourner le noyau, habituellement en ayant accs
   directement aux ports d'Entre/Sortie. Les serveurs X (les programmes
   qui traitent les requtes graphiques des autres programmes sur la
   plupart des machines Unix) sont des exemples classiques. Mais nous
   n'avons pas vu de serveur X pour l'instant ; vous tes au prompt du
   shell sur une console en mode caractres.

   Le shell est juste un processus utilisateur, et non un processus
   particulirement spcial. Il attend vos frappes sur les touches du
   clavier, coutant ( travers le noyau) le port d'E/S du clavier. Comme
   le noyau les voit, il les affiche sur votre cran et les passe au
   shell. Le shell essaie de les interprter comme tant des commandes.

   Tapez `ls' suivi de `Enter' afin de lister le contenu d'un rpertoire.
   Le shell applique ses rgles internes pour valuer la commande que
   vous voulez excuter dans le fichier `/bin/ls'. Il fait un appel
   systme en demandant au noyau de lancer `/bin/ls' comme un processus
   _fils_ et donne son accs  l'cran et au clavier  travers le noyau.
   Le shell se rendort en attendant que 'ls' se termine.

   Lorsque /bin/ls est termin, il dit au noyau qu'il a termin en
   effectuant un appel systme _exit_. Le noyau rveille le shell et lui
   dit qu'il peut continuer  s'excuter. Le shell affiche un autre
   prompt et attend une autre ligne en entre.

   D'autres choses peuvent tre faites pendant l'excution de `ls',
   cependant (nous supposerons que la liste du rpertoire est trs
   longue). Vous pourriez basculer sur une autre console virtuelle, vous
   connecter, et lancer une jeu de Quake par exemple. Ou bien, supposez
   que vous tes connect  Internet : votre machine peut envoyer ou
   recevoir des mails pendant que `/bin/ls' s'excute.

5. Comment marchent les priphriques d'entre et les interruptions ?

   Votre clavier est un priphrique trs simple ; simple car il gnre
   un petit flux de donnes trs lentement (sur un ordinateur standard).
   Lorsque vous relchez une touche, cet vnement est signal par le
   cble du clavier qui va provoquer une _interruption matriel_.

   C'est au systme d'exploitation de surveiller de telles interruptions.
   Pour chaque type possible d'interruption, il y a un _handler
   d'interruption_, une partie du systme d'exploitation dissimule toutes
   les donnes associes (comme la valeur touche enfonce/touche
   relche) tant qu'elle ne peut tre traite.

   Ce que le fait le handler d'interruption disque pour votre clavier est
   de dposer la valeur de la touche dans une zone en bas de la mmoire
   (core). Ainsi elle sera disponible pour l'inspection lorsque le
   systme d'exploitation passera le contrle  n'importe quel programme
   suppos attendre prsentement une entre clavier.

   Des priphriques d'entre plus complexes comme les disques
   travaillent de manire similaire. Prcdemment nous faisions rfrence
    un contrleur de disques utilisant le bus pour signaler qu'une
   requte disque a bien t excute. Que se passe-t-il si ce disque
   reoit une interruption ? Le handler de l'interruption disque copie
   alors la donne trouve dans la mmoire, pour une utilisation future
   par le programme qui en avait fait la demande.

   Chaque type d'interruption est associ  un _niveau de priorit_. Les
   interruptions de plus basse priorit (comme les vnements clavier)
   sont traites aprs celles de priorit suprieures (comme les tops
   d'horloge ou les vnements disque). Unix a t conu pour traiter
   prioritairement les types d'vnements qui doivent tre traits
   rapidement afin de conserver une machine sur laquelle les temps de
   rponse sont sont sans -coup.

   Les messages que vous voyez pendant la phase de boot font rfrence 
   des numros d'_IRQ_. Vous devez tre prvenus qu'une des causes les
   plus courantes de mauvaise configuration de votre matriel est d'avoir
   deux priphriques qui essaient d'utiliser la mme IRQ, sans savoir ce
   que c'est rellement.

   La rponse est ici. IRQ est l'abbrviation de "Interrupt ReQuest". Le
   systme d'exploitation a besoin de savoir au dmarrage quel numro
   d'interruption sera utilis par chaque priphrique, ainsi il peut
   associer le handler adquat pour chacun. Si deux priphriques
   diffrents essaient d'utiliser la mme IRQ, les interruptions seraient
   quelquefois distribues au mauvais handler. Cela est classique au
   moins au verrouillage du priphrique, et peut parfois dstabiliser le
   systme d'exploitation, qu'il se "dsintgre" ou qu'il se crashe.

6. Comment mon ordinateur fait-il plusieurs choses en mme temps ?

   En fait, il ne le fait pas. Les ordinateurs ne peuvent traiter qu'une
   seule tche (ou _processus_)  la fois. Mais un ordinateur peut
   changer de tche trs rapidement, et duper l'esprit humain en lui
   faisant croire qu'il fait plusieurs choses en mme temps. C'est ce que
   l'on appelle le _temps partag_.

   Une des tches du noyau est de grer le temps partag. C'est une
   partie ddie  l'_ordonnanceur_ qui conserve chez lui toutes les
   informations sur les autres processus (non noyau) de votre
   environnement. Chaque 1/60 me de seconde, une horloge avertit le
   noyau, gnrant une interruption horloge. L'ordonnanceur arrte le
   processus qui s'excute, le suspend dans l'tat, et donne le contrle
    un autre processus.

   1/60 me de seconde peut paratre peu de temps. Mais sur les
   microprocesseurs actuels c'est assez pour excuter des dizaines de
   milliers d'instructions machine, ce qui permet d'effectuer beaucoup de
   choses. Mme si vous avez plusieurs processus, chacun peut accomplir
   un petit peu sa tche pendant ses tranches de temps.

   En pratique, un programme ne dispose pas de sa tranche de temps
   entire. Si une interruption arrive d'un priphrique d'E/S, le noyau
   arrtera en ralit la tche courante, excutera le handler
   d'interruption et retournera  la tche courante. Une tempte
   d'interruption de haute priorit peut interdire tout traitement
   normal ; ce mauvais comportement est appel _dfaite (thrashing)_ et
   est difficile  provoquer sur les Unix modernes.

   En fait, la vitesse des programmes est trs rarement limite par le
   temps machine qu'ils peuvent obtenir (il y a quelques exceptions 
   cette rgle, comme la gnration de son ou de graphiques en 3-D. Le
   plus souvent, les dlais sont dus  l'attente, par le programme, des
   donnes d'un disque ou d'une connexion rseau.

   Un systme d'exploitation qui peut supporter de manire routinire
   plusieurs processus est appel "multitche". Les systmes
   d'exploitation de la famille Unix ont t conus ds le dbut pour le
   multitche et sont vraiment bons pour a -- beaucoup plus efficaces
   que celui de Windows et MAC OS, pour lesquels le multitche a t
   introduit a posteriori et qui le traitent plutt pauvrement. Efficace,
   multitche, fiable sont quelques-unes des raisons qui rendent Linux
   suprieur pour le rseau, les communications et les services WEB.

7. Comment mon ordinateur vite aux processus d'empiter les uns sur les autres
?

   L'ordonnanceur du noyau fait attention  sparer les processus dans le
   temps. Votre systme d'exploitation les divise aussi dans l'espace, de
   telle manire que ces processus n'empitent pas sur la mmoire de
   travail des autres. Ces choses que votre systme d'exploitation
   ralise sont appeles _gestion de la mmoire_.

   Chaque processus de votre 'troupeau' a besoin de son propre espace
   mmoire afin de mettre son code et de garder des variables et leur
   rsultat. Vous pouvez imaginer cet ensemble constitu d'un _segment de
   code_ accessible en lecture uniquement (contenant les instrucions du
   processus) et un _segment de donnes_ accessible en criture
   (contenant toutes les variables du processus). Le segment de donnes
   est vritablement propre  chaque processus, mais si deux processus
   excutent le mme code, Unix s'arrange automatiquement pour qu'ils
   partagent le mme segment de code dans un soucis d'efficacit.

   L'efficacit est importante car la mmoire est chre. Quelquefois,
   vous ne disposez pas de suffisamment de mmoire pour faire tenir tous
   les programmes, spcialement si vous utilisez un gros programme comme
   un serveur X-WINDOW. Pour contourner cela, Unix utilise une stratgie
   appele _mmoire virtuelle_. Cela n'essaie pas de faire tenir tout le
   code et les donnes d'un processus en mmoire. Cependant, il garde
   seulement un espace de travail ; le reste de l'tat du processus est
   laiss dans un endroit spcial sur votre disque : _l'espace d'change
   (swap space)_.

   Lorsque le processus s'excute, Unix essaie d'anticiper comment l'
   espace de travail changera, et ne chargera en mmoire que les morceaux
   dont il a besoin. Faire cela efficacement est compliqu et dlicat, je
   n'essaierai pas de le dcrire ici -- mais cela dpend du fait que le
   code et les rfrences aux donnes peuvent arriver en blocs, avec
   chaque nouveau rfrenant vraisemblablement un proche ou un ancien.
   Ainsi, si Unix garde le code ou les donnes frquemment (ou rcemment)
   utiliss, vous gagnerez du temps.

   Notez que dans le pass, le "quelquefois" que nous employons deux
   paragraphes plus haut tait "souvent" voire "toujours", -- la taille
   de la mmoire tait habituellement petite par rapport  la taille des
   programmes en cours d'excution, de telle manire que les changes
   entre le disque et la mmoire ("swapping") taient frquents. La
   mmoire est beaucoup moins chre de nos jours et mme les machines bas
   de gamme en sont bien dotes. Sur les machines mono-utilisateur avec
   64Mo de mmoire, il est possible de faire tourner X-WINDOW et un
   mlange de programmes sans jamais swapper.

   Mme dans cette situation joyeuse, la part du systme d'exploitation
   appele le _gestionnaire de mmoire_ a un important travail  faire.
   Il doit tre sr que les programmes ne peuvent modifier que leurs
   segments de mmoire -- ce qui empche un code erron ou malicieux dans
   un programme de ramasser les donnes dans un autre. Pour faire cela,
   il conserve une table des segments de donnes et de code. La table est
   mise  jour chaque fois qu'un processus demande de la mmoire ou en
   libre (habituellement plus tard lorsqu'il se termine).

   Cette table est utilise pour passer des commandes  une partie
   spcialise du matriel sous-jacent appele un _UGM (MMU)_ ou _unit
   de gestion mmoire (memory management unit)_. Les processeurs modernes
   disposent de MMUs intgrs. Le MMU a la facult de mettre des
   barrires autour de zones mmoire, ainsi une rfrence en "dehors des
   clous" sera refuse et gnrera une interruption spciale pour tre
   traite.

   Si vous avez dj vu le message Unix qui dit "Segmentation fault",
   "core dumped" ou quelque chose de similaire, c'est exactement ce qu'il
   se passe ; un programme en cours d'excution a tent d'accder  de la
   mmoire en dehors de son segment et a provoqu une interruption
   fatale. Cela indique un bug dans le code du programme ; le _core dump_
   laisse une information en vue d'un diagnostic  l'attention du
   programmeur afin qu'il puisse trouver la trace de son erreur.

8. Comment mon ordinateur stocke des choses sur le disque ?

   Sur votre disque dur sous Unix, vous voyez un arbre de rpertoires
   nomms et des fichiers. Normalement vous ne devriez pas  chercher 
   en savoir plus, mais cela peut s'avrer utile de savoir ce qu'il y a
   dessous si vous avez un crash disque et besoin d'essayer de nettoyer
   des fichiers. Malheureusement il n'y a pas de bon moyen de dcrire
   l'organisation du disque en partant du niveau fichier et en
   descendant, c'est pour cela que je le dcrirai en remontant  partir
   du niveau matriel.

8.1 Bas niveau du disque et structure du systme de fichiers

   La surface de votre disque , sur laquelle il stocke les donnes est
   divise comme une cible de jeu de flchettes -- en pistes circulaires
   qui sont partages en secteurs. Parce que les pistes de l'extrieur
   contiennent plus de surface que celles prs de l'axe de rotation, au
   centre du disque, les pistes externes ont plus de secteurs que celles
   de l'intrieur. Chaque secteur (ou _bloc disque_) a la mme taille,
   qui est gnralement de 1Ko (1024 mots de 8 bits). Chaque bloc disque
   a une adresse unique ou un _numro de bloc disque_.

   Unix divise le disque en _partitions disque_. Chaque partition est une
   succession de blocs qui est utilise indpendamment des autres
   partitions, comme un systme de fichiers ou un espace d'change (swap
   space). La partition ayant le plus petit numro est souvent traite
   spcialement, telle la _partition de boot_ dans laquelle vous pouvez
   mettre un noyau pour booter.

   Chaque partition est soit un _espace de swap_ (utilis pour
   implmenter la mmoire virtuelle) soit un _systme de fichiers_ pour
   stocker des fichiers. Les partitions de swap sont traites comme une
   squence linaire de blocs. Les systmes de fichiers d'un autre cot,
   ont besoin de relier les noms de fichiers  des squences de blocs
   disque. Parce que les fichiers grossissent, diminuent, et changent
   tout le temps, les blocs de donnes d'un fichier ne seront pas une
   squence linaire mais pourront tre disperss sur toute la partition
   (tant que le systme d'exploitation pourra trouver un bloc libre).

8.2 Noms de fichiers et rpertoires

   Dans chaque systme de fichiers, la liaison entre les noms et les
   blocs est ralise grce  une structure appele _i-node (noeud
   d'index)_. Il y en a tout un tas proche de la "base" (numro de bloc
   les plus faibles) du systme de fichiers (les tout premiers sont
   utiliss pour des besoins d'intgrit et de label que nous ne
   dcrirons pas ici). Chaque i-node dcrit un fichier. Les blocs de
   donnes des fichiers sont au dessus des i-nodes (conceptuellement).

   Chaque i-node contient la liste des numros des blocs du fichier
   (rellement c'est une demi-vrit, c'est seulement valable pour les
   petits fichiers, mais le reste de ces dtails ne sont pas importants
   ici). Notez que l'i-node _ne contient pas_ le nom du fichier.

   Les noms des fichiers rsident dans les _structures de rpertoires_.
   Une structure de rpertoire contient juste une table des noms et des
   numros d'i-node associs. C'est la raison pour laquelle, sous Unix,
   un fichier peut avoir plusieurs noms rels (ou _liens forts (hard
   links)_) ; Il y a juste plusieurs entres dans un rpertoire qui
   pointent vers le mme i-node.

8.3 Points de montage

   Dans le cas le plus simple, votre systme de fichiers Unix tient sur
   une seule partition disque. Cependant vous verrez que cette
   disposition sur des petits systmes Unix n'est pas pratique.
   Typiquement il est rparti sur plusieurs partitions disque voire sur
   plusieurs disques physiques. Ainsi par exemple, votre systme peut
   avoir une petite partition o le noyau rside, une un peu plus grande
   pour les utilitaires du systme et une beaucoup plus grosse pour les
   rpertoires des utilisateurs.

   La seule partition  laquelle vous aurez accs immdiatement aprs le
   boot est votre _partition racine (root partition)_, qui est (presque
   toujours) celle  partir de laquelle vous avez boot. Elle contient le
   rpertoire racine du systme de fichiers, le noeud le plus haut 
   partir duquel tout est raccroch.

   Les autres partitions du systme doivent tre attaches  cette racine
   afin que votre systme de fichiers unique ou multi-partition soit
   accessible. Au milieu du processus de boot, votre Unix rendra ces
   partitions 'non root' accessibles. Il devra _monter_ chacune d'elles
   sur un rpertoire de la partition racine.

   Par exemple, si votre Unix a un rpertoire appel '/usr', c'est
   probablement un point de montage d'une partition qui contient un tas
   de programmes installs avec votre Unix mais qui ne sont pas
   ncessaires durant la phase initiale de boot.

8.4 Comment un fichier est retrouv ?

   Maintenant nous pouvons considrer le systme de fichiers dans une
   dmarche descendante. Lorsque vous ouvrez un fichier (tel que
   /home/esr/WWW/ldp/fundamentals.sgml) voici ce qu'il arrive :

   Votre noyau dmarre de la racine de votre systme de fichiers Unix
   (dans la partition root). Il cherche un rpertoire appel `home'.
   Habituellement `home' est un point de montage d'une grande partition
   pour les utilisateurs, il descend  l'intrieur. Au sommet de la
   structure du rpertoire de cette partition utilisateur, il va chercher
   une entre nomme `esr' et en extraire le numro d'i-node. Il ira 
   cette i-node, notez que c'est une structure de rpertoire, et
   retrouvera `WWW'. En exploitant _cet_ i-node, il ira au sous
   rpertoire correspondant et retrouvera `ldp'. Ce qui lui donnera
   encore un autre i-node rpertoire. En ouvrant ce dernier, il trouvera
   un numro d'i-node pour `fundamentals.sgml'. Cet i-node n'est pas un
   rpertoire mais fournit la liste des blocs associs au fichier.

8.5 Comment les choses peuvent dgnrer ?

   Plus haut, nous avons laiss entendre que les systmes de fichiers
   taient fragiles. Maintenant nous savons que pour accder  un fichier
   vous devez parcourir une longue chane arbitraire de rfrences  des
   rpertoires et  des inodes. A prsent, supposons que votre disque dur
   possde une zone dfectueuse.

   Si vous tes chanceux, il dtruira quelques donnes d'un fichier. Si
   vous tes malchanceux, il va corrompre une structure de rpertoire ou
   un numro d'inode et laissera un sous arbre entier de votre systme
   dans l'oubli -- ou, pire, cela a donn une structure corrompue qui
   pointe par plusieurs chemins au mme bloc disque ou inode. Une telle
   corruption peut s'tendre par des oprations courantes sur les
   fichiers qui ne se trouvent pas au point d'origine.

   Heureusement, ce genre de d'imprvu devient de plus en plus rare car
   les disques sont de plus en plus fiables. Malgr tout, cela veut dire
   que votre Unix voudra vrifier priodiquement l'intgrit du systme
   de fichiers afin de s'assurer que rien ne cloche. Les Unix modernes
   font une vrification rapide sur chaque partition au moment du boot,
   juste avant de les monter. Au bout d'un certain nombre de redmarrages
   (reboot), la vrification sera plus approfondie et durera quelques
   minutes.

   Si tout cela vous parait, comme Unix, terriblement complexe et
   prdispos aux dfaillances, au contraire, c'est rassurant de savoir
   que ces vrifications faites au dmarrage de la machine, dtectent et
   corrigent les problmes courants _avant_ qu'ils ne deviennent
   rellement dsastreux. D'autres systmes d'exploitation ne disposent
   pas de ces fonctionnalits, qui acclrent un petit peu le dmarrage,
   mais peuvent vous laisser tout 'bousiller' en essayant de rcuprer 
   la main (et en supposant que vous ayez une copie des Utilitaires
   Norton ou autre  porte de main...).

9. Comment fonctionnent les langages d'ordinateur ?

   Nous avons dj voqu comment les programmes sont excuts. Chaque
   programme en fin de compte doit excuter une succession d'octets qui
   sont les instructions dans le _langage machine_ de votre ordinateur.
   Les humains ne pratiquent pas trs bien le langage machine ; cela est
   devenu rare, art obscur mme parmi les hackers.

   La plupart du code du noyau d'Unix except une petite partie de
   l'interface avec le matriel est de nos jours crite dans un _langage
   de haut niveau_. (Le terme 'haut niveau' est un hritage du pass afin
   de le distinguer du 'bas-niveau' des _langages assembleur_, qui sont
   de maigres "couches" autour du code machine.

   Il y plusieurs types diffrents de langages de haut niveau. Afin de
   parler d'eux, vous trouverez utile que j'attire votre attention sur le
   fait que le _code source_ d'un programme (la cration humaine, la
   version ditable) est pass  travers plusieurs types de traductions
   pour arriver en code machine, que la machine peut effectivement
   excuter.

9.1 Langages compils

   Le type le plus classique de langage est un _langage compil_. Les
   langages compils sont traduits en fichiers excutables de code
   machine binaire par un programme spcial appel (assez logiquement) un
   _compilateur_. Lorsque le binaire est gnr, vous pouvez l'excuter
   directement sans regarder  nouveau dans le code source. (La plupart
   des logiciels dlivrs sous forme de binaires compils sont faits 
   partir d'un source auquel vous n'avez pas accs.)

   Les langages compils tendent  fournir une excellente performance et
   ont un accs le plus complet au systme d'exploitation, mais il
   difficile de programmer avec.

   Le langage C, langage dans lequel chaque Unix est lui-mme crit, est
   de tous le plus important (avec sa variante C++). FORTRAN est un autre
   langage compil qui reste utilis par de nombreux ingnieurs et
   scientifiques mais plus vieux et plus primitif. Dans le monde Unix
   aucun autre langage compil n'est autant utilis. En dehors de lui,
   COBOL est trs largement utilis pour les logiciels de finance et
   comptabilit.

   Il y a bien d'autres compilateurs de langages, mais la plupart sont en
   voie d'extinction ou sont strictement des outils de recherche. Si vous
   tes un nouveau dveloppeur Unix qui utilise un langage compil, il
   est incontournable que ce soit C ou C++.

9.2 Langages interprts

   Un _langage interprt_ dpend d'un programme interprteur qui lit le
   code source et traduit  la vole en calculs et appels systme. Le
   source doit tre r-interprt (et l'interprteur prsent)  chaque
   fois que le programme est excut.

   Les langages interprts tendent  tre plus lents que les langages
   compils, et limitent souvent les accs au systme d'exploitation ou
   au matriel sous-jacent. D'un autre ct, il est plus facile de
   programmer et ils tolrent plus d'erreurs de codage que les langages
   compils.

   Quelques utilitaires Unix, incluant le shell et bc(1) et sed(1) et
   awk(1), sont effectivement des petits langages interprts. Les BASICs
   sont gnralement interprts. Ainsi est Tcl. Historiquement, le
   langage le plus interprt tait LISP (une amlioration norme sur la
   plupart de ses successeurs). Aujourd'hui, Perl est trs largement
   utilis et devient rsolument plus populaire.

9.3 Langages P-code

   Depuis 1990 un type de langage hybride qui utilise la compilation et
   l'interprtation est devenu incroyablement important. Les langages
   P-code sont comme des langages compils dans le sens o le code est
   traduit dans une forme binaire compacte qui est celle que vous
   excutez, mais cette forme n'est pas du code machine. Au lieu de cela,
   c'est du _pseudo-code_ (ou _p-code_), qui est gnralement un peu plus
   simple mais plus puissant qu'un langage machine rel. Lorsque vous
   excutez le programme, vous interprtez du p-code.

   Le p-code peut s'excuter pratiquement aussi rapidement que du binaire
   compil (les interprteurs de p-code peuvent tre relativement
   simples, petits et rapides). Mais les langages p-code peuvent garder
   la flexibilit et la puissance d'un bon interprteur.

   D'importants langages p-code sont Python et Java.

10. Comment Internet fonctionne ?

   Afin de vous aider  comprendre comment Internet fonctionne, nous
   verrons ce qui se passe lorsque vous effectuez une opration classique
   -- pointer dans un navigateur ce document  partir du site Web de
   rfrence du Projet de Documentation de Linux (Linux Documentation
   Project). Ce document est :

http://sunsite.unc.edu/LDP/HOWTO/Fundamentals.html

   ce qui veut dire qu'il rside dans le fichier
   LDP/HOWTO/Fundamentals.html, sous le rpertoire export World Wide Web
   de la machine sunsite.unc.edu.

10.1 Noms et localisations

   La premire chose que votre navigateur doit faire est d'tablir une
   connexion rseau avec la machine sur laquelle se trouve le document.
   Pour faire cela, il doit tout d'abord trouver la localisation rseau
   de _l'hte_ sunsite.unc.edu (hte est un raccourci pour `machine hte'
   ou `hte rseau' ; sunsite.unc.edu est un _nom d'hte (hostname)_
   typique). La localisation correspondante est en fait un nombre appel
   _adresse IP_ (nous expliquerons la partie `IP' de ce terme plus tard).

   Pour faire cela, votre navigateur sollicite un programme nomm
   _serveur de noms_. Le serveur de noms peut rsider sur votre machine,
   mais il est plus probable qu'il soit sur une machine de service avec
   laquelle vous pouvez dialoguer. Lorsque vous abonnez chez un
   Fournisseur d'Accs  Internet (FAI), une partie de la procdure
   d'installation dcrit certainement la manire d'indiquer  votre
   logiciel Internet l'adresse IP du serveur de noms du rseau du FAI.

   Les serveurs de noms sur diffrentes machines communiquent avec les
   autres en changeant et en gardant  jour toutes les informations
   ncessaires  la rsolution de noms d'hte (en les associant  des
   adresses IP). Votre serveur de noms doit demander  trois ou quatre
   sites  travers le rseau afin de rsoudre sunsite.unc.edu, mais cela
   se droule vraiment rapidement (en moins d'une seconde).

   Le serveur de noms dira  votre navigateur que l'adresse IP de Sunsite
   est 152.2.22.81 ; sachant cela, votre machine sera capable d'changer
   des bits avec Sunsite directement.

10.2 Paquets et routeurs

   Ce que le navigateur veut faire est d'envoyer une commande au serveur
   Web sur Sunsite qui a la forme suivante :

GET /LDP/HOWTO/Fundamentals.html HTTP/1.0

   Que se passe-t-il alors ? La commande est faite de _paquets_ ; un bloc
   de bits comme un tlgramme est dcoup en trois choses importantes :
   _l'adresse source_ (l'IP de votre machine), _l'adresse destination_
   (152.2.22.81), et le _numro de service_ ou _numro de port_ (80, dans
   ce cas) qui indique que c'est une requte World Wide Web.

   Alors votre machine envoie le paquet par le fil (de la connexion modem
   avec votre FAI, ou le rseau local) jusqu' ce qu'il rencontre une
   machine spcialise appele _routeur_. Le routeur possde une carte de
   l'Internet dans sa mmoire -- pas une complte mais une qui dcrit
   votre voisinage rseau et sait comment aller aux routeurs pour les
   autres voisinages sur l'Internet.

   Votre paquet peut passer  travers plusieurs routeurs sur le chemin de
   sa destination. Les routeurs sont adroits. Ils regardent combien de
   temps prend un accus rception pour recevoir un paquet. Ils utilisent
   cette information pour aiguiller le trafic sur les liens rapides. Ils
   l'utilisent pour s'apercevoir que d'autres routeurs (ou un cble) sont
   dconnects du rseau et modifier le chemin si possible en trouvant
   une autre route.

   Il existe une lgende urbaine qui dit qu'Internet a t conu pour
   survivre a une guerre nuclaire. Ce n'est pas vrai, mais la conception
   d'Internet est extrmement bonne en ayant une performance fiable bas
   sur des couches matrielles d'un monde incertain... C'est directement
   du au fait que son intelligence est distribue  travers des milliers
   de routeurs plutt qu' quelques auto-commutateurs massifs (comme le
   rseau tlphonique). Cela veut dire que les dfaillances tendent 
   tre bien localises et le rseau peut les contourner.

   Une fois que le paquet est arriv  destination, la machine utilise le
   numro de service pour le fournir au serveur Web. Le serveur Web peut
   savoir  qui rpondre en regardant l'adresse source du paquet. Quand
   le serveur Web renvoie ce document, il sera coup en plusieurs
   paquets. La taille des paquets varie en fonction du mdia de
   transmission du rseau et du type de service.

10.3 TCP et IP

   Pour comprendre comment des transmissions de multiples paquets sont
   ralises, vous devez savoir que l'Internet utilise actuellement deux
   protocoles empils l'un sur l'autre.

   Le plus bas niveau, _IP_ (Internet Protocol), sait comment recevoir
   des paquets individuels d'une adresse source vers une adresse
   destination (c'est pourquoi elles sont appeles adresses IP).
   Cependant, IP n'est pas fiable ; si un paquet est perdu ou jet, les
   machines source et destination ne le sauront jamais. Dans le jargon
   rseau, IP est un protocole _sans connexion (ou mode non connect)_ ;
   l'expditeur envoie juste un paquet au destinataire et n'attend jamais
   un accus de rception.

   Cependant, IP est rapide et peu coteux. Quelquefois, rapide, peu
   coteux et non fiable c'est OK. Lorsque vous jouez en rseau  Doom ou
   Quake, chaque balle est reprsente par un paquet IP. Si quelques-unes
   sont perdues, c'est OK.

   Le niveau suprieur, _TCP_ (Transmission Control Protocol), fournit la
   fiabilit. Quand deux machine ngocient une connexion TCP (ce qu'elles
   font en utilisant IP), le destinataire doit envoyer des accuss de
   rception des paquets qu'il reoit  l'expditeur. Si l'expditeur ne
   reoit pas un accus de rception pour un paquet aprs un certain
   temps, il renvoie ce paquet. De plus, l'expditeur donne  chaque
   paquet TCP un numro de squence, que le destinataire peut utiliser
   pour r-assembler les paquets dans le cas o il sont arrivs dans le
   dsordre. (Cela peut arriver si les liens rseau se rtablissent ou
   cassent pendant une connexion.)

   Les paquets TCP/IP contiennent galement un checksum pour permettre la
   dtection de donnes altres par de mauvais liens. Ainsi, du point de
   vue de quelqu'un utilisant TCP/IP et des serveurs de noms, il
   ressemble  une voie fiable pour faire passer des flux d'octets entre
   des paires hte/numro de services. Les gens qui crivent des
   protocoles rseau ne doivent pas se soucier la plupart du temps de la
   taille des paquets, du r-assemblage des paquets, de la vrification
   d'erreurs, le calcul du checksum et la retransmission qui sont au
   niveau infrieurs.

10.4 HTTP, un protocole d'application

   Maintenant revenons  notre exemple. Les navigateurs et les serveurs
   Web parlent un _protocole d'application_ qui est au dessus de TCP/IP,
   en l'utilisant simplement comme une manire de passer des chanes
   d'octets dans les deux sens. Ce protocole est appel _HTTP_
   (Hyper-Text Transfer Protocol) et nous en avons dj vu une commande
   -- la commande GET utilise ci-dessus.

   Lorsque la commande GET arrive au serveur Web de sunsite.unc.edu avec
   comme numro de service 80, elle sera expdie  un _dmon serveur_
   qui coute le port 80. La plupart des services Internet sont
   implments par des dmons serveurs qui ne font rien d'autre
   qu'attendre sur des numros de port, rcolter et excuter les
   commandes entrantes.

   Cette conception de l'Internet a une rgle qui prime sur les autres,
   c'est que toutes les parties sont le plus simple possible et
   humainement accessible. HTTP, et ses compres (comme le Simple Mail
   Transfer Protocol, _SMTP_, qui est utilis pour transporter du
   courrier lectronique entre des machines) utilisent de simples
   commandes de texte qui se terminent par un retour chariot.

   C'est rarement inefficace ; dans certaines circonstances vous pouvez
   obtenir plus de rapidit en employant un protocole binaire fortement
   cod. Mais l'exprience a montr que le bnfice d'avoir des commandes
   qui sont faciles  dcrire et  comprendre l'emportent sur le gain
   marginal de l'efficacit que l'on peut esprer au prix de choses
   compliques et compactes.

   Par consquent, ce que le dmon serveur vous renvoie via TCP/IP est
   aussi du texte. Le dbut de la rponse ressemblera  quelque chose
   comme (quelques en-ttes ont t supprims) :

HTTP/1.1 200 OK
Date: Sat, 10 Oct 1998 18:43:35 GMT
Server: Apache/1.2.6 Red Hat
Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT
Content-Length: 2982
Content-Type: text/html

   Ces en-ttes seront suivis d'une ligne vide et du texte de la page Web
   (aprs que la connexion sera rompue). Votre navigateur affichera
   simplement cette page. Les en-ttes indiquent -- en particulier,
   l'en-tte Type de Contenu (Content-Type) -- comment les donnes reues
   sont vraiment du HTML).
