AMT-Update

Die einfachste Lösung um AMT zu patchen ist die Erstellung eines PXE-bootbaren Images, welches beim Start direkt das Flash-Programm aufruft. Ein solches Image kann auch genutzt werden, um einen bootbaren USB-Stick für das Patchen zu erstellen.

FreeDOS

Für ein PXE-bootbares Patchen ist FreeDOS gut geeignet (http://www.freedos.org/). Die Vorbereitung des bootbaren Images kann z. B. in VirtualBox durchgeführt werden.

Build-Umgebung

Für das Erstellen von FreeDOS-Bootmedien gibt es eine ausführliche Anleitung hier:

https://github.com/shidel/FDI/wiki/Creating-a-FDI-based-FreeDOS-installer

Nach der Installation der Build-Umgebung musste in der Datei C:\FDI\MKFDI.BAT die Grösse der für den Build genutzen RAM-Disk von 32 auf 31 MB verkleinert werden:

set RAMSIZE=31000K

Nun kann mit

mkfdi all

oder

mkfdi slim

der Bau aller (Floppy ~1.4 MB, Lite 32 MB oder Full ~512 MB) resp. nur des mittleren Images ausgelöst werden. Wegen der Grösse des AMT-Patchfiles (8 - 9 MB) kann das Floppy-Image nicht genutzt werden, das Lite ist für einzelne Patches ausreichend gross. Sollen mehrere Varianten der Updates auf einer Disk vorgehalten werden, ist auch die Grenze des Lite-Images schnell erreicht und das Full-Image notwendig.

Nach dem Bau des Images wird das Build-System nicht mehr benötigt, das Hinzufügen von Daten und Editieren von Dateien kann direkt auf der ins Gastsystem gemounteten Disk erfolgen.

Platz machen

Um Platz für die Patches zu schaffen, können Verzeichnisse gelöscht werden; wichtig ist nur das Verzeichnis

\FDSETUP\BIN

aus welchem einige Programme während des Bootvorgangs geladen werden. Auf dem Lite-Image können so ca. 27 MB frei gemacht werden, auf dem Full-Image über 500 MB.

Datenaustausch mit Wirtssystem

Da es keine VM-Tools für FreeDOS gibt, ist der Zugriff auf die virtuellen Disks aus dem Wirtssystem der einfachste Weg.Dazu gibt es das Linux-Paket libguestfs-tools mit den Tools guestmount und guestunmount. Beide Befehle können als normaler Benutzer verwendet werden.

Die für den Build benutzten VM-Disk (nicht die Boot-Disk der VM) wird gemountet mit:

guestmount -a FD12FULL.img -m /dev/sda1 /home/bgiger/vhd

Die Bezeichnung /dev/sda1 meint dabei die erste Partition in der VM-Disk, nicht die des Wirt-Systems! Unmount entsprechend:

guestunmount /home/bgiger/vhd

Auf die gemountete Disk können nun Dateien kopiert werden, auch Editieren ist möglich (Schreiben forcieren in vi mit "w!"). Selbstverständlich darf nur geschrieben werden, solange die Disk nicht in der VM gemountet ist.

Tools und Patch-Dateien

Patcher

Unter DOS laufende Patch-Programme (FWUpdLcl.exe) für alle AMT-Versionen können hier gefunden werden: http://www.win-raid.com/t596f39-Intel-Management-Engine-Drivers-Firmware-amp-System-Tools.html. Die Pakete enthalten Patcher für Windows und DOS.

Patch-Dateien

Die AMT-Patches sind i. A. modellspezifisch und müssen direkt beim Hersteller bezogen werden!

Auslesen von Boot-Parametern

PXE-Bootumgebungen ermöglichen die Angabe von Parametern, was mit Hilfe eines zusätzlichen DOS-Programmes auch in FreeDOS genutzt werden kann: https://github.com/PerditionC/memdisk_getargs

getargs.com wird ins Wurzelverzeichnis des Disk-Images kopiert.

Konfiguration von FreeDOS

Der Patch-Vorgang wird gestartet durch

FWUPDLCL.EXE -y -f <Patch-Datei>

Parametrisierung

Die Scripting-Möglichkeiten in DOS sind beschränkt im Vergleich zu Linux. So kehrt z. B. ein aufgerufenes Script nicht wieder zurück, Folgebefehle im aufrufenden Script werden nicht ausgeführt.


Bereitstellung in PXE

Für das Laden des Images wird memdisk aus dem syslinux-Paket verwendet. Zusammen mit dem Disk-Image kommt es in ein Verzeichnis auf

Das Disk-Image (Lite oder Full) kann nun in einem PXE-Menu eingebunden werden; die Pfade zu memdisk und dem Image sind den Gegebenheiten anzupassen:

label freedos
  menu label AMT-Update P910
    kernel ../img/freedos/memdisk
    append initrd=../img/freedos/amtpatch.img HARDWARE=FE_P910 VERSION=FWUPD-81 PATCH=ME8.BIN

In diesem Beispiel werden FreeDOS die Parameter HARDWARE, VERSION und PATCH als Parameter übergeben.