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.
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.
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.
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.
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ě.
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.