novembre 2009 Archives

04-11-2009 23:16:22

Pourquoi tant de tftp://255.255.255.255 ?

Les points d'accès Wifi 1232ag livrés avec le bundle CCNP sont configurés en mode Lightweight Access Point. Or, les étudiants du M2 STRI ont besoin d'un point d'accès autonome. En voulant «basculer» le système d'exploitation du point d'accès en mode autonome j'ai perdu une bonne demi-heure avant de m'apercevoir que la requête TFTP émise par le point d'accès utilisait l'adresse de diffusion 255.255.255.255 et que mon serveur TFTP n'était pas en écoute sur cette adresse.

Le point d'accès

La documentation officielle sur la conversion à rebours du mode allégé en mode autonome est détaillée en dix étapes qui consistent à réinitialiser le point d'accès alors qu'il est directement relié par un câble droit avec une machine disposant d'un service TFTP.

On repère le mode de configuration à la console via la version de l'IOS installé.

AP0023.5e13.4ea2#sh ver

Cisco IOS Software, C1200 Software (C1200-RCVK9W8-M), Version 12.3(11)JX1, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2006 by Cisco Systems, Inc.
Compiled Mon 17-Jul-06 11:41 by alnguyen

ROM: Bootstrap program is C1200 boot loader
BOOTLDR: C1200 Boot Loader (C1200-BOOT-M) Version 12.3(2)JA4, RELEASE SOFTWARE (fc1)

AP0023.5e13.4ea2 uptime is 23 minutes
System returned to ROM by power-on
System image file is "flash:/c1200-rcvk9w8-mx/c1200-rcvk9w8-mx"

cisco AIR-LAP1232AG-E-K9   (PowerPC405GP) processor (revision A0) with 15038K/1336K bytes of memory.
Processor board ID FCZ1251Z0DR
PowerPC405GP CPU at 196Mhz, revision number 0x0145
Last reset from power-on
LWAPP image version 3.0.51.0
1 FastEthernet interface

32K bytes of flash-simulated non-volatile configuration memory.
Base ethernet MAC Address: 00:23:5E:13:4E:A2
Part Number                          : 73-8704-14
PCA Assembly Number                  : 800-23211-14
PCA Revision Number                  : A0
PCB Serial Number                    : FOC12482M20
Top Assembly Part Number             : 800-29149-01
Top Assembly Serial Number           : FCZ1251Z0DR
Top Revision Number                  : A0
Product/Model Number                 : AIR-LAP1232AG-E-K9

Configuration register is 0xF

Suivre la procédure donnée dans la documentation ne pose pas de difficulté particulière. Ce qui est déroutant, c'est le message d'erreur obtenu : Premature end of tar file. Cette erreur n'est pas très explicite au regard du problème réel. Le transfert se termine d'autant plus prématurément qu'il n'a jamais débuté !

Xmodem file system is available.
flashfs[0]: 3 files, 2 directories
flashfs[0]: 0 orphaned files, 0 orphaned directories
flashfs[0]: Total bytes: 7741440
flashfs[0]: Bytes used: 1861632
flashfs[0]: Bytes available: 5879808
flashfs[0]: flashfs fsck took 11 seconds.
Reading cookie from flash parameter block...done.
Base ethernet MAC Address: 00:23:5e:13:4e:a2
Initializing ethernet port 0...
Reset ethernet port 0...
Reset done!
ethernet link up, 100 mbps, full-duplex
Ethernet port 0 initialized: link is up
button is pressed, wait for button to be released...
button pressed for 27 seconds
process_config_recovery: set IP address and config to default 10.0.0.1
process_config_recovery: image recovery
image_recovery: Download default IOS tar image tftp://255.255.255.255/c1200-k9w7-tar.default

examining image...
extracting info (274 bytes)
Premature end of tar file
ERROR: Image is not a valid IOS image archive.Loading "flash:/c1200-rcvk9w8-mx/c1200-rcvk9w8-mx"...##

Le service TFTP

À quelques jours d'intervalle, je venais juste de publier une révision de la section Échanges avec le protocole TFTP de l'article Gestion des équipements réseau avec GNU/Linux. Cette révision était motivée par la prise en charge de la configuration du paquet tftpd-hpa via un jeu de (menus|écrans) debconf.

