Heureusement, Dell ne laisse pas le Linux addict que je suis complètement dans la panade avec une poignée de ressources maison à destination de son OS favori. Et en particulier deux projets qui s'attaquent à mon problème du jour, le flashage de BIOS :

  • BIOSdisk ;
  • libsmbios.

Je vais commencer par le second, non pas parce que c'est le plus prometteur des deux, mais surtout parce que c'est celui qui n'a pas marché pour moi. À ma grande déception d'ailleurs.


Libsmbios est une bibliothèque permettant d'accéder aux informations contenues dans le SMBIOS d'une machine. En outre, elle supporte les spécificités des machines Dell et offre en particulier la possibilité de flasher le BIOS, via le module noyau qui va bien[1]. Enfin, elle est disponible pour la plupart des distributions civilisées, Debian en particulier. Youpi.

La procédure est très bien décrite dans un billet de Cyril Levis. Le premier pas consiste à installer la bibliothèque et les outils qui vont avec. Sous Debian, ça donnera très simplement :

~$ sudo apt-get install libsmbios-bin

Pourvu que le noyau de la machine soit compilé avec le support DELL_RBU, nous avons à présent tout ce qu'il faut pour flasher notre BIOS, à l'exception notable du code à flasher.

Nous devons récupérer la mise à jour qui va bien, sous forme d'un BIOS header comme ils disent, c'est à dire un fichier .hdr. Pour ce faire, nous avons deux solutions. La première, la plus simple, est celle décrite par Cyril. Elle consiste à sortir le numéro d'identification de votre système puis à trouver le fichier qui va bien chez Dell. Pour l'identification, on utilise l'outil getSystemId :

~$ sudo getSystemId
Libsmbios:    0.13.10
System ID:    0x01F9
Service Tag:  XXXXXXX
Express Service Code: XXXXXXXXXXX
Product Name: Latitude D630
BIOS Version: A03
Vendor:       Dell Inc.
Is Dell:      1

La donné qui nous intéresse est le System ID, qui vaut dans mon cas 0x01f9. On va alors faire un tour sur le dépôts de firmwares de Dell pour chercher celui va bien. Il devrait être de la forme :

system_bios_ven_0x1028_dev_$SYSID_version_$VERSION

En l'occurence, il s'agira de system_bios_ven_0x1028_dev_0x01f9_version_a05. Je vais donc dans le répertoire correspondant, et je ramène le fichier bios.hdr. Vous pouvez jeter un coup d'œil au fichier package.ini pour vérifier que vous êtes au bon endroit.

Maintenant, il ne reste plus qu'à charger le driver, si ce n'est pas déjà fait, et flasher le système :

~$ sudo modprobe dell_rbu
~$ sudo dellBiosUpdate -u -f ./bios.hdr

Le nouveau BIOS va être copié dans une zone temporaire et la mise à jour proprement dite interviendra au prochain reboot. J'ai bien écrit reboot, parce qu'il faut rebooter. Pas arrêter puis démarrer le PC, rebooter. Et normallement, ça doit marcher. Sauf que sur mon D630, ça n'a pas marché[2], il me dit que le contenu à flasher ne correspond pas au système cible. Grumpf...

Update (04/07/2008) : le flashage via la libsmbios est passé comme un charme sur la version A12, téléchargée depuis le site, ce qui en fait désormais la méthode la plus pratique.

L'autre solution pour récupérer le .hdr qui va bien consiste à télécharger l'exécutable DOS de mise à jour et d'en extraire le .hdr au moyen d'un outil appelé extract_hdr. Le plus compliqué dans cette méthode, c'est de trouver cet outil. Alors que la documentation le situe dans le package firmware-tools, disponible pour Debian depuis leur repository, il ne s'y trouve est plus[3]. Il se trouve en fait dans un autre package, dell-repo-tools, dont la dernière version semble être le RPM pour Fedora FC8[4].

À partir de là, il suffira d'extraire le .hdr de l'exécutable et de flasher :

~$ extract_hdr -i D630_A05.EXE -o ./
~$ sudo modprobe dell_rbu
~$ sudo dellBiosUpdate -u \
        -f ./system_bios_0x1028_0x01f9_version_a05.hdr

Je n'ai pas essayé cette méthode, donc je ne sais pas si elle marche mieux que la précédente, mais je la trouve en tout cas plus simple à utiliser que de parcourir tout leur répository à la recherche d'une éventuelle mise à jour...


Le second projet, c'est BIOSdisk, qui brille par sa quasi-absence de documentation, à l'exception d'une page de man. Cet outil génère une image de disquette bootable à partir de l'exécutable de mise à jour. C'est certes pratique, mais totalement inutile en ce qui me concerne, puisque je n'ai pas de lecteur de disquette. Je pourrais certes transformer en ISO bootable cette image, mais si je peux me passer de support externe, autant le faire.

Là où BIOSdisk pourrait m'aider par contre, c'est qu'il possède une option mkpkg qui est censée générer un package spécifique à la distribution courante qu'il ne restera plus qu'à installer. Comprendre un RPM ou un DEB. Or, sur ma Debian, je n'obtiens qu'une image Initrd[5], pas un package. Ce n'est pas grave pour autant. Limite je préfère pouvoir gérer ça moi-même, puisqu'il va s'agir de reconfigurer le bootloader, ce que je fais habituellement à la main en utilisant LILO[6].

Il suffit donc de charger l'image Initrd en mémoire. Pour cela, on va utiliser l'image noyau memdisk fournie dans le package syslinux pour booter, puis charger l'image. Pour LILO, ça va nous donner une entrée de ce style dans /etc/lilo.conf :

image=/boot/memdisk
        label=flash
        initrd=/boot/initrd.img-20080104-dellbios

Il ne reste plus qu'à mettre à jour le bootloader :

~$ sudo lilo

Et rebooter sur le label flash pour lancer le mise à jour du firmware. Sous GRUB, l'entrée dans le menu.lst sera du genre :

title flash
kernel /boot/memdisk
initrd /boot/initrd.img-20080104-dellbios


Dans la mesure où les deux techniques évoquées nécessitent de toute manière un redémarrage de la machine, il n'y a pas grande différence à en utiliser une plutôt que l'autre, même si l'utilisation de la libsmbios est clairement plus conforme à ce que Dell entend obtenir. En tout cas, quoi qu'il en soit, l'une comme l'autre permettent de flasher simplement son BIOS sans utiliser de médium externe, disquette ou CDROM, depuis Linux. Et c'est précisément ce à quoi je voulais parvenir.

~$ sudo getSystemId
Libsmbios:    0.13.10
System ID:    0x01F9
Service Tag:  XXXXXXX
Express Service Code: XXXXXXXXXXX
Product Name: Latitude D630
BIOS Version: A05
Vendor:       Dell Inc.
Is Dell:      1

Notes

[1] Option DELL_RBU, disponible depuis la version 2.6.14 du noyau.

[2] Mais pas cristallisé. Heureusement.

[3] Pour autant qu'il y ait déjà été...

[4] Alien est ton ami si tu n'es pas sous RedHat.

[5] Le fichier /tmp/dellbios-20080104/initrd.img-20080104-dellbios en ce qui me concerne.

[6] Cause probable de la non-génération du package, GRUB étant le bootloader par défaut sur Debian.