Flashouiller son Dell sous Linux...
Par Sid,
vendredi 4 janvier 2008 à 13:24 :: Logiciel libre
:: lu 4085 fois :: #244
:: rss
:: atom
Read it in english with Google

e truc que j'ai toujours trouvé sympa avec les Dell, c'est qu'ils supportent depuis longtemps les mises à jour de BIOS depuis le système d'exploitation. Enfin... Depuis Windows surtout. Car depuis deux ou trois ans, ils ne distribuent plus leurs nouvelles versions que sous forme d'exécutable à lancer soit directement sous Windows, soit depuis un DOS.
Et donc là, à part se faire une disquette ou un CDROM bootable FreeDOS en y ajoutant le fichier en question, point de salut à l'horizon. Et la solution de la disquette d'avoir presque disparue, dans la mesure où de moins en moins de postes sont livrés avec le lecteur qui va bien. Et c'est le cas de mon D630. Alors bien sûr, je pourrais graver le CD-RW bootable adhoc, mais je me ballade plus souvent avec la batterie que le graveur, ou utiliser une clé USB. Mais j'aimerais bien une solution plus simple, sans recourir à un médium externe...
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.
Commentaires
1. Le vendredi 4 janvier 2008 à 15:28, par Jok
2. Le vendredi 4 janvier 2008 à 16:29, par Ulysse
Réponse de Sid
3. Le vendredi 4 janvier 2008 à 17:28, par Toady
Réponse de Sid
4. Le vendredi 4 janvier 2008 à 19:09, par Toady
5. Le samedi 5 janvier 2008 à 15:19, par Kevin
Réponse de Sid
6. Le lundi 15 septembre 2008 à 09:17, par ph1l
Réponse de Sid
Ajouter un commentaire