$ dpkg -l tftpd-hpa | grep ^ii
ii  tftpd-hpa           5.0-7           HPA's tftp server

Parmi ces menus, on trouve celui relatif à l'adresse sur laquelle le service est en écoute. Cette adresse est définie à la valeur 0.0.0.0:69 et ne correspond pas à l'adresse de diffusion 255.255.255.255.

Le résumé de la configuration du paquet est donné par le fichier /etc/default/tftpd-hpa.

$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa

## The configuration of this file is managed by debconf as long
## as a line beginning with the '#DEBCONF#' token is included.
##
## Do not edit this file manually, use:
## dpkg-reconfigure tftpd-hpa

#DEBCONF#

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"

Dans le contexte particulier de la mise à jour système du point d'accès, il est nécessaire de redéfinir l'adresse d'écoute du service en 255.255.255.255.

Après exécution de la commande # dpkg-reconfigure tftpd-hpa, on obtient :

$ cat /etc/default/tftpd-hpa | grep ADDRESS
TFTP_ADDRESS="255.255.255.255"

Au prix de cette reconfiguration, le service TFTP pourra traiter la requête du point d'accès.

flashfs[0]: 3 files, 2 directories
flashfs[0]: 0 orphaned files, 0 orphaned directories
flashfs[0]: Total bytes: 7741440
flashfs[0]: Bytes used: 1861632
flashfs[0]: Bytes available: 5879808
flashfs[0]: flashfs fsck took 11 seconds.
Reading cookie from flash parameter block...done.
Base ethernet MAC Address: 00:23:5e:13:4e:a2
Initializing ethernet port 0...
Reset ethernet port 0...
Reset done!
ethernet link up, 100 mbps, full-duplex
Ethernet port 0 initialized: link is up
button is pressed, wait for button to be released...
button pressed for 23 seconds
process_config_recovery: set IP address and config to default 10.0.0.1
process_config_recovery: image recovery
image_recovery: Download default IOS tar image tftp://255.255.255.255/c1200-k9w7-tar.default

