Table des matières

HP control/update UEFI bios depuis Linux

En remplaçant mes serveurs ESXi par du Proxmox, j'ai eu l’opportunité de remplacer les I7 3700 par des ProDesk 600 G1 SFF; pas de grosses machines, mais très économique et peu énergivore. Mais voilà, les outils de supervision bios d'HP ne fonctionnent que sous Windows… Proxmox est basé sur Debian, donc une mise à jour UEFI demande de passer par une clé usb, un clavier, un écran; et il faut refaire l'opération pour toutes les machines… très peu pour moi.

Linux vs Windows

Depuis quelques temps déjà, il existe un service LVFS (Linux Vendor Firmware Service) qui reprends les firmwares des grands constructeurs utilisable via l'outils fwupdmgr; on y trouve Lenovo, Dell, HP, mais aussi 8BitDo, Asus, Gigabyte, Logitech, MSI, SteelSeries, Corsair, etc…

Vous pouvez installer l’outil via la commande suivante:

root@pve02:~# apt install -y fwupd

On peut identifier presque tout le matériel avec cet outil:

root@pve02:~# fwupdmgr get-devices
WARNING: UEFI capsule updates not available or enabled in firmware setup
See https://github.com/fwupd/fwupd/wiki/PluginFlag:capsules-unsupported for more information.
Hewlett-Packard HP ProDesk 600 G1 SFF

├─82576 Gigabit Network Connection (Gigabit ET Dual Port Server Adapter):
│     Device ID:          5987c136e0024e0f45943927a31c5c4c711f3eb0
│     Current version:    01
│     Vendor:             Intel Corporation (PCI:0x8086)
│     GUIDs:              9d1fb2d0-98fd-5d3c-a2d8-e81fbabc1848 ← PCI\VEN_8086&DEV_10C9
│                         429919bc-c780-52db-a8c9-8b4e78c27f57 ← PCI\VEN_8086&DEV_10C9&REV_01
│                         eee468fd-8ffa-5c24-9f25-718ee3d24661 ← PCI\VEN_8086&DEV_10C9&SUBSYS_8086A03C
│                         2ab2bd4f-94ca-55e3-8083-cdef99661bd5 ← PCI\VEN_8086&DEV_10C9&SUBSYS_8086A03C&REV_01
│                         1fe53468-13ce-5fb5-9450-fdc61c1acae4 ← PCI\VEN_8086&DEV_8C12
│                         5dfe6cfa-c34a-525e-a6b0-66b98be62889 ← PCI\VEN_8086&DEV_8C12&REV_D4
│                         ae4adb37-e961-51a0-adac-327829c24c93 ← PCI\VEN_8086&DEV_8C12&SUBSYS_103C18E7
│                         200affc8-c9ad-587a-ace3-f999b615a42d ← PCI\VEN_8086&DEV_8C12&SUBSYS_103C18E7&REV_D4
│     Device Flags:       • Internal device
│                         • Cryptographic hash verification is available

├─82576 Gigabit Network Connection (Gigabit ET Dual Port Server Adapter):
│     Device ID:          b640caac3e7ebce3633ffc8d0f718061d1f11812
│     Current version:    01
│     Vendor:             Intel Corporation (PCI:0x8086)
│     GUIDs:              9d1fb2d0-98fd-5d3c-a2d8-e81fbabc1848 ← PCI\VEN_8086&DEV_10C9
│                         429919bc-c780-52db-a8c9-8b4e78c27f57 ← PCI\VEN_8086&DEV_10C9&REV_01
│                         eee468fd-8ffa-5c24-9f25-718ee3d24661 ← PCI\VEN_8086&DEV_10C9&SUBSYS_8086A03C
│                         2ab2bd4f-94ca-55e3-8083-cdef99661bd5 ← PCI\VEN_8086&DEV_10C9&SUBSYS_8086A03C&REV_01
│                         1fe53468-13ce-5fb5-9450-fdc61c1acae4 ← PCI\VEN_8086&DEV_8C12
│                         5dfe6cfa-c34a-525e-a6b0-66b98be62889 ← PCI\VEN_8086&DEV_8C12&REV_D4
│                         ae4adb37-e961-51a0-adac-327829c24c93 ← PCI\VEN_8086&DEV_8C12&SUBSYS_103C18E7
│                         200affc8-c9ad-587a-ace3-f999b615a42d ← PCI\VEN_8086&DEV_8C12&SUBSYS_103C18E7&REV_D4
│     Device Flags:       • Internal device
│                         • Cryptographic hash verification is available
:

