Structure de la mémoire

Avant de se lancer dans l'installation d'un nouveau firmware sur le WRT54G, il n'est pas mauvais d'avoir une petite idée de la structure de la mémoire contenue dans cette bestiole.

Le WRT54G comporte deux types de mémoire :

  1. une mémoire RAM, mémoire vive du système, dans laquelle tourne le système d'exploitation. Ce n'est pas à cette mémoire que nous nous intéresserons dans cet article.
  2. une mémoire flash, qui est subdivisée en différentes parties, contenant :
    • Le bootloader du système. C'est un micro-logiciel dont le but est de charger et de lancer le système d'exploitation (firmware) proprement dit. Il est en quelque sorte analogue à LILO ou grub sur un système PC/Linux, ou à d'autres outils équivalents que l'on peut trouver sur d'autres architectures.
      • Le bootloader du WRT54G s'apelle PMON sur les versions les plus anciennes, et CFE sur les versions plus récentes.
      • Lorsque nous chargerons un nouveau firmware sur le WRT54G, cette opération n'affectera normalement pas la partie de la mémoire flash qui contient le bootloader. Si jamais il était affecté, nous aurions alors de gros problèmes[1].
      • Outre sa fonction principale, qui est de lancer le système d'exploitation, le bootloader du WRT54G a d'autres caractéristiques essentielles qui nous serviront bien :
        • S'il ne parvient pas à lancer de firmware (parce que ce dernier est absent ou endommagé, par exemple...), le bootloader démarre un serveur TFTP incorporé, serveur qui permet de télécharger un nouveau firmware dans le WRT54G.
        • De plus, même si le firmware est installé, il est possible (via l'activation d'un flag appelé boot_wait) de demander au bootloader d'activer dans tous les cas son serveur TFTP lors du boot, pour une durée de 5 secondes, avant de démarrer le système d'exploitation proprement dit.
        • Pour remplacer le firmware du WRT54G, nous userons et abuserons de cette possibilité, car c'est encore la meilleure manière de procéder.
      • La partie de la mémoire flash qui contient le bootloader contient également une copie des paramètres usine essentiels du routeur, notamment son adresse MAC. C'est cette copie des paramètres usine qui est réinstallée dans la NVRAM quand la configuration du routeur est entièrement réinitialisée, ce que nous ferons après avoir remplacé le firmware.
    • Le système d'exploitation, c'est-à-dire le firmware à proprement parler, basé sur GNU/Linux. C'est ce firmware que nous allons donc remplacer.
    • Le ''système de fichiers racine'' ou root filesystem. Il est en lecture seule. Nous n'avons pas à nous en préoccuper ici, mentionnons simplement qu'il sera mis à jour en même temps que le firmware.
    • La NVRAM, ou plutôt une émulation de NVRAM. J'explique :
      • Sur les PC traditionnels, on trouve une NVRAM, qui est une petite mémoire généralement basée sur la technologie CMOS, et qui consomme très peu d'électricité pour conserver son contenu. Cette petite mémoire est alimentée par une pile qui dure généralement des années. Sur les PC, cette petite mémoire conserve essentiellement les paramètres du BIOS, que l'on peut régler via un utilitaire spécifique que l'on charge généralement en appuyant sur une touche du clavier (bien souvent [Suppr]) au moment du démarrage du système.
      • Le WRT54G ne possède pas de puce de NVRAM, mais sa fonction est émulée dans une partie de la mémoire flash, qui est capable de conserver son contenu sans alimentation électrique. Quand, dans cette article, on parlera de NVRAM, on parlera donc en fait de la partie de la mémoire flash qui émule le fonctionnement d'une NVRAM.
      • La NVRAM du WRT54G est particulièrement importante, car elle conserve l'ensemble des paramètres de fonctionnement du routeur, tels qu'ils sont réglés par l'utilisateur au moyen de l'interface d'administration.
    • Enfin, certains firmwares améliorés, comme DD-WRT ou OpenWRT, permettent, si la taille de la mémoire flash l'autorise, de créer également dans celle-ci un système de fichiers supplémentaire, fonctionnant en lecture-écriture, et utilisant le filesystem j2ffs. En pratique, les WRT54G n'ont cependant pas assez de mémoire flash pour y loger un tel filesystem, que l'on ne pourra réellement exploiter que sur la série WRT54GS (voir plus bas). Ce filesystem peut être très utile à ceux qui voudraient installer sur leur WRT54GS des applications supplémentaires.

