/usr/share/doc/HOWTO/fr-html/Diskless-root-NFS-HOWTO.html is in doc-linux-fr-html 2013.01-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta name="generator" content=
"HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
<meta name="GENERATOR" content="LinuxDoc-Tools 0.9.71">
<title>NFS-Root client et serveur HowTo</title>
</head>
<body>
<h1>NFS-Root client et serveur HowTo</h1>
<h2>Hans de Goede <hans@highrise.nl></h2>
v1.0 30 Mars 1999
<hr>
<em>Ce document décrit l'installation et la configuration
d'un serveur pour que ses clients puissent démarrer et
fonctionner sans disque (par montage NFS de root).</em>
<hr>
<h2><a name="s1">1. Introduction</a></h2>
<p>Ce Howto est également disponible à l'adresse -
<a href="http://x.mame.net/hans">http://x.mame.net/hans</a>. Il
décrit un exemple de configuration où root est
monté en NFS, mais il diffère des autres NFS-root
HowTo sur deux points :</p>
<ol>
<li>Il propose à la fois l'aspect serveur et l'aspect
client, offrant une solution complète ; il ne décrit
pas les principes de base du montage de root via NFS mais
plutôt un exemple de configuration qui fonctionne.</li>
<li>La configuration décrite est particulière dans la
mesure où c'est l'arborescence root du serveur qui est
partagée avec les stations (workstations, ws), tandis
qu'habituellement, on a plutôt un mini-root par station. Ceci
a quelques avantages :
<ul>
<li>occupe un faible espace disque</li>
<li>tous les changements sur le serveur sont automatiquement
disponibles côté client (la configuration n'est faite
qu'une fois)</li>
<li>facilite l'ajout de nouveaux clients</li>
<li>un seul système à maintenir.</li>
</ul>
</li>
</ol>
<p>Ce document est basé sur un système RedHat 5.2. On
suppose que le lecteur de ce HowTo a suffisamment
d'expérience en administration système linux ;
l'adaptation de cette solution à une autre distribution ne
devrait donc pas poser de problème.</p>
<h2><a name="ss1.1">1.1 Copyright</a></h2>
<p>Ce HOWTO est © Hans de Goede, 1999.</p>
<p>Sauf indication contraire, les droits d'auteur des HOWTO Linux
sont détenus par leurs auteurs respectifs. Les HOWTO Linux
peuvent être reproduits et distribués, en
totalité ou en partie, sur tout média physique ou
électronique dans la mesure où ce copyright est
préservé dans chaque copie. La distribution
commerciale en est autorisée et encouragée. L'auteur
apprécierait toutefois qu'on lui notifie individuellement ce
genre de distribution.</p>
<p>Le présent copyright doit couvrir toute traduction,
compilation et autre travail dérivé des HOWTO Linux.
C'est-à-dire qu'il est interdit d'imposer des restrictions
de diffusion allant au delà du présent copyright
à des ouvrages inspirés, ou incorporant des passages,
de HOWTO Linux. Sous certaines conditions, des exceptions à
ces règles seront tolérées : contactez le
coordinateur des HOWTO à l'adresse donnée
ci-dessous.</p>
<p>Pour résumer, nous souhaitons une diffusion aussi large
que possible de ces informations. Néanmoins, nous entendons
garder la propriété intellectuelle (copyright) des
HOWTO, et apprécierions d'être informés de leur
redistribution.</p>
<p>Pour toute question plus générale, merci de
contacter le coordinateur des HOWTO, Tim Bynum, à l'adresse
électronique <code><a href=
"mailto:tjbynum@wallybox.cei.net">tjbynum@wallybox.cei.net</a></code>.</p>
<h2><a name="ss1.2">1.2 Historique</a></h2>
<ul>
<li>v0.1, 20 Janvier 1999 : premier jet au HHS, là où
la configuration a été développée.</li>
<li>v1.0, 30 Mars 1999 : première version diffusée,
écrite partiellement durant ma période de stage chez
ISM.</li>
</ul>
<h2><a name="s2">2. Principes de base</a></h2>
<p>Dans cette configuration les clients utilisent le système
de fichiers racine du serveur. Ils y accèdent bien sûr
en lecture seule.</p>
<h2><a name="ss2.1">2.1 Les choses ne peuvent pas être aussi
simples...</a></h2>
<p>Quelques problèmes apparaissent rapidement.</p>
<h3>Chaque station a besoin de sa propre copie d'un certain nombre
de répertoires</h3>
<p>Une configuration linux doit avoir les accès en
écriture sur les répertoires suivants :</p>
<ol>
<li>/dev</li>
<li>/var</li>
<li>/tmp</li>
</ol>
<p>Il y a trois solutions, l'une d'elles ne fonctionnant que pour
/dev :</p>
<ol>
<li>utiliser (monter) un ramdisk et remplir celui-ci par extraction
d'une archive ou copie depuis un répertoire modèle.
<ul>
<li>avantages :
<ol>
<li>nettoyé à chaque reboot (suppression des fichiers
tmp et log). Pas de maintenance.</li>
<li>ne prend pas de place sur le serveur et ne génère
pas de trafic réseau. Il est donc plus rapide et utilise
moins de ressources côté serveur.</li>
</ol>
</li>
<li>inconvénients :
<ol>
<li>occupe de la mémoire</li>
<li>les fichiers de log ne sont pas conservés. Il faut
configurer syslog pour rediriger les logs sur le serveur si on
tient vraiment à récupérer les messages des
clients.</li>
</ol>
</li>
</ul>
</li>
<li>créer un répertoire pour chaque station sur le
serveur et le monter par NFS en lecture-écriture.
<ul>
<li>avantages & inconvénients :
<ol>
<li>les arguments ci-dessus sont à prendre à l'envers
dans le cas des répertoires situés sur le
serveur.</li>
</ol>
</li>
</ul>
</li>
<li>à partir du noyau 2.2, on peut utiliser le type devfs
pour /dev (un système de fichiers virtuel à la
manière de /proc).
<ul>
<li>avantages:
<ol>
<li>devfs prend très peu de mémoire comparé
à un ramdisk, et pas du tout d'espace disque sur le serveur.
En plus il est très rapide. Un /dev normal occupe au moins
1,5 Mo dans la mesure où un fichier (un <em>device</em>)
fait au minimum 1 ko, et il y a environ 1200 fichiers. On peut bien
entendu utiliser un modèle de /dev avec simplement les
entrées nécessaires pour économiser un peu de
place : 1,5 Mo, ça fait beaucoup pour un ramdisk et
ça ne fait pas très propre sur un serveur.</li>
<li>devfs crée automatiquement des entrées pour les
devices détectés et ajoutés, donc pas besoin
de maintenance.</li>
</ol>
</li>
<li>inconvénients :
<ol>
<li>tout changement sur /dev tel que création d'un lien pour
la souris ou le lecteur de cdrom est perdu. Devfs fournit cependant
un script nommé rc.devfs pour sauvegarder ces changements.
Le script présent dans ce HowTo va alors automatiquement
restaurer les liens symboliques nouvellement positionnés en
appelant rc.devfs. Si on fait des changements sur /dev, il faut
donc appeler rc.devfs soi-même de cette façon :</li>
</ol>
<blockquote>/etc/rc.d/rc.devfs save /etc/sysconfig</blockquote>
</li>
</ul>
</li>
</ol>
<p>Comme on peut le voir, il y a plusieurs moyens de
résoudre ce problème d'accès en
lecture-écriture. Voici les options choisies pour le reste
de ce Howto :</p>
<ul>
<li>pour /dev nous utiliserons devfs</li>
<li>pour /var et /tmp, nous utiliserons un ramdisk de 1 Mo.
Celui-ci sera partagé pour utiliser la mémoire de
manière efficace. Pour réaliser ce partage, /tmp sera
en fait un lien symbolique sur /var/tmp.</li>
<li>pour remplir ce ramdisk, une archive conviendra tout aussi bien
qu'un répertoire modèle. Mais comme les modifications
sont plus aisées avec le répertoire modèle,
c'est cette dernière solution qui sera retenue.</li>
</ul>
<h3>Un accès en écriture sur /home semble
nécessaire...</h3>
<p>Mais ce n'est pas vraiment un problème puisque dans toute
configuration unix de type client/serveur, /home est monté
en lecture-écriture depuis le serveur, donc ça nous
conviendra ;)</p>
<h3>Comment une station récupère son adresse IP de
manière à pouvoir communiquer avec le serveur ?</h3>
<p>Heureusement pour nous ce probleme a déjà
été résolu et le noyau a deux
possibilités pour la configuration automatique de l'adresse
IP :</p>
<ol>
<li>RARP</li>
<li>Bootp</li>
</ol>
<p>RARP est le plus facile à configurer, bootp est le plus
flexible. Mais la plupart des bootroms supportent uniquement bootp,
donc nous utiliserons bootp.</p>
<h3>Et la configuration spécifique à chaque station
?</h3>
<p>Sur RedHat, la plupart des fichiers de configuration
système sont déjà situés sous
/etc/sysconfig. Nous déplacerons donc simplement ceux qui ne
le sont pas encore et ajouterons des liens symboliques. Ensuite
nous monterons un répertoire /etc/sysconfig par station.
C'est la seule partie qui est propre à la distribution
utilisée ici. Avec une autre distribution, il suffira de
créer un répertoire sysconfig, déplacer tous
les fichiers de configuration qui ne peuvent être
partagés, et ajouter les liens nécessaires. De
même, /etc/rc.d/rc3.d (ou l'équivalent dans les autres
distribs) peut présenter des différences entre le
serveur et les stations. Si on considère que toutes les
stations lancent les mêmes services, on créera
simplement un rc3.d pour les stations et un pour le serveur :</p>
<ol>
<li>créer un /etc/rc.d/rc3.ws et un
/etc/rc.d/rc3.server</li>
<li>faire un lien de /etc/rc.d/rc3.d vers /etc/sysconfig/rc3.d</li>
<li>faire un lien de /etc/sysconfig/rc3.d vers
/etc/rc.d/rc3.xxx</li>
<li>remplacer S99local dans rc3.ws par un lien vers
/etc/sysconfig/rc.local pour que chaque station ait son propre
rc.local</li>
</ol>
<h3>Divers problèmes</h3>
<ol>
<li>/etc/rc.d/rc.sysinit a besoin de /var, donc /var doit
être monté ou créé avant que rc.sysinit
ne soit exécuté. Il serait également
intéressant que /etc/sysconfig (propre à chaque
station) soit monté avant le lancement des scripts
d'initialisation.
<ul>
<li>pour cela nous appellerons un script dès le début
de /etc/rc.d/rc.sysinit, aussi bien sur le serveur que sur les
stations ; ce script devra donc détecter sur quelle machine
il tourne pour ne rien faire dans le cas du serveur.</li>
</ul>
</li>
<li>/etc/mtab doit être accessible en écriture :
<ul>
<li>il suffit de créer un lien vers /proc/mounts et un
fichier vide mounts dans /proc pour que fsck et mount ne se
plaignent pas pendant l'initialisation (alors que /proc n'est pas
encore monté). Il est à noter que smb(u)mount ne
respecte pas le lien mtab et va l'écraser. Donc si on
utilise smb(u)mount, il faut écrire un wrapper qui va
restorer le lien.</li>
</ul>
</li>
</ol>
<h2><a name="s3">3. Préparation du serveur</a></h2>
<h2><a name="ss3.1">3.1 Compiler un noyau</a></h2>
<p>Il faut prévoir le nécessaire pour supporter root
sur nfs. Voici les étapes :</p>
<ol>
<li>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.</li>
<li>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.</li>
<li>En plus des options habituelles, le noyau devrait supporter :
<ul>
<li>ext2 compilé dans le noyau (pour le serveur, ou bien
pour les deux)</li>
<li>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.</li>
<li>networkcard compilé (pour le client ou les deux)</li>
<li>devfs compilé (requis pour le client, également
intéressant pour le serveur)</li>
<li>tout ce que vous utilisez normalement, les modules pour tous
les périphériques présents sur le serveur et
les stations.</li>
</ul>
</li>
<li>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.
<ul>
<li>En 2.0, c'est une ligne de DEFINE dans "include/linux/nfs_fs.h"
appelée "NFS_ROOT"</li>
<li>En 2.2, c'est un DEFINE dans "fs/nfs/nfsroot.c"</li>
</ul>
</li>
<li>Il reste à compiler le noyau comme d'habitude (cf
Kernel-HowTo).</li>
<li>Si vous n'avez pas encore de noeud /dev/nfsroot,
créez-le :
<blockquote>mknod /dev/nfsroot b 0 255</blockquote>
</li>
<li>Après avoir compilé le noyau, changez la racine
en tapant :
<blockquote>rdev <path-to-zImage>/zImage
/dev/nfsroot</blockquote>
</li>
<li>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.</li>
<li>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.</li>
<li>relancez lilo et bootez sur le nouveau noyau.</li>
<li>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 :
<ul>
<li>Copiez le fichier rc.devfs de la documentation devfs des
sources du noyau vers /etc/rc.d/rc.devfs et rendez-le
exécutable</li>
<li>Sauvegardez les paramétrages :
<blockquote>/etc/rc.d/rc.devfs save /etc/sysconfig</blockquote>
</li>
</ul>
</li>
</ol>
<h2><a name="ss3.2">3.2 Création et remplissage de
/tftpboot, création des liens vers /tmp etc.</a></h2>
<h3>La partie automagique</h3>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Ceci dit, copiez-collez ce script et rendez le
exécutable, puis exécutez-le.</p>
<hr>
<pre>
#!/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
</pre>
<hr>
<h3>Ajustements manuels</h3>
<ol>
<li>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 :
<hr>
<pre>
# pour les stations montant root par NFS
/etc/rc.d/rc.ws
</pre>
<hr></li>
<li>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 :
<ul>
<li>réseau</li>
<li>système de fichiers NFS</li>
<li>NFS</li>
<li>rc.local</li>
</ul>
</li>
</ol>
<h2><a name="ss3.3">3.3 Export des systèmes de fichiers
appropriés et configuration de bootp</a></h2>
<h3>Export des systèmes de fichiers</h3>
<p>Par exemple ici à l'Université, j'ajouterai ceci
à /etc/exports :</p>
<hr>
<pre>
/ *.st.hhs.nl(ro,no_root_squash)
/home *.st.hhs.nl(rw,no_root_squash)
</pre>
<hr>
<p>Remplacez les noms de domaine par les vôtres et relancez
NFS :</p>
<blockquote>/etc/rc.d/init.d/nfs restart</blockquote>
<p>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.</p>
<h3>Configurer bootp</h3>
<ol>
<li>Si bootp n'est pas encore installé, c'est le moment de
le faire. Il est inclus dans la RedHat.</li>
<li>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.</li>
<li>Redémarrez inetd :
<blockquote>/etc/rc.d/init.d/inetd restart</blockquote>
</li>
</ol>
<h2><a name="s4">4. Ajouter des stations</a></h2>
<h2><a name="ss4.1">4.1 Créer une disquette de
démarrage (bootdisk) ou une bootprom</a></h2>
<h3>Créer un bootdisk</h3>
<p>Même si vous avez l'intention d'utiliser une bootprom, il
est plus sage de tester d'abord avec un bootdisk. Pour le
créer :</p>
<blockquote>dd if=/<path-to-zImage>/zImage
of=/dev/fd0</blockquote>
<h3>Créer une bootprom</h3>
<p>Il y a plusieurs paquets libres disponibles :</p>
<ol>
<li>netboot, c'est le plus complet. Il utilise les pilotes (packet
drivers) DOS standards donc presque toutes les cartes sont
supportées. Un truc très utile qui était
passé sur la mailing list : compresser les packetdrivers, la
plupart des pilotes commerciaux étant trop gros pour tenir
dans une bootprom. La documentation de netboot est assez
complète : on ne la reprendra pas ici. Avec elle,
créer une bootprom et démarrer une station devrait
aller de soi. La page web de netboot : <a href=
"http://www.han.de/~gero/netboot/">http://www.han.de/~gero/netboot/</a></li>
<li>etherboot, l'autre package libre Il propose quelques
améliorations comme le dhcp. Mais il utilise son propre
format de drivers donc supporte moins de cartes. Je ne l'ai pas
utilisé donc ne peux en dire plus. La page web : <a href=
"http://www.slug.org.au/etherboot/">http://www.slug.org.au/etherboot/</a></li>
</ol>
<p>A propos des roms : la plupart des cartes peuvent recevoir des
eproms de 28 pins. Celle-ci ont une taille maximale de 64 ko. Pour
la plupart des cartes, on aura besoin de 32 ko avec netboot.
Quelques drivers tiendront dans une rom de 16 ko mais la
différence de prix est minime. Ces eproms sont standards (on
y écrit avec un <em>eprom burner</em> ordinaire).</p>
<h2><a name="ss4.2">4.2 Créer un répertoire
station</a></h2>
<p>Il suffit de recopier le répertoire qui sert de
modèle (template) en tapant :</p>
<blockquote>cd /tftpboot ; cp -a template <ip></blockquote>
<p>On peut aussi, bien sûr, recopier le répertoire
d'une station ayant la même souris, carte graphique et
moniteur. Dans ce cas la configuration réalisée
à l'étape 4.5 est inutile.</p>
<h2><a name="ss4.3">4.3 Ajouter les entrées dans
/etc/bootptab et /etc/hosts</a></h2>
<p>Editer /etc/bootptab et ajouter une entrée pour une
station de test, par exemple :</p>
<hr>
<pre>
nfsroot1:hd=/tftpboot:vm=auto:ip=10.0.0.237:\
:ht=ethernet:ha=00201889EE78:\
:bf=bootImage:rp=/tftpboot/10.0.0.237/root
</pre>
<hr>
<p>Remplacer nfsroot1 par le nom d'hôte de la station.
Remplacer 10.0.0.237 par son adresse IP et 00201889EE78 par son
adresse MAC. Si vous ne connaissez pas cette dernière,
démarrez avec la disquette de boot que vous venez de
créer et vous la verrez apparaître dans les messages
affichés au boot. Bootpd est certainement déjà
lancé, mais pour en être sûr, essayons de le
redémarrer :</p>
<blockquote>killall -HUP bootpd</blockquote>
<p>Si cela échoue, c'est qu'il ne tournait pas. Dans ce cas
inetd le démarrera au moment voulu.</p>
<h2><a name="ss4.4">4.4 Démarrer la station pour la
première fois</a></h2>
<p>Démarrez simplement la station depuis le bootdisk. Vous
devriez avoir ainsi une station en mode texte, avec exactement la
même configuration que le serveur exceptés l'adresse
IP et les services lancés. Même si vous comptez
utiliser une bootprom, il est plus sage de tester d'abord avec un
bootdisk.</p>
<h2><a name="ss4.5">4.5 Configuration spécifique à la
station</a></h2>
<ol>
<li>Premièrement, lancez mouseconfig pour installer la
souris. Pour appliquer les changements, faites un :
<blockquote>/etc/rc.d/init.d restart</blockquote>
</li>
<li>Lancez Xconfigurator ; quand Xconfigurator a
détecté la carte et que vous pouvez cliquer sur ok,
ne le faites pas ! Comme nous avons déplacé le lien
du serveur X de /etc/X11/X vers /etc/sysconfig/X11/X, Xconfigurator
ne pourra pas créer le bon lien. Ceci étant, pour
être sûr que Xconfigurator continue correctement,
basculez sur une autre console et créez le lien sous
/etc/sysconfig/X11 vers le serveur X conseillé. Maintenant,
quittez Xconfigurator et testez le serveur X.</li>
<li>Configuration de tout ce qui diffère du serveur ou du
template :
<ul>
<li>son : il sera peut-être nécessaire de modifier
isapnp.conf et conf.modules, les deux étant
déjà des liens vers /etc/sysconfig (modification
faite par le script de prépration du serveur).</li>
<li>cdrom : lien sous /dev, entrée dans /etc/fstab,
etc.</li>
<li>rc.local : faites tous les changements nécessaires</li>
</ul>
</li>
<li>Sauvegarde des liens et autres changements effectués
sous /dev :
<blockquote>/etc/rc.d/rc.devfs save /etc/sysconfig</blockquote>
</li>
<li>Voilà, c'est terminé.</li>
</ol>
<h2><a name="s5">5. Bonus : démarrer depuis un
cdrom</a></h2>
<p>La plupart des opérations ci-dessus sont valables pour
démarrer depuis un cdrom. Comme je voulais également
documenter cette façon de booter, je le précise ici
pour éviter de taper trop de choses une seconde fois.</p>
<p>Pourquoi démarrer depuis un cdrom ? C'est surtout
intéressant partout où l'on veut faire tourner une
application spécifique comme un kiosque, une base de
données de bibliothèque ou un cyber-café, et
qu'on n'a pas de réseau ou de serveur pour utiliser root par
NFS.</p>
<h2><a name="ss5.1">5.1 Principe de base</a></h2>
<p>C'est simple : démarrer avec un cdrom en tant que racine.
Pour que ce soit possible, nous utiliserons l'extension rockridge
pour graver un système de fichiers unix et l'extension
eltorito pour rendre le cd amorçable.</p>
<h3>Les choses ne peuvent être si simples...</h3>
<p>Bien sûr cette configuration soulève quelques
problèmes. Ils sont à peu près les mêmes
que précédemment :</p>
<ol>
<li>Nous avons besoin d'accès en écriture sur : /dev,
/var et /tmp.
<ul>
<li>Nous utiliserons les mêmes solutions :
<ul>
<li>pour /dev nous utiliserons Devfs</li>
<li>pour /var et /tmp nous utiliserons un ramdisk partagé de
1 Mo. /tmp est remplacé par un lien vers /var/tmp.</li>
<li>le remplissage du ramdisk peut être fait aussi bien
à partir d'une archive que d'un répertoire template.
Nous retiendrons là encore le répertoire template
pour la simplicité des modifications.</li>
</ul>
</li>
</ul>
</li>
<li>Certaines applications ont besoin d'un accès à
/home en écriture.
<ul>
<li>Dans ce cas, on mettra le répertoire de l'utilisateur de
ces applications sous /var, et on finira de remplir /var à
chaque boot.</li>
</ul>
</li>
<li>/etc/mtab doit être accessible en écriture :
<ul>
<li>Créer un lien vers /proc/mounts et créer un
fichier vide sous /proc, comme décrit
précédemment.</li>
</ul>
</li>
</ol>
<h2><a name="ss5.2">5.2 Créer une configuration de
test</a></h2>
<ol>
<li>Pour commencer, prenez une des machines que vous allez utiliser
et mettez dedans un gros disque et un graveur de cd.</li>
<li>Installez la distribution de votre choix et laissez une
partition de 650 Mo pour le test. Cette installation servira
à créer l'image iso et à graver le cd, aussi
il faut installer les outils necessaires. Elle servira
également à recommencer en cas de
problème.</li>
<li>Sur la partition de 650 Mo, installez la distribution de votre
choix avec la configuration que vous voudrez avoir sur le cd. Ce
sera la configuration de test.</li>
<li>Démarrez sur la configuration de test.</li>
<li>Compilez le noyau comme décrit dans la section 3.1, en
suivant toutes les étapes. Les modifications pour devfs
doivent être faites ici aussi. A l'étape 3, ajoutez ce
qui suit :
<ul>
<li>isofs compilé dans le noyau</li>
<li>devfs compilé</li>
<li>support du cdrom compilé</li>
<li>tout ce dont vous avez besoin, compilé ou en module</li>
</ul>
</li>
<li>Configuration de la partition de test :
<ul>
<li>créer l'utilisateur qui lancera les applications</li>
<li>mettre son répertoire sous /var</li>
<li>installer l'application (si nécessaire)</li>
<li>configurer l'application si nécessaire</li>
<li>configurer l'utilisateur de telle façon que
l'application démarre automatiquement après le
login</li>
<li>configurer linux pour démarrer une session en tant que
cet utilisateur</li>
<li>configurer tout ce qui doit encore être
configuré</li>
</ul>
</li>
<li>Vérifiez que la configuration démarre
correctement sous l'application et que tout fonctionne bien.</li>
<li>Redémarrez sur l'installation principale et montez la
partition de 650 Mo sur /test.</li>
<li>Mettez ce qui suit dans un fichier /test/etc/rc.d/rc.iso (il
sera exécuté au début de rc.sysinit pour
créer /var) :
<hr>
<pre>
#/var
echo Creating /var ...
mke2fs -q -i 1024 /dev/ram1 1024
mount /dev/ram1 /var -o defaults,rw
cp -a /lib/var /
#restore devfs settings, needs proc
mount -t proc /proc /proc
/etc/rc.d/rc.devfs restore /etc/sysconfig
umount /proc
</pre>
<hr></li>
<li>Editez /test/etc/rc.sysinit en commentant les lignes où
/ est remonté en lecture-écriture et ajoutez les 2
lignes suivantes après l'initialisation de la variable PATH
:
<hr>
<pre>
#to boot from cdrom
. /etc/rc.d/rc.iso
</pre>
<hr></li>
<li>Copiez ce qui suit dans un script et exécutez-le : cela
va créer un répertoire modèle pour /var et des
liens pour /tmp et /etc/mtab.
<hr>
<pre>
#!/bin/sh
echo tmp
rm -fR /test/tmp
ln -s var/tmp /test/tmp
###
echo mtab
touch /test/proc/mounts
rm /test/etc/mtab
ln -s /proc/mounts /test/etc/mtab
###
echo var
mv /test/var/lib /test/lib/var-lib
mv /test/var /test/lib
mkdir /test/var
ln -s /lib/var-lib /test/lib/var/lib
rm -fR /test/lib/var/catman
rm -fR /test/lib/var/log/httpd
rm -f /test/lib/var/log/samba/*
for i in `find /test/lib/var/log -type f`; do cat /dev/null > $i; done
rm `find /test/lib/var/lock -type f`
rm `find /test/lib/var/run -type f`
</pre>
<hr></li>
<li>Enlevez la création de /etc/issue* de /test/etc/rc.local
(ça planterait à coup sûr).</li>
<li>Maintenant, démarrez sur la partition de test : elle
sera en lecture seule comme un cdrom. Si quelque chose ne
fonctionne pas, redémarrez sur la partition de travail et
réparez puis réessayez. On peut aussi remonter / en
lecture-écriture, réparer puis redémarrer
directement sur la partition de test. Pour remonter / :
<blockquote>mount -o remount,rw /</blockquote>
</li>
</ol>
<h2><a name="ss5.3">5.3 Créer le cd</a></h2>
<h3>Créer une image de démarrage (image de boot)</h3>
<p>D'abord, démarrer sur la partition de travail. Pour
créer un cd amorçable, nous aurons besoin d'une image
d'une disquette de démarrage. Mais copier par dd une
<em>zimage</em> ne suffit pas parce que, au tout début du
chargement de celle-ci, un pseudo lecteur de disquette est
créé et le chargeur du système ne s'y retrouve
plus dans le cas d'un cd amorçable. Donc nous utiliserons
plutôt syslinux.</p>
<ol>
<li>récupérer boot.img sur un cdrom redhat</li>
<li>monter boot.img quelque part par loopback en tapant :
<blockquote>mount boot.img somewhere -o loop -t vfat</blockquote>
</li>
<li>enlever tout ce qui est dans boot.img sauf :
<ul>
<li>ldlinux.sys</li>
<li>syslinux.cfg</li>
</ul>
</li>
<li>copier le noyau de la partition de test vers boot.img</li>
<li>editer syslinux.cfg pour ajouter ce qui suit, en
remplaçant zImage par le nom d'image approprié :
<hr>
<pre>
default linux
label linux
kernel zImage
append root=/dev/<insert your cdrom device here>
</pre>
<hr></li>
<li>démonter boot.img :
<blockquote>umount somewhere</blockquote>
</li>
<li>Si /etc/mtab est un lien vers /proc/mounts, le démontage
ne va pas automatiquement libérer /dev/loop0 donc il faut le
libérer en tapant :
<blockquote>losetup -d /dev/loop0</blockquote>
</li>
</ol>
<h3>Créer l'image iso</h3>
<p>Maintenant que nous avons l'image de boot et une installation
qui peut démarrer sur un montage en lecture seule, il est
temps de créer une image iso du cd :</p>
<ol>
<li>copier boot.img sur /test</li>
<li>aller dans le répertoire ou vous voulez stocker l'image
(en prenant garde qu'il y ait assez de place sur la partition)</li>
<li>générer l'image :
<blockquote>mkisofs -R -b boot.img -c boot.catalog -o boot.iso
/test</blockquote>
</li>
</ol>
<h3>Vérifier l'image iso</h3>
<ol>
<li>monter l'image en loopback en tapant :
<blockquote>mount boot.iso somewhere -o loop -t
iso9660</blockquote>
</li>
<li>vérifier que le contenu est correct</li>
<li>démonter boot.iso :
<blockquote>umount somewhere</blockquote>
</li>
<li>si /etc/mtab est un lien sur /proc/mounts, libérer
/dev/loop0 :
<blockquote>losetup -d /dev/loop0</blockquote>
</li>
</ol>
<h3>Graver le cd</h3>
<p>Si cdrecord est installé et configuré :</p>
<blockquote>cdrecord -v speed=<desired writing speed>
dev=<path to your writers generic scsi device>
boot.iso</blockquote>
<h2><a name="ss5.4">5.4 Démarrer sur le cd et le
tester</a></h2>
<p>Hé bien le titre de ce paragraphe a tout dit ! ;)</p>
<h2><a name="s6">6. Remerciements</a></h2>
<ul>
<li>La HHS (Haagse Hoge School), l'établissement où
j'ai développé et testé cette configuration :
elle était utilisée dans plusieurs labos. C'est
également là que j'ai écris la première
version de ce HowTo.</li>
<li>ISM : une société néerlandaise où
j'ai réalisé mon projet de fin d'études. Une
partie de ce projet concernait des machines sans disque, j'ai donc
dû pousser un peu plus loin le développement de cette
configuration et j'ai eu le temps de mettre à jour ce
HowTo.</li>
<li>A tout ceux qui me donneront des conseils utiles une fois que
cette version sera sortie ;)</li>
</ul>
<h2><a name="s7">7. Commentaires</a></h2>
<p>Commentaires, suggestions et autres sont les bienvenus et
peuvent être adressés à Hans de Goede :
j.w.r.degoede@et.tudelft.nl</p>
</body>
</html>
|