[Top] | [Contents] | [Index] | [ ? ] |
Ce document veut pouvoir fournir une méthode relativement simple et abordable pour réussir à faire fonctionner le Hurd avec aussi peu d'efforts que possible.
1. Petit survol Ou va-t-on ? 2. Les choses sérieuses ou trouver une maison. Trouver une maison 3. Le chargeur Trouver Grub 4. Installation croisée Installation croisée du Hurd 5. Booter the Hurd 6. Installation native Finir l'installation 7. Configuration Rendre le système utilisable 8. Derniers mots La FAQ 9. Travaux référencés Travaux cites
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
La distribution Debian GNU/Hurd, contrairement aux autres systèmes d'exploitation, ne dispose pas d'un joli programme d'installation. Un jour ce sera le cas, et peut-être contribuerez-vous à le créer. D'ici là, installer le GNU Hurd nécessite la présence d'un autre système d'exploitation, spécifiquement un simili-Unix(1). Les utilisateurs ont signalé l'avoir installé avec succès depuis diverses saveurs d'Unix, telles GNU/Linux ou les BSDs. Les fonctionnalités minimales nécessaires du système de bootstrap sont en fait: créer un système de fichiers en ext2; extraire une archive tar dessus; installer GNU Grub.
Le GNU Hurd a une nature qui est assez semblable aux autres systèmes
simili-Unix: après s'être connecté, l'utilisateur se retrouve avec un
shell, et le VFS familier des Unix. Mais même si GNU tente d'être
compatible POSIX, il n'est pas un Unix. Le Hurd est construit sur de nombreux
concepts d'Unix, mais il les étend soit avec de nouvelles
fonctionnalités, soit en changeant ce qui a été per@,cu comme des erreurs
dans la conception originelle. La différence la plus perceptible, ce sont
les translateurs, des programmes utilisateur qui interagissent avec le VFS.
Ces systèmes de fichiers ne sont pas localisés dans le noyau, pas plus
qu'ils ne doivent être exécutés par root; ils ont juste besoin d'un
accès aux données statiques, et au point de montage
. Une autre
différence est que les processus, au lieu d'avoir une seule identité
fixée lors de leur création, ont des jetons d'identification disjoints
du processus, i.e. ils peuvent voir leurs droits étendus ou supprimés
par une autorité appropriée.
Une grande familiarité avec l'environnement Unix est une nécessité pour se sentir à l'aise avec GNU. Avoir une certaine maîtrise des outils Debian pourra aussi se révéler indispensable pour configurer et maintenir un système GNU/Hurd.
Ce guide tente de rendre l'installation du Hurd aussi simple que possible. Si il y a des erreurs, elles sont probablement dûes à l'auteur (NDT: ou au traducteur !). Merci de les lui signaler, de même pour toute suggestion ou critique; elles sont toujours bienvenues.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Si vous n'avez pas de partition libre ou de disque supplémentaire, ceci peut être l'étape la plus longue. Dans ce cas, vous devrez repartitionner votre disque dur. Une solution est d'utiliser l'éditeur de partitions GNU, Parted. Il n'implémente pas seulement l'édition basique des partitions, mais il permet aussi de retailler ou de déplacer des partitions. Il peut se télécharger sur :http://www.gnu.org/software/parted. Le manuel est assez complet, et comporte des tutoriels.
Le Hurd ne supporte qu'une taille de partition de l'ordre de deux gigaoctets; rien de plus grand ne fonctionnera. Cette limitation est consécutive à un choix d'implémentation fait il y a de nombreuses années, dans lequel le serveur de système de fichiers devait mapper la totalité du système de fichiers en mémoire. Comme la taille de la mémoire virtuelle disponible sur les architectures ia32 est de seulement quatre gigaoctets pour les applications, et qu'une grande partie de celle-ci est réservée pour le code, la pile et le tas, au final, la plus grande taille de mémoire virtuelle contigüe est généralement de l'ordre de deux gigaoctets.Cette limitation devrait disparaitre bientot.
Ceci dit, un unique système de fichiers de deux gigaoctets est largement suffisant pour un système utilisable. Beaucoup, cependant, préfèrent deux systèmes de fichiers, un pour la racine, et un pour `/home'. Cet autre schéma est très adapté pour les développeurs : compiler le Hurd peut nécessiter beaucoup d'espace.
Le Hurd supporte de nombreuses extensions par rapport au format ext2
classique. En gros, ce sont les translateurs passifs, et un quatrième
ensemble de bits de permission pour les utilisateurs inconnus (utilisateurs
sans identité et non les autres utilisateurs). Pour utiliser ces extensions,
le propriétaire de cette partition doit être hurd
.
mke2fs
, à part s'il n'est pas contraint sur la ligne de commande,
va affecter le propriétaire au nom du système en cours d'exécution.
Comme Hurd va diligemment respecter ceci, il faut être attentif à
l'initialiser correctement, sinon le Hurd va planter de manière subtile.
Prenez bien garde à ce que même si un système de fichiers appartient
à un système donné, d'autres systèmes peuvent y accéder; ils
seront juste incapables d'utiliser
certaines extensions.
Pour créer un système de fichiers, utilisez mke2fs
et passez-lui
l'option `-o hurd' pour lui signifier que c'est à Hurd qu'appartient
ce nouveau système de fichiers. Par exemple, disons que la partition est
`/dev/hda2'
# mke2fs -o hurd /dev/hda2 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Contrairement à GNU/Linux et aux BSDs, le Hurd n'a pas d'auto amorceur; n'importe quel amorceur qui fournit le standard multiboot peut être utilisé pour charger le Hurd. Pour le moment, il y a un seul projet qui satisfait ces conditions: Grub, le GRand Unified Boot loader.
Un mot sur Grub. Contrairement aux amorceurs traditionnels sur x86, comme LILO, Grub est très puissant. Il dispose d'une interface en ligne de commande, de boopt, d'un support de terminal simple et d'une pléthore d'autres fonctionnalités. En plus, il peut charger la plupart des systèmes. Si vous avez déjà booté un alpha ou une sparc, vous comprenez ce que Grub peut faire. Cependant, ne soyez pas craintif, Grub est mieux. Vous l'adorerez. Vous ne reviendrez pas en arrière.
Pour télécharger Grub, allez sur http://www.gnu.org/software/grub.
Là, vous pourrez télécharger un tarball, et une image de disquette. Si
vous choisissez de télécharger le tarball, c'est un configure
,
make
, make install
. En prime, vous avez un magnifique
manuel sur le fonctionnement de Grub. Sinon, si vous téléchargez l'image
de la disquette, il suffit de la recopier sur une disquette pour avoir un
Grub fonctionnel, par exemple:
# dd if=grub-boot-image of=/dev/fd0 |
Vous pourrez toujours installer Grub sur votre disque plus tard.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
La prochaine étape est de télécharger le système de base sur: ftp://alpha.gnu.org/gnu/hurd/contrib/marcus/gnu-latest.tar.gz.
Le tarball est configuré pour tout extraire dans le répertoire courant. Une fois que le système de fichiers est monté, l'archive peut être extraite. Si l'on considère que le système de fichiers est `/dev/hda2', et le point de montage `/gnu', alors il vous faut procéder ainsi :
# mount -t ext2 /dev/hda2 /gnu # cd /gnu # tar --same-owner -xvzpf ~/gnu-latest.tar.gz |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Tout est maintenant en place pour booter le Hurd pour la première fois. Après avoir vérifié que le disque de boot de Grub est dans le lecteur, rebootez. Si tout va bien, soit un menu de boot, soit une ligne de commande doivent apparaître. Si c'est le menu qui apparaît, tapez c pour avoir la ligne de commande.
Tout d'abord, c'est GNU mach qui doit être chargé. Ceci demande de
connaître le type de système de fichiers, ainsi que la localisation
de GNU mach. Grub utilise une nomenclature de partition qui est un peu
différente de Linux et de Hurd : aussi bien les disques SCSI que IDE sont
appelés `(hdN,M'. N
est le numéro de disque (en partant de
zéro) tel que décompté par le bios. Ceci étant, Grub ne fait aucune
distinction entre les disques IDE et SCSI. M
identifie la partition
sur le disque. Il faut là aussi partir de zéro. Si cela vous semble
quelque peu confus, soyez tranquille : Grub fournit aussi des aides.
Pour déterminer sur quel système de fichiers se trouve un fichier donné,
Grub dispose d'une commande find
. Lorsque cette commande est
exécutée sans que soit précisé de système de fichiers particulier,
Grub recherche ce fichier dans chaque système de fichiers et indique oł il
l'a trouvé. Par exemple, pour rechercher le noyau
`/boot/gnumach.gz':
grub> find /boot/gnumach.gz (hd0,0) |
Ici, Grub indique que `/boot/gnumach.gz' est sur `(hd0,0)'.
Avant de charger le noyau, une option au moins, la partition racine, doit être entrée sur la ligne de commande. Ceci va être utilisé par Hurd lui-même (i.e.: non par Grub). Du coup, ceci doit être spécifié d'une fa@,con telle que Hurd va la comprendre.
GNU Mach comptabilise les disques en partant de zéro. Les disques IDE
sont préfixés par hd
, tandis que les disques SCSI le sont par
sd
. Comme pour linux, les disques sont numérotés en fonction de
leur position sur le contrôleur. Ainsi, le premier maître est hd0
et le deuxième esclave est hd3
. Les partitions utilisent la même
convention que les BSD pour le numérotage des partitions et ajoutent
sM
au nom de disque pour spécifier le nom complet. Notez bien
que la base d'indexation des partitions est 1, et non 0. Le numéro de
partition est simple à calculer: ajoutez 1 à ce qui a été trouvé
par Grub.
Tant que le Hurd n'a pas été configuré, il doit être lancé en mode mono-utilisateur. Pour cela, il suffit d'ajouter l'option `-s' à la ligne de commande du noyau.
Si l'on considère que le premier disque (i.e.: `hd0') est le maître sur le contrôleur secondaire, alors nous avons:
grub> kernel (hd0,0)/boot/gnumach.gz root=device:hd2s1 -s [Multiboot-elf, ...] |
Ensuite, le serveur du système de fichiers maître et le serveur
exec
doivent être chargés. Ceci est fait en utilisant les
facilités de Grub pour charger les modules. Les paramètres sont la
syntaxe par laquelle le noyau fournit des valeurs importantes aux
serveurs.
grub> module (hd0,0)/hurd/ext2fs.static \ --multiboot-command-line=${kernel-command-line} \ --host-priv-port=${host-port} \ --device-master-port=${device-port} \ --exec-server-task=${exec-task} -T typed ${root} \ $(task-create) $(task-resume) [Multiboot-module 0x1c4000, 0x2cfe6a bytes] grub> module (hd0,0)/lib/ld.so.1 /hurd/exec $(exec-task=task-create) [Multiboot-module 0x494000, 0x27afe bytes] |
Une fois que le GNU Hurd est lancé, ce processus peut être automatisé en ajoutant la ligne appropriée au fichier de configuration de `/boot/grub/menu.list' de Grub.
Il est maintenant possible de booter GNU:
grub> boot |
Restez tranquille, et regardez défiler les messages. C'est beaucoup plus important que ne le croient bien des gens: il y a un bug dans GNU mach qui fait que presser une touche pendant le processus de boot provoque une panique du noyau.
Si le Hurd n'arrive pas à booter, cela peut être dû aux interruptions partagées: GNU mach n'aime pas trop jouer avec elles. Vous pouvez rechercher leur présence avec `/proc/interrupts' sous GNU/Linux. De même, comme GNU mach ne supporte pas le chargement dynamique de modules dans le noyau, beaucoup de drivers sont compilés par défaut dans le noyau. Si vous avez de vieux périphériques, cela peut poser un problème car alors ceux-ci peuvent répondre de manière inopinée à une recherche d'un périphérique tout autre, et par la suite causer un crash. Compiler un nouveau noyau peut alors résoudre ce problème. GNU mach peut facilement être cross-compilé. Si vous utilisez Debian, tentez d'installer le paquet `gcc-i386-gnu' sous GNU/Linux.
Si cela ne vous est d'aucune utilité, voyez les liens à la fin de ce document. Sinon, finalement, demandez de l'aide sur une liste de diffusion appropriée.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Dès que vous aurez une invite de shell, et à chaque fois que vous booterez en mode mono-utilisateur, vous devrez préciser le type de terminal:
# export TERM=mach |
Soyez avertis que CONTROL-C et autres ne fonctionnent pas en mode mono-utilisateur.
Maintenant, nous pouvons exécuter le script `native-install'. Ceci va configurer des paquets et démarrer des translateurs importants:
# ./native-install |
Avant que le script ne se termine, il va vous indiquer qu'il devra être
exécuté une seconde fois. Suivez les instructions et rebootez en utilisant
la commande reboot
. A nouveau, bootez en mode mono-utilisateur,
et exécutez la commande ./native-install
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Pour configurer le réseau, le translateur pfinet doit être configuré.
Ceci est fait en utilisant la commande settrans
qui permet
d'attacher un translateur à un noeud donné du système de fichiers.
Quand les programmes accèdent à ce noeud, par exemple par un appel RPC,
le système d'exploitation va automatiquement lancer le serveur pour
répondre à la demande.
# settrans -fgap /servers/socket/2 /hurd/pfinet -i eth0 \ -a a.b.c.d -g e.f.g.h -m i.j.k.l |
Ici, plusieurs arguments sont passés à settrans
. Les deux
premiers, `fg', obligent tout translateur existant précédemment
à s'arrèter. Les deux suivants, `ap', rendent ce translateur à la
fois actif et passif. En rendant le translateur actif, nous pourrons
apercevoir immédiatement toute erreur sur `stderr'. La dernière
sauvegarde les arguments dans le noeud, si bien qu'il sera redémarré de
manière transparente plus tard (i.e.: cela est rendu permanent, même
après les reboots). Les options sont suivies du nom du noeud auquel est
attaché le translateur, puis le nom du programme (i.e. le translateur)
à exécuter et les arguments à lui passer. L'option `-i' est
l'interface sur laquelle pfinet
va écouter, `-a' est
l'adresse IP, `-g' est la passerelle à utiliser et `-m'
est le masque de réseau.
Assurez-vous d'avoir ajouté des adresses de serveurs de noms dans votre fichier `/etc/resolv.conf':
nameserver 192.168.1.1 |
Pour tester la configuration, ping -c2 gateway
. L'option
`-c' est importante pour limiter le nombre de pings; pour
mémoire, CONTROL-C ne marche pas en mode mono-utilisateur.
DHCP ne marche pas encore sous le Hurd. Ceci est dû aux limites de pfinet : il est basé sur le code de la pile TCP/IP de Linux, et ne peut écouter sur `0.0.0.0'.
De l'aide sur settrans
peut être obtenue en mettant l'option
`--help'. De l'aide sur un translateur spécifique peut être
obtenue en l'appelant depuis la ligne de commande avec le même argument:
# /hurd/pfinet --help |
Comme il peut y avoir beaucoup de sortie, il est préférable de rediriger
ceci vers un paginateur comme less
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Ensuite, éditez `/etc/fstab' pour y ajouter d'autres systèmes de
fichiers tels que le swap. C'est très important d'utiliser du
swap; le Hurd va être plus stable d'un ordre de grandeur. Pour information,
le Hurd peut partager une partition de swap de manière transparente avec
Linux, mais saura aussi joyeusement paginer sur n'importe quel
périphérique, y compris une partition utile, genre celle contenant votre
répertoire personnel. Par défaut, nano
est le seul éditeur
installé dans la distribution de base.
Voici un exemple de fichier `/etc/fstab':
# <file system> <mount point> <type> <options> <dump> <pass> /dev/hd2s1 / ext2 rw 0 1 /dev/hd2s2 /home ext2 rw 0 2 /dev/hd2s3 none swap sw 0 0 |
N'oubliez pas de créer les bons périphériques en utilisant la
commande MAKEDEV
:
# cd /dev # ./MAKEDEV hd2s1 hd2s2 hd2s3 |
Pour monter un système de fichier NFS, on utilise le translateur
/hurd/nfs
. Quand on le lance en tant qu'utilisateur, cette commande
utilisera un port au dessus de 1024. Par défaut, GNU/Linux rejettera
ceci. Pour dire à GNU/Linux d'accepter les connexions issues d'un port
non privilégié, il faut ajouter l'option `insecure' à la ligne
d'export. Voici un exemple de fichier `/etc/export' en considérant
que l'adresse IP du client est `192.168.1.2' :
/home 192.168.1.2(rw,insecure) |
Pour monter ceci depuis une machine sous GNU, et en considérant que l'IP du serveur est `192.168.1.1' :
# settrans -cgap /mount/point /hurd/nfs 192.168.1.1:/home |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
En fin de compte, redémarrez en mode multi-utilisateur, i.e. comme pour le mode mono-utilisateur, mais en ôtant l'option `-s' lorsque l'on charge le noyau. Pour plus de détails, voyez See section 5. Booter the Hurd.
Joyeux hacking!
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Pour comprendre le Hurd, commencez avec la page principale du site de Debian : http://www.debian.org/ports/hurd/ et sur le site de GNU : http://hurd.gnu.org.
Envisagez aussi de lire le code et d'écrire de la documentation.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Devoir charger le noyau à la main à chaque fois peut être vraiment fastidieux. Editez le fichier `/boot/grub/menu.lst' et modifiez-le comme il faut; booter deviendra plus rapide et plus facile.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Par défaut, seuls très peu de périphériques sont présents dans le répertoire `/dev'. Il faut lancer le script `MAKEDEV' pour créer tous les noeuds de périphériques nécessaires.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Il y a de nombreuses fa@,cons d'installer des paquets. Télécharger et
utiliser la dpkg -i
fonctionne, mais présente beaucoup
d'inconvénients. Le moyen le plus simple est d'utiliser la commande
apt-get
. Éditez le fichier `/etc/apt/sources.list' et
ajoutez les deux entrées suivantes :
deb ftp://alpha.gnu.org/gnu/hurd/debian unstable main deb ftp://ftp.debian.org/debian unstable main |
ftp://alpha.gnu.org contient des paquets qui ont été hacké ou dont les patches n'ont pas encore été intégrés. Pour utiliser un mirroir debian local, voyez http://www.debian.org/distrib/ftplist.
Si GNU Mach ne reconnait pas votre carte réseau, ou si vous utilisez un modem, le seul moyen de mettre à jour sera de télécharger les paquets puis de les copier sur votre système GNU. Le moyen le plus simple est alors d'utiliser apt off-line. Voyez `/usr/share/doc/apt/offline' pour plus d'informations.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
XFree86 a été porté, et toutes les cartes qu'il est capable de faire marcher sans support noyau devraient fonctionner.
D'abord, mettez en place le translateur du clavier :
# cd /dev # ./MAKEDEV kbd |
Ensuite, le translateur de la souris. Pour une souris sur port série, remplacez `com0' par le port de communication approprié:
# settrans /dev/mouse /hurd/mouse --device=com0 --protocol=microsoft |
Vérifiez bien que `/dev/com0' existe. Si ce n'est le cas, créez-le
en utilisant MAKEDEV
comme d'habitude.
PS/2 ne requiert pas de noeud de périphérique. Il suffit de faire :
# settrans /dev/mouse /hurd/mouse --protocol=ps/2 |
D'autres souris peuvent être utilisées ; exécutez `/hurd/mouse' avec l'option `--help' pour plus de détails.
Vous aurez besoin de plusieurs paquets relatifs à X. x-window-system-core, rxvt et twm ou fvwm sont un bon début.
Debconf peut être utilisé pour configurer XFree86, cependant, il n'est pas compatible avec le Hurd et le fichier de configuration devra être modifié. Il faut changer la section pointeur en:
Section "Pointer" Protocol "osmouse" Device "/dev/mouse" EndSection |
`Emulate3Buttons' peut être ajouté de fa@,con optionnelle. Rien d'autre ne marchera.
GNU n'utilise pas ld.so.conf. Aussi, comme `/X11R6/lib' n'est pas dans le chemin de recherche des librairies par défaut, il faut ajouter soit dans `/etc/profile' soit dans le fichier `.profile' de chaque utilisateur:
export LD_LIBRARY_PATH=/X11R6/lib:$LD_LIBRARY_PATH |
Finalement, exécutez startx
.
Il y a plusieurs choses au sujet desquelles il faut être averti.
xterm
ne fonctionne pas correctement car il SETGID (et en
plus, il ne prend pas en compte LD_LIBRARY_PATH et échoue en tentant
de charger la librairie partagée appropriée) ; essayez rxvt
.
update-menu
n'a pas encore été porté. Du coup, vous n'aurez
pas de sympatiques menus Debian. Cependant, une implémentation des
pthreads
existe, et tous les paquets qui en dépendent n'ont
pas encore été portés : n'espérez pas que Gnome ou KDE fonctionnent.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Le Hurd n'a pas de terminaux virtuels, mais c'est en développement.
Utilisez le paquet screen
en attendant.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Le Wiki Hurd, http://hurd.gnufans.org/bin/view/Hurd/WebHome, répond aux problèmes courants auxquels les nouveaux utilisateurs sont confrontés.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
"The Easy Guide to Installing Hurd on a Linux Box" Copyright (C) 1999 Matthew Vernon matthew@debian.org. http://www.pick.ucam.org/~mcv21/hurd.html
[Top] | [Contents] | [Index] | [ ? ] |
Philip Charles a créé un ensemble de CDs (disponibles sur : http://www.debian.org/ports/hurd/hurd-cd) qui contient un système Debian GNU/Linux, qui répond à cette nécessité, cependant cela reste fonctionnellement équivalent à ce qui est présenté ici.
[Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
1. Petit survol
2. Les choses sérieuses ou trouver une maison.
3. Le chargeur
4. Installation croisée
5. Booter the Hurd
6. Installation native
7. Configuration
8. Derniers mots
9. Travaux référencés
[Top] | [Contents] | [Index] | [ ? ] |
Button | Name | Go to | From 1.2.3 go to |
---|---|---|---|
[ < ] | Back | previous section in reading order | 1.2.2 |
[ > ] | Forward | next section in reading order | 1.2.4 |
[ << ] | FastBack | previous or up-and-previous section | 1.1 |
[ Up ] | Up | up section | 1.2 |
[ >> ] | FastForward | next or up-and-next section | 1.3 |
[Top] | Top | cover (top) of document | |
[Contents] | Contents | table of contents | |
[Index] | Index | concept index | |
[ ? ] | About | this page |