Malheureusement, les ProDesk 600 G1 ne font pas partie de la liste gérée par LVFS; il faudra ruser un peu.

root@pve02:~# fwupdmgr refresh
WARNING: UEFI capsule updates not available or enabled in firmware setup
See https://github.com/fwupd/fwupd/wiki/PluginFlag:capsules-unsupported for more information.
Updating lvfs
Downloading…             [***********************************    ]
Successfully downloaded new metadata: 0 local devices supported

Identification du matériel

Je vais devoir me passer des services de fwupdmgr et donc ne pas l'installer sur ma production, heureusement pour identifier le matériel, nous avons d'autres options:

root@pve02:~# /usr/sbin/dmidecode | grep "Product Name"
       Product Name: HP ProDesk 600 G1 SFF
        Product Name: 18E7

Si vous êtes curieux, cet outil fournis beaucoup d'informations… mais c'est très complet.

Installation des outils HP

Nous allons nous rabattre sur les outils fournis par HP pour controler nos ProDesk 600; ceux-ci sont accessble via la page HP Flash and Replicated Setup Utilities for Linux.

Ce fichier contient 2 composants importants : hpuefi-mod et hp-flash, le premier est un module, le second un outils pour flasher le bios, il y a aussi des utilitaires pour répliquer la configuration hp-repsetup.

Il faut également préparer le host pour compiler des modules kernel:

Debian Hosts

root@deb-host:~# apt install -y build-essential linux-headers-$(uname -r)

Proxmox Hosts

root@pve-host:~# apt install -y build-essential pve-headers-$(uname -r)

Sur la page de HP on récupère le lien de téléchargement (dans mon cas, c'est le sp150953.tgz), et on le décompresse :

root@pve-host:~# wget https://ftp.hp.com/pub/softpaq/sp150501-151000/sp150953.tgz
--2024-08-09 23:46:43--  https://ftp.hp.com/pub/softpaq/sp150501-151000/sp150953.tgz
Resolving ftp.hp.com (ftp.hp.com)... 23.61.4.71, 2a02:a000:1:38e::a82, 2a02:a000:1:38a::a82
Connecting to ftp.hp.com (ftp.hp.com)|23.61.4.71|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 502203 (490K) [text/plain]
Saving to: ‘sp150953.tgz'

sp150953.tgz
100%[===============================================================>] 490.43K  --.-KB/s    in 0.01s   

2024-08-09 23:46:44 (17.41 MB/s) - ‘sp150953.tgz’ saved [502203/502203]
root@pve-host:~# tar xzf sp150953.tgz

comme nous sommes sous Debian, il faudra compiler a partir des sources non-rpms:

root@pve-host:~# cd non-rpms
root@pve-host:non-rpms# tar xzf hpuefi-mod-VER.tgz
root@pve-host:non-rpms# mv hpuefi-mod-x.xx hpuefi
root@pve-host:non-rpms# cd hpuefi

Il nous faut compiler le module:

root@pve-host:non-rpms/hpuefi# make
make -C /lib/modules/6.8.8-4-pve/build M=/root/hpfwtools/non-rpms/hpuefi-mod-3.05 modules
make[1]: Entering directory '/usr/src/linux-headers-6.8.8-4-pve'
  CC [M]  /root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.o
/root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.c:104:14: warning: no previous prototype for ‘DoSwSmi’ [-Wmissing-prototypes]
  104 | unsigned int DoSwSmi(const unsigned short AxFunction, const unsigned short DxSmiCmdPort, const unsigned int EdiBufferPhysicalAddress)
      |              ^~~~~~~
/root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.c:134:6: warning: no previous prototype for ‘SetPhysBuffer’ [-Wmissing-prototypes]
  134 | void SetPhysBuffer(const unsigned int PhysicalAddress) {
      |      ^~~~~~~~~~~~~
  MODPOST /root/hpfwtools/non-rpms/hpuefi-mod-3.05/Module.symvers
  CC [M]  /root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.mod.o
  LD [M]  /root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.ko
  BTF [M] /root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.ko
Skipping BTF generation for /root/hpfwtools/non-rpms/hpuefi-mod-3.05/hpuefi.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-6.8.8-4-pve'

et installer le module:

root@pve-host:non-rpms/hpuefi# sudo make install
install -D -m 0644 hpuefi.ko /lib/modules/6.8.8-4-pve/kernel/drivers/hpuefi/hpuefi.ko
depmod
install -D -m 0744 mkdevhpuefi /lib/modules/6.8.8-4-pve/kernel/drivers/hpuefi

Mise à jour du firmware