Taille de la mémoire

Typiquement, les WRT54G disposent de 16 Mo de mémoire RAM et de 4 Mo de mémoire flash, tandis que les WRT54GS disposent du double (32 Mo de RAM et 8 Mo de flash).

Les WRT54G sont parfaitement adaptés à la plupart des usages, sauf si l'on a la nécessité d'installer un filesystem supplémentaire en mémoire flash, auquel cas on choisira un WRT54GS, modèle dont la mémoire flash plus grande permet de bénéficier de cette fonctionnalité.

Attention cependant : Ceci dépend de la version hardware du routeur, car les toutes dernières versions sorties à ce jour ont vu leur capacité mémoire divisée par 2 ![2]

En particulier :

  • Le WRT54G version 5 ne possède que 8 Mo de RAM et 2 Mo de flash. Ce modèle n'est pas utilisable avec des firmwares de remplacement.
  • Le WRT54GS version 4 ne possède que 16 Mo de RAM et 4 Mo de flash. Il est utilisable avec des firmwares de remplacement, mais, du fait de sa mémoire réduite à la mémoire "normale" d'un WRT54G, il ne présente guère d'intérêt pour nous. A éviter donc.
  • Le WRT54GS version 5 ne possède que 16 Mo de RAM et 2 Mo de flash. Ce modèle n'est probablement pas utilisable avec des firmwares de remplacement
  • Tous les modèles plus anciens ont la capacité mémoire "classique" décrite au début de ce paragraphe, et ne posent donc pas de problème de ce point de vue.

Voici par exemple comment se présente la taille des différentes partie de la mémoire flash sur l'un de mes WRT54G:

~ # cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00010000 "pmon"
mtd1: 003b0000 00010000 "linux"
mtd2: 002c4a8b 00010000 "rootfs"
mtd3: 00010000 00010000 "nvram"
mtd4: 00050000 00010000 "ddwrt"

Tailles converties en décimal:

mtd0: 262144	256 Ko	pmon
mtd1: 3866624	3,68 Mo	linux
mtd2: 2902667	2,76 Mo	rootfs
mtd3: 65536	64 Ko	nvram
mtd4: 327680	320 Ko	ddwrt

Visualisation du contenu de la NVRAM

En mode console (connexion telnet ou SSH par exemple) le contenu de la mémoire NVRAM d'un WRT54G peut être listé par la commande :

# nvram show

Pour obtenir la valeur d'un seul des paramètres de la NVRAM, on utilisera la fonction nvget de la commande à tout faire wl[3], avec le nom du paramètre désiré. Par exemple, pour obtenir la valeur du paramètre ''boot_wait', on utilisera:

# wl nvget boot_wait
on

Réglage des paramètres de la NVRAM

La plupart des paramètres de la NVRAM se règlent habituellement via l'interface d'administration du routeur.
Il est toutefois possible de régler un paramètre à la main, en utilisant la fonction nvset de la commande à tout faire wl.

Le format est le suivant : wl nvset param="valeur". Par exemple, pour régler le paramètre boot_wait sur "on", on taperait:

# wl nvset boot_wait="on"

Les réglages ainsi entrés dans la nvram ne sont véritablement enregistrés qu'en tapant ensuite la commande:

# nvram commit

...qui effectue l'enregistrement effectif des paramètres de la NVRAM dans la mémoire flash.
A défaut d'effectuer le nvram commit, les paramètres de NVRAM qui auront été modifiés seront perdus lors du prochain reboot.
Il est donc important d'y penser à chaque fois que l'on modifie à la main des paramètres de la NVRAM.

Réglage du paramètre boot_wait

Comme nous l'avons brièvement expliqué plus haut, le paramètre boot_wait permet de demander au bootloader d'attendre pendant 5 secondes le chargement (éventuel) d'un nouveau firmware par TFTP avant de lancer le système d'exploitation proprement dit.
Ce paramètre est donc essentiel à deux titres :

  • Parce que c'est par la méthode TFTP que nous remplacerons le firmware d'origine par un firmware modifié
  • Parce que la méthode TFTP peut nous sortir d'un gros problème si quelque chose se passe mal après la mise à jour du firmware.

