iPXE - Vlastní bootovací firmware síťové karty

IPv6 PXE boot

O využítí IPv6 PXE bootu jsme psali na našem blogu již několikrát. Například v článku o problémech s duplicitními packety. V něm jsme také zmínili, že u starších serverů, kde není podpora UEFI verze 2.3 (Errata D) a vyšší, používáme PCI-E síťové karty s upraveným firmware, které nám IPv6 PXE boot zajistí.

V tomto článku popíšeme firmware, který používáme s návodem na jeho sestavení včetně aktualizace firmware síťové karty.

V rámci návodu používáme Intelí síťovou kartu s chipsetem 82580, která je součástí Supermicro Microcloudu 5037MC-H8TRF. Firmware používáme také v Intelích 10GE kartách X520 a dalších.

iPXE

Nejdříve rychlé představení iPXE. Jedná se o opensource bootovací firmware s velmi dobře napsaným kódem, který disponuje širokou škálou příkazů umožňující celý bootovací proces nascriptovat. Používá se například jako ovladač síťového bootu v QEMU - v Debianu má balíček ipxe-qemu.

Zároveň podporuje velké množství síťových karet. Dá se také stáhnout jako malé ISO, které se dá připojit pomocí flash disku nebo přes IPMI.

On board síťové karty vs PCI-E karty

Než se pustíme do sestavení vlastního boot ROM, tak je potřeba upozornit, že tento postup funguje pouze na externí (v našem případě PCI-E) síťové karty. Síťové porty, které jsou na základních deskách, mají firmware ve většině případů jako součást BIOSu. iPXE se tam dá také použít, je však potřeba rozbalit image BIOSu, nahradit správný balíček, znovu jej sestavit a nový BIOS flashnout. S ohledem na velkou škálu základních desek, které používáme pro nás bylo jednodušší do serverů přidat PCI-E karty.

U některých síťových karet je také omezena velikost pro bootovací firmware. Tento problém se týká ale hodně starých kusů. Běžně se dnes používá 512kB, které bohatě stačí. Síťové karty s 64kB pamětí na ROM jsou na hranici a je potřeba z iPXE odebrat některé komponenty, aby se tam image vešel. Náš image má většinou kolem 70kB.

Sestavení vlastního boot ROM

Instalace potřebných nástrojů

apt-get install build-essential liblzma-dev make gcc linux-headers-$(uname -r)

Získání iPXE kódu

git clone https://github.com/ipxe/ipxe.git
cd ipxe

Zapnutí podpory IPv6

Soubor src/config/general.h obsahuje všechny přepínače pro jednotlivé komponenty, které do výsledného image budou zahrnuty. Pro přídání podpory IPV6 je tedy potřeba upravit položku NET_PROTO_IPV6 z #undef na #define.

#define        NET_PROTO_IPV6          /* IPv6 protocol */

Zjištění označení síťové karty, pro kterou image připravujeme

lspci -nn | grep -i eth
01:00.0 Ethernet controller [0200]: Intel Corporation 82580 Gigabit Network Connection [8086:150e] (rev 01)
01:00.1 Ethernet controller [0200]: Intel Corporation 82580 Gigabit Network Connection [8086:150e] (rev 01)
                                                                                        ^^^^ ^^^^
                                                                                        vvvv:dddd

Sestavení image

vvvvdddd je potřeba nahradit informací získanou v předchozím kroku. V naše případě tedy 8086150e.

make bin/vvvvddd.rom

Podobným způsobem se dá také připravit i image pro QEMU nebo vlastní iso.

Vypálení iPXE do síťové karty

Tato část je specifická pouze pro Intelí karty. Každý výrobce má postup upgradu firmware jiný.

Preboot - stažení a instalace ovladače

Pro vypálení potřebujeme utilitu Preboot, která je dostupná i pro linux. Stažený soubor rozbalíme a nainstalujeme ovladač:

tar -zxf Preboot.tar.gz
(cd ./APPS/BootUtil/Linux_x64/DRIVER/; ./install)

Výstup instalace ovladače vypadá následovně:

Extracting archive..OK!
Compiling the driver...OK!
Skipping removing QV driver - it does not exist...
Copying iqvlinux.ko driver file to /lib/modules directory...OK!
Driver installation verification...Installed!

Vylistování síťových karet:

./bootutil64e

Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.7.21.0
Copyright (C) 2003-2020 Intel Corporation

Type BootUtil -? for help

Port Network Address Location Series  WOL Flash Firmware                Version
==== =============== ======== ======= === ============================= =======
  1   00259065D9B4     1:00.0 Gigabit YES PXE                           4.4.235
  2   00259065D9B5     1:00.1 Gigabit YES PXE                           4.4.235

V tomto případě již máme síťové karty upgradované na náš firmware.

Příprava firmware pro flashování

iPXE firmware, který jsme si připravili dříve je potřeba rozšířit ještě o FLB hlavičky. Ty můžeme získat třeba z aktuálního firmware síťové karty. Zároveň si tím provedeme i zálohu současného firmware:

./bootutil64e -nic=1 -saveimage -file=backup.rom

Potřebnou hlavičku získáme z prvních 378 bajtů, za kterými následuje 0x55 0xAA.

dd if=backup.rom of=header.flb bs=1 count=378

Nyní je potřeba spojit náš iPXE image se získanou hlavičkou:

cat header.flb 8086150e.rom > output.rom

Dále je potřeba upravit pomocí hexa editoru (např. součástí mcedit) v hlavičkách velikost image. Velikost image je vždy modulo 0xFFFF, takže pokud máme velikost image 66048, tak do pozic 0xE1 a 0xE2 zapíšeme 02 01.

ls -la 8086150e.rom
-rw-r--r-- 1 root root 66048 Jul 31 21:26 8086150e.rom

Náš nový firmware validujeme pomocí:

./bootutil64e -iv -file=output.rom

Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.6.36.0
Copyright (C) 2003-2016 Intel Corporation

Image versions in output.rom

    Combo Rules                    v0.0.00
    PXE                            v1.2.36

V případě, že je s imagem nějaký problém, tak se zobrazí Invalid image file output.rom nebo se celý příkaz zasekne.

V jednom případě jsme museli nahrát do síťové karty firmware, který nám neprošel validací. Důvod se nám však nikdy nepodařilo dohledat. Firmware však funguje v pořádku a žádný negativní vliv na funkci karty to nemělo.

Nahrání nového firmware do síťové karty

./bootutil64e -nic=1 -restoreimage -file=output.rom

Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.7.21.0
Copyright (C) 2003-2020 Intel Corporation

Programming flash on port 1 with flash firmware image   /
Port Network Address Location Series  WOL Flash Firmware                Version
==== =============== ======== ======= === ============================= =======
  1   00259065D9B4     1:00.0 Gigabit YES PXE                           4.4.235
  2   00259065D9B5     1:00.1 Gigabit YES PXE                           4.4.235

V tento moment už stačí jen restartovat server a nabootovat ze sítě.

Závěr

Změna bootovacího obrazu síťové karty je nedestruktivní. Ještě se nám nepodařilo žádnou síťovou kartu tímto postupem zničit. V produkci tento postup používáme již několik let a zatím k plné spokojenosti.

S dlouhodobou obměnou hardware však už tato starost postupně odpadá, protože nové servery umí IPv6 boot již v rámci UEFI.