examining image...
extracting info (274 bytes)
Image info:
Version Suffix: k9w7-.123-8.JED
Image Name: c1200-k9w7-mx.123-8.JED
Version Directory: c1200-k9w7-mx.123-8.JED
Ios Image Size: 4342272
Total Image Size: 5079552
Image Feature: WIRELESS LAN
Image Family: C1200
Wireless Switch Management Version: 1.0
Extracting files...
extracting info (274 bytes)
c1200-k9w7-mx.123-8.JED/ (directory) 0 (bytes)
c1200-k9w7-mx.123-8.JED/html/ (directory) 0 (bytes)
c1200-k9w7-mx.123-8.JED/html/level/ (directory) 0 (bytes)
c1200-k9w7-mx.123-8.JED/html/level/1/ (direc

<snipped/>

Deleting current version...
Deleting flash:/c1200-rcvk9w8-mx...done.
New software image installed in flash:/c1200-k9w7-mx.123-8.JED
Configuring system to use new image...done.
Requested system reload in progress...download took about 289 seconds
Loading "flash:/c1200-k9w7-mx.123-8.JED/c1200-k9w7-mx.123-8.JED"...###

Pour conclure

Voilà des années que l'on est habitué à voir ces requêtes TFTP à destination de l'adresse All-Ones et que l'on cherche à s'en débarrasser à toute force. Le jour où on est contraint de l'utiliser, on ne réagit même pas au fait que le service n'est pas configuré correctement. Bref, je devrais certainement compléter la documentation avec cet exemple.

Ce billet est disponible en version imprimable au format PDF : tftpd-hpa-allones.pdf.

$Id: tftpd-hpa-allones.xml 1432 2009-11-04 22:05:26Z latu $

02-11-2009 21:10:43

Nouveau shell GRUB sur clé USB

Dans la série sur les turpitudes de la gestion d'amorçage d'un système d'exploitation, voici un billet sur la trousse à outils de secours ultime : l'installation de grub(2) sur clé USB et l'utilisation de son shell spécifique. Après avoir vanté les mérites du vieux gestionnaire d'amorce LILO, voici le temps de la découverte des avantages du gestionnaire de nouvelle génération : GRUB.

Contexte GRUB sur Debian GNU/Linux

À l'heure de la rédaction de ce billet, GRUB est en cours de transition entre une version «historique» fournie avec le paquet grub-legacy et une version plus actuelle distribuée via plusieurs paquets : grub-common et grub-pc.

Attention ! Il n'est pas question ici de promouvoir cette nouvelle version. La transition entre les deux versions n'est pas achevée et j'ai trois ou quatre machines sur lesquelles la migration n'a pas fonctionné comme prévu. Dans ce genre de cas, la version de GRUB correspondant au paquet grub-legacy ayant largement fait ses preuves, le passage à un nouveau gestionnaire d'amorce n'est pas justifié.

En revanche, j'ai découvert presque par hasard que le shell de la nouvelle version possède des fonctions dites auto completion particulièrement séduisantes lorsque la gestion d'amorçage est dans un état calamiteux. Ces mêmes fonctions utilisées via un dispositif de stockage externe tel qu'une clé USB deviennent indispensables pour amorcer un système d'exploitation sur une machine dont le partitionnement et les versions de noyaux disponibles sont inconnus.

Installation de GRUB sur clé USB

Cette section relève du plagiat éhonté puisque ce type d'installation a déjà été maintes fois présenté sur la toile. Voici tout de même la liste des instructions d'installation.

Dans cet exemple, le disque dur du transportable M6300 est référencé /dev/sda et la clé USB /dev/sdb. Ses caractéristiques se retrouvent dans les messages système après connexion.

usb 1-4: new high speed USB device using ehci_hcd and address 3
usb 1-4: New USB device found, idVendor=090c, idProduct=1000
usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-4: Product: USB Flash Disk
usb 1-4: Manufacturer: General
usb 1-4: SerialNumber: AA08061700013029
usb 1-4: configuration #1 chosen from 1 choice
Initializing USB Mass Storage driver...
scsi5 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 3
usb-storage: waiting for device to settle before scanning
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usb-storage: device scan complete
scsi 5:0:0:0: Direct-Access     General  USB Flash Disk   1100 PQ: 0 ANSI: 0 CCS
sd 5:0:0:0: Attached scsi generic sg2 type 0
sd 5:0:0:0: [sdb] 3917824 512-byte logical blocks: (2.00 GB/1.86 GiB)
sd 5:0:0:0: [sdb] Write Protect is off
sd 5:0:0:0: [sdb] Mode Sense: 43 00 00 00
sd 5:0:0:0: [sdb] Assuming drive cache: write through
sd 5:0:0:0: [sdb] Assuming drive cache: write through
sdb: sdb1
sd 5:0:0:0: [sdb] Assuming drive cache: write through
sd 5:0:0:0: [sdb] Attached SCSI removable disk
  • La première opération consiste à créer une partition unique bootable sur la clé USB et à formater cette partition avec un système de fichier FAT32. De cette façon, le BIOS de la machine reconnaîtra un périphérique de stockage utilisable pour amorcer un système d'exploitation.

    Pour cette opération, on utilise l'outil de partitionnement parted qui permet de faire tous les traitements requis.

    # parted /dev/sdb
    GNU Parted 1.8.8.git-dirty
    Using /dev/sdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) rm 1
    (parted) print
    Model: General USB Flash Disk (scsi)
    Disk /dev/sdb: 2006MB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start  End  Size  Type  File system  Flags
    
    (parted) mkpart primary 1MB 2006
    (parted) mkfs 1 fat32
    Warning: The existing file system will be destroyed and all data on the 
             partition will be lost. Do you want to continue?
    parted: invalid token: 1
    Yes/No? Yes
    Partition number? 1
    File system type?  [ext2]? fat32
    (parted) toggle 1 boot
    (parted) quit
    Information: You may need to update /etc/fstab.
    

    On note que la capacité exacte de la clé USB donnée par la commande print est utilisée pour créer la partition avec la commande mkpart.

  • La seconde opération consiste à installer GRUB sur le système de fichiers créé précédemment. On utilise la version courante des paquets installé sur le transportable.

    # dpkg -l grub* | grep ^ii
    ii  grub         0.97-59    GRand Unified Bootloader (dummy package)
    ii  grub-common  1.97-1     GRand Unified Bootloader, version 2 (common files)
    ii  grub-pc      1.97-1     GRand Unified Bootloader, version 2 (PC/BIOS version)
    

    Après avoir créé le répertoire d'installation de GRUB, on copie l'ensemble des modules disponibles de façon à pouvoir traiter le maximum de configurations différentes possibles.

    # mount /dev/sdb1 /mnt
    # mkdir -p /mnt/boot/grub
    # cp /usr/lib/grub/i386-pc/* /mnt/boot/grub/
    

    On créé une carte minimale des périphériques de stockage disponibles avant de lancer l'installation du gestionnaire d'amorce.

    # echo '(hd0) /dev/sdb' > /mnt/boot/grub/device.map
    # grub-install --root-directory=/mnt /dev/sdb
    Installation finished. No error reported.
    This is the contents of the device map /mnt/boot/grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-run the script `grub-install'.
    
    (hd0) /dev/sdb
    

Ces deux étapes accomplies, la phase d'installation est achevée et on peut passer à l'exploitation du gestionnaire d'amorçage GRUB à partir d'une clé USB.

Utilisation du shell GRUB

Dans cette section, on utilise la séquence d'initialisation du transportable M6300 pour illustrer les fonctions du shell GRUB à l'aide de clichés de qualité remarquable pris avec un téléphone mobile.

On commence par la sélection du périphérique de démarrage. Sur le transportable, la touche F12 permet de choisir la clé USB. Sur un poste fixe, il faut utiliser les menus du BIOS pour désigner le premier périphérique de stockage utilisé pour lancer un système d'exploitation.

Une fois que l'invite de commande du shell GRUB est disponible, la première opération à réaliser consiste à choisir la racine du gestionnaire d'amorçage à l'aide de la commande root.

  • La commande root, utilisée sans paramètre, renvoie la racine en cours d'utilisation. Dans la vue ci-dessous, on reconnaît l'identification du système de fichier de la clé USB que l'on formaté en FAT32.

    (hd0,1): Filesystem is fat
    
  • La même commande utilisée avec un autre périphérique de stockage en paramètre sert à désigner une nouvelle racine à partir de laquelle on va pouvoir choisir le noyau à utiliser. Ici, on désigne le disque dur du transportable et sa première partition. Le message renvoyé indique que le système de fichiers a bien été reconnu et que l'on peut le parcourir à partir du shell. C'est justement la fonction qui nous intéresse !

Pour choisir le noyau Linux à utiliser pour le lancement du système d'exploitation, on dispose de deux commandes du shell : linux et initrd. La commande linux sert à désigner le fichier contenant la partie monolithique du noyau. Généralement, ce fichier est baptisé vmlinuz-*. La commande initrd sert elle aussi à désigner un fichier. Il s'agit cette fois ci de l'initial ramdisk qui contient une pseudo arborescence racine du système d'exploitation dans laquelle on trouve un shell minimal (BusyBox), un ensemble d'outils et les modules du noyau.

Pour chaque utilisation des commandes linux et initrd, le shell GRUB renvoie un message de confirmation. Dans le cliché ci-dessous, on utilisé la touche de tabulation pour obtenir la liste des fichiers disponibles.

Une fois les deux fichiers du noyau choisis, il ne reste plus qu'à utiliser la commande boot pour lancer le système d'exploitation normalement ou presque ... Lors de l'utilisation de la commande linux j'ai malencontreusement oublié de préciser la véritable racine du système d'exploitation. En fait, cet oubli était volontaire. Il permet de montrer comment identifier les volumes logiques disponibles à partir du shell BusyBox fourni via initrd.

Comme précisé plus haut, l'arborescence contenue dans le fichier initrd contient un certain nombre d'outils, dont ceux nécessaires à la gestion de volumes logiques. Dans le scénario de découverte d'une machine inconnue, on peut activer tous les volumes disponibles à l'aide de la commande vgchange -a y. On identifie ainsi le volume correspondant à la fameuse racine du système d'exploitation.

Une fois l'identification faite, il est possible de relancer le système à l'aide de la commande reboot et de reprendre les étapes précédentes en précisant le paramètre root=/dev/mapper/Amethyste-root à la commande linux. Et cette fois-ci, le système d'exploitation pourra se lancer normalement.

Quelques commandes utiles

Avec la version de GRUB utilisée, le shell est essentiellement modulaire. Qu'il s'agisse de ses propres fonctionnalités comme la commande ls ou du support des systèmes de fichiers nécessaires au lancement d'un système d'exploitation, tout est disponible sous forme de modules.

Il n'est pas question ici de reprendre la documentation officielle sur les commandes que l'on trouve à l'adresse http://grub.enbug.org/. Simplement, voici quelques exemples de commandes et de syntaxe utiles pour la rédaction de ce billet.

lsmod, insmod

Ces deux commandes permettent de lister et charger des modules en mémoire. On peut citer l'exemple du module raid qui permet de reconnaître les système de fichiers sur des partitions RAID logicielles.

root

Cette commande est utilisable soit pour consulter la racine du système d'amorçage reconnu soit pour désigner une nouvelle racine. Cette racine est fonction de carte établie lors de l'installation de GRUB sur le système. Cette carte est stockée dans le fichier /boot/grub/device.map. Quantité d'erreurs rapportées sur les forums de la toile sont relatives à un changement de référence sur la liste des périphériques de stockage contenue dans ce fichier. Il est essentiel que cette carte et le paramétrage des menus soient cohérents.

Dans le cas du transportable, on dispose des informations suivantes :

$ cat /boot/grub/device.map
(hd0)   /dev/sda

$ grep -3 hd0 /boot/grub/grub.cfg                                 

### BEGIN /etc/grub.d/05_debian_theme ###
insmod ext2                              
set root=(hd0,1)
search --no-floppy --fs-uuid --set 171f0aff-232a-4dc4-a4bc-b9f2ff2f6757
insmod png                                                             
if background_image /grub/moreblue-orbit-grub.png ; then
--
### BEGIN /etc/grub.d/10_linux ###
menuentry "Debian GNU/Linux, with Linux 2.6.31.5" {
        insmod ext2
        set root=(hd0,1)
        search --no-floppy --fs-uuid --set 171f0aff-232a-4dc4-a4bc-b9f2ff2f6757
        linux   /vmlinuz-2.6.31.5 root=/dev/mapper/Amethyste-root ro
        initrd  /initrd.img-2.6.31.5
}
linux

Cette commande désigne le fichier image de la partie monolithique du noyau ainsi que ses paramètres d'initialisation tels que la racine du système d'exploitation. Les paramètres de lancement du noyau Linux sont documentés dans le fichier kernel-parameters.txt fourni avec ses sources. Comme dans le cas de la commande root de GRUB, le fichier /boot/grub/grub.cfg donne un bon exemple avec la syntaxe des deux paramètres importants :

linux   /vmlinuz-2.6.31.5 root=/dev/mapper/Amethyste-root ro
  • Le paramètre root indique la racine du système d'exploitation à partir de laquelle le processus init est lancé.

  • Le paramètre ro précise que cette racine doit être montée en lecture seule (read only) durant le lancement du système.

Si aucun paramètre n'est fourni, l'initialisation du système s'arrête au niveau du shell BusyBox.

initrd

Cette commande simple désigne le fichier image de l'arborescence de chargement des modules du noyau Linux. En plus de la mise à disposition des modules, cette arborescence fournit un ensemble minimum d'outils. Ces outils peuvent être utilisés pour identifier les points de montage des différents périphériques de stockage.

initrd  /initrd.img-2.6.31.5

Pour conclure

Si vous êtes parvenu jusqu'à la lecture de ces lignes, vous serez peut-être moins intimidé par ce terrible monstre qu'est le gestionnaire d'amorce ! Il faut dire que dans le contexte d'exploitation professionnelle, ces manipulations se font dans des conditions de stress très importantes. Si un système ne se lance plus normalement, c'est que l'on est face à un problème sérieux.

Disposer d'un gestionnaire d'amorce sur périphérique externe comme une clé USB peut être déterminant dans ces situations critiques.

Enfin, c'est l'occasion de recycler une superbe clé USB Canal+ qui aurait été totalement inutile autrement ! Vous l'aurez constaté, je n'ai aucun goût pour les goodies.

Ce document est disponible en version imprimable au format PDF : grub-usb.pdf.

$Id: grub-usb.xml 1430 2009-11-02 22:39:06Z latu $