Sur la plupart des firmwares améliorés, le flag boot_wait peut être directement réglé dans l'interface d'administration. Toutefois, tant que vous avez sur votre WRT54G le firmware d'origine Linksys, vous ne disposez pas de cette fonctionalité.

Voici une astuce qui permet de régler le flag boot_wait sur un WRT54G encore équipé de son firmware d'origine[4] ; j'ai utilisé ceci avec succès sur un WRT54G v.2 avec Firmware d'origine Linksys v2.02.7 :

  • L'interface Internet DOIT avoir une adresse IP valide. Elle n'est pas forcée d'être connectée, SAUF si cette adresse est obtenue par DHCP. Vous pouvez définir une adresse bidon pour les besoins de la cause.
  • Appeler la fenêtre de ping (Administration / Diagnostics / Ping)
  • Entrer les commandes suivantes exactement telles quelles dans la zone de saisie de l'adresse IP à pinguer:
;cp${IFS}*/*/nvram${IFS}/tmp/n
;*/n${IFS}set${IFS}boot_wait=on
;*/n${IFS}commit
;*/n${IFS}show>tmp/ping.log

Les première commandes ne répondent rien ; la dernière doit lister le (long) conteu des paramètres de la NVRAM, parmi lesquels vous devrez trouver :
"boot_wait=on" => Ca a marché !

Effacement de la NVRAM - Reset du routeur à l'état "usine"

Il y a des situations où il peut être nécessaire d'effacer complètement les paramètres présents en NVRAM, et de les remettre à l'état usine (factory reset)[5].
Il est en particulier nécessaire de la faire après avoir remplacé le type de firmware qui équipe le routeur[6].

On peut procéder, au moins, de trois manières différentes :

  • Via l'interface web : La plupart des firmwares pour WRT54G, d'origine ou de substitution, coportent une option ad hoc dans leur interface d'administration.
  • Via le bouton RESET situé au dos de l'appareil. Enfoncer et garder enfoncé ce bouton pendant au moins 20 secondes. Au bout d'un certain temps, le voyant Power se met à clignoter : le routeur reboote et restaure ses paramètres à l'état usine[7] [8]
  • En tapant, en ligne de commande (console telnet ou SSH), la commande suivante :
# mtd erase nvram[9]

Voilà, ça sera tout pour aujourd'hui. A suivre...

Notes

[1] Le WRT54g serait alors "transformé en brique" (bricked) et serait totalement inutilisable tant qu'il n'aurait pas été "débriqué" (debricked), question que je traiterai probablement dans un prochain article.

[2] C'est vraiment stupide, hein ?

[3] Cette commande contrôle l'accès à pratiquement toutes les fonctions spécifiques du WRT54G. Pour connaître la liste complète des fonctions qu'elle gère, taper, sur un WRT54G en mode console, la commande : "wl -h".

[4] Astuce tirée de http://openwrt.org/OpenWrtDocs/Installing

[5] Notez que ceci ne remet pas en place le firmware d'origine, mais seulement les paramètres de la NVRAM

[6] Nécessaire, par exemple, quand on passe d'un firmware d'origine Linksys à un firmware non-Linksys, mais ce n'est par contre le plus souvent pas nécessaire quand on upgrade entre deux versions successives du même firmware

[7] J'ai lu ici ou là qu'il faut attendre que le routeur ait fini de rebooter (que le voyant Power ait fini de clignoter) avant de relâcher le bouton RESET. Ca ne me paraît pas très logique, il me semblerait plus logique de penser que les paramètres sont effacés juste avant que le routeur ne reboote... Dans le doute, je le garde enfoncé jusqu'à la fin du reboot. Précisions et commentaires bienvenus ;-)

[8] Cette méthode ne fonctionne que si le démon resetbuttond est actif sur le routeur, c'est généralement le cas sauf s'il a été désactivé via l'interface d'administration, ou, bien évidemment, si le firmware est planté...

[9] Cette commande est sans danger sur les WRT54G, mais a été rapportée comme dangereuse sur certains routeurs compatibles d'autres marques, qui peuvent utiliser les mêmes firmwares (notamment DD-WRT), mais sur lesquels il ne faut surtout pas utiliser cette commande sous peine de briquage en profondeur. Soyez prudents ;-)