Dell OptiPlex 3050 Micro: Instalacija Libreboot-a

Imao sam priliku da kupim polovni Dell OptiPlex 3050 Micro koji je uzet zarad postizanja dva cilja:

U ovom članku ću se pozabaviti procesom instalacije Libreboot sistema za Linux korisnike na tom računaru. Napominjem da postoji više metoda flešovanja i ne podržava svaki uređaj sve no 3050 Micro podržava flešovanje kroz operativni sistem (razlog zašto je i uzet). Takođe, ne podržava svaki sistem isti Libreboot ROM.

Šta je Libreboot?

Libreboot je distribucija otvorenog softvera (eng. open source) koja zamenjuje vlasnički (eng. proprietary) BIOS/UEFI firmver. Glavna filozofija projekta je sloboda korisnika, ali u praksi to donosi tri konkretne prednosti za ovaj računar:

OptiPlex 3050 Micro konfiguracija

Sam OptiPlex 3050 Micro je mašina skromnijih mogućnosti za današnje standarde no ja sam zadovoljan radom i performansama u FreeBSD sistemu. Pošto sam sklapao taj računar iz delova, neke komponente nisu baš uklopljene:

Primetićete da je disk previše moćan za ovakvu mašinu i da imam mnogo više radne memorije nego što bi nekom trebalo međutim za kućnu laboratoriju je korisno. Disk nisam hteo da menjam sa prethodnog računara, uloženo je previše u njega :)

Libreboot dokumentacija

Zvanična Libreboot dokumentacija za OptiPlex 3050 Micro nudi dva rešenja za flešovanje ovog računara:

Ja sam koristio interno flešovanje tako da ću se baviti dokumentovanjem tih prostijih koraka.

Operativni sistem koji sam koristio

Sav posao pravljenja i flešovanja Libreboota je obavljen na samom Dell OptiPlex 3050 Micro uređaju pod Fedora Workstation distribucijom, trenutnom stabilnom verzijom 43.

Dell servisni režim

Da biste mogli da flešujete sistem neophodno je da nađete mali kratkospojnik (eng. jumper) plave boje na matičnoj ploči, desno od CMOS baterije odmah iznad SATA_HDD obeležja na ploči. Njega treba da postavite u servisnu poziciju. Imate 3 moguće pozicije gledano sa prednje strane kućišta (Dell logo i mrežica sa prednje strane kućišta su okrenuti ka vama). Podrazumevana pozicija kratkospojnika je u sredini. Vi treba da prebacite na dno, da bude bliže vama.

Krupni plan Dell OptiPlex 3050 Micro matične ploče. Vrh olovke pokazuje na plavi servisni džamper tj. kratkospojnik
Pozicija kratkospojnika na matičnoj ploči

Nakon ovog koraka možete da nastavite dalje da izvezete UEFI fabrički softver.

Sigurnost pre svega: izvoz trenutnog fabričkog softvera

Za izvoz trenutnog fabričkog softvera sam koristio flashrom. Takođe napominjem da postoji i flashprog koji Libreboot projekat preporučuje ali on mora da se prevodi iz izvornog koda.

Za izvoz pravimo 2 kopije UEFI fabričkog softvera:

sudo flashrom -p internal -r dell3050_v1.2.0_factory_backup.rom
sudo flashrom -p internal -r dell3050_v1.2.0_factory_backup2.rom

Ja sam koristio dell3050_v1.2.0_factory_backup.rom i dell3050_v1.2.0_factory_backup2.rom, vi možete da ih zovete kako god želite.

Nakon izvoza je bitno da uradite diff da vidite da li izvoz funkcioniše i da li su oba izvezena UEFI ROM-a identična:

diff dell3050_v1.2.0_factory_backup.rom dell3050_v1.2.0_factory_backup2.rom

Izvezen UEFI ROM mora biti 16777216 bajtova! Ukoliko diff izbaci bilo kakav rezultat, nije dobro. Izvezite ponovo.

Prevođenje Libreboota iz izvornog koda

Postoje 2 načina da napravite Libreboot ROM za vaš računar, sam ROM koji ćete da flešujete kasnije:

Sa obzirom da druga metoda ima previše zvanično dokumentovanih koraka i sam proces ubacivanja (eng. inject, često ćete videti taj termin u dokumentaciji) fabričkih Intel IME komponenti u Libreboot nije lako izvršiti pouzdano, ja sam napravio sve prevođenjem izvornog koda. Skripte koje su Libreboot programeri pravili su odlične i kompilovanje koda će obaviti sve za vas i napraviti sve ROM datoteke bez imalo muke!

Otvorite terminal i pustite git da klonira lbmk riznicu gde vi želite:

git clone https://codeberg.org/libreboot/lbmk

Imajte u vidu da težite ka tome da flešujete SeaBIOS txtmode ROM za FreeBSD dok je GRUB corebootfb za Linux distribucije (probao sam Fedori Workstation 43). Naravno, moguće je mešanje ali neće svaki sistem raditi.

Postavljanje broja jezgara za prevođenje

export XBMK_THREADS=4

Ovom dokumentovanom promenljivom postavljate broj fizičkih niti za prevođenje tj. kompilovanje na maksimum, sa obzirom da Intel i5-7500T ima 4 fizička jezgra i 0 virtuelnih niti. Ukoliko ne postavite ovu promenljivu, lbmk proces prevođenja koda će biti izvršen samo na jednom jezgru tako da će raditi ali značajno sporije!

Instalacija zavisnosti za Fedora Workstation

Otvorite lbmk direktorijum i pokrenite mk, deo GNU make paketa, sa sledećim parametrima

./mk dependencies fedora43

Instaliraće pakete poput acpica-tools, gdb, cmake i sl. U mom slučaju prevođenje nije prolazilo u početku zato što mi je nedostajao libtool paket u Fedori Workstation 43 stoga sam taj paket ručno instalirao (prijavio sam lbmk grešku 396).

Prevođenje flashprog alata

Kao što rekoh, možete da koristite i flashrom za ovu operaciju no Libreboot nudi i flashprog alat koji možete da koristite. Ja sam ih kombinovao:

Dakle, otvorite lbmk direktorijum koji ste klonirali uz pomoć git alata i onda u terminalu pustite:

./mk -b flashprog

Nakon što se prevođenje završi, napraviće binarnu flashprog datoteku unutar ./elf/flashprog

Prevođenje Libreboot ROM-a

Bitno je da znate da će prevođenje Libreboot-a napraviti mnogo ROM datoteka u lbmk/bin/dell3050microvfsp16mb/*.rom. Ovde morate napraviti izbor zavisno od operativnog sistema koji planirate:

Izvršite prevođenje:

./mk -b coreboot dell3050micro_vfsp_16mb

Nakon 40 minuta će sistem završiti i napraviti bin/dell3050microvfsp16mb/*.rom datoteke. Primer jedne datoteke je seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom

Provera prevedenog koda pre flešovanja

Ja sam izabrao da flešujem ./bin/dell3050micro_vfsp_16mb/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom prvi put. Provera se svodi na proveru sadržaja same ROM datoteke korišćenjem hexdump alata:

hexdump -C seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom

I onda internog Libreboot alata cbfstool.

Kliknite da vidite detaljan izlaz `cbfstool` komande
bob@fedora:~/lbmk$ ./elf/coreboot/default/cbfstool ./bin/dell3050micro_vfsp_16mb/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb print
FMAP REGION: COREBOOT
Name                           Offset     Type           Size   Comp
cbfs_master_header             0x0        cbfs header        32 none
cpu_microcode_blob.bin         0x80       microcode      643072 none
intel_fit                      0x9d0c0    intel_fit         176 none
fallback/romstage              0x9d1c0    stage           64304 none
fallback/ramstage              0xacd80    stage          131493 LZMA (287364 decompressed)
config                         0xccf80    raw              4084 LZMA (14432 decompressed)
revision                       0xcdfc0    raw               780 none
build_info                     0xce300    raw               118 none
fallback/dsdt.aml              0xce3c0    raw             10658 none
cmos.default                   0xd0dc0    cmos_default      256 none
etc/ps2-keyboard-spinup        0xd0f00    raw                 8 none
etc/pci-optionrom-exec         0xd0f40    raw                 8 none
etc/optionroms-checksum        0xd0f80    raw                 8 none
fspm.bin                       0xd0fc0    fsp            405504 none
fsps.bin                       0x134000   fsp            188416 none
vbt.bin                        0x162040   raw              1155 LZMA (4300 decompressed)
cmos_layout.bin                0x162500   cmos_layout       696 none
fallback/postcar               0x162800   stage           25140 none
img/u-boot                     0x168a80   simple elf     388515 none
fallback/payload               0x1c7880   simple elf      71899 none
vgaroms/seavgabios.bin         0x1d91c0   raw             28160 none
img/memtest                    0x1e0000   simple elf     143307 none
img/grub2                      0x203000   simple elf     607022 none
scan.cfg                       0x297380   raw                31 none
background.png                 0x297400   raw              3451 none
(empty)                        0x2981c0   null         12783076 none
bootblock                      0xec8fc0   bootblock       24576 none

Za kraj, uporedite početak fabričkog ROM-a koji ste izvezli i novog Libreboot ROM-a koji ste napravili:

Proveravamo rezervnu kopiju fabričkog ROM-a dell3050_v1.2.0_factory_backup.rom

bob@fedora:~/lbmk$ hexdump -C dell3050_v1.2.0_factory_backup.rom | head -n 2
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000010  5a a5 f0 0f 03 00 04 00  08 02 10 5a 30 03 31 00  |Z..........Z0.1.|

Uporedite sa seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom koji sam ja izabrao da flešujem:

bob@fedora:~/lbmk$ hexdump -C seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom | head -n 2
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000010  5a a5 f0 0f 03 00 04 00  08 02 10 5a 30 03 31 00  |Z..........Z0.1.|

Ako su identični, možete da pređete na flešovanje :-)

Dodatna provera za Intel Flash Descriptor (IFD)

Možete da proverite i Intel Flash Descriptor (IFD). Vrednost 5a a5 f0 0f je Flash Valid Signature (FLVALSIG) koji je definisan u Intel Platform Controller Hub (PCH) za B250 platformu:

Serial Peripheral Interface for Flash/TPM (SPI0) The Flash signature selects Descriptor Mode as well as verifies if the flash is programmed and functioning. The data at the bottom of the flash (offset 10h) must be 0FF0A55Ah in order to be in Descriptor mode

Bez ovog potpisa, matična možda neće raditi. Nisam video dokumentovane primere no zgodno je znati!

Tako da proveravamo rezervnu kopiju fabričkog ROM-a

bob@fedora:~/lbmk$ hexdump -C dell3050_v1.2.0_factory_backup.rom | grep "5a a5 f0 0f"
00000010  5a a5 f0 0f 03 00 04 00  08 02 10 5a 30 03 31 00  |Z..........Z0.1.|

I upoređujemo sa seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom koji sam ja izabrao da flešujem:

bob@fedora:~/lbmk$ hexdump -C seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom | grep "5a a5 f0 0f"
00000010  5a a5 f0 0f 03 00 04 00  08 02 10 5a 30 03 31 00  |Z..........Z0.1.|

_Više detalja možete potražiti pretragom 200-series-chipset-pch-datasheet-vol-1.pdf na internetu._

Flešovanje Libreboot-a

Izbrani Libreboot ROM seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom za korišćenje sa Linux sistemima flešujemo sa

bob@fedora:~/lbmk/elf/flashprog$ sudo ./flashprog -p internal -w ../../bin/dell3050micro_vfsp_16mb/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom 
flashprog p1.4-27-g92b2e50 on Linux 6.17.1-300.fc43.x86_64 (x86_64)
flashprog is free software, get the source code at https://flashprog.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found chipset "Intel B250".
This chipset is marked as untested. If you are using an up-to-date version
of flashprog *and* were (not) able to successfully update your firmware with it,
then please email a report to flashprog@flashprog.org including a
verbose (-V) log.
Thank you!
Enabling flash write... SPI Configuration is locked down.
The Flash Descriptor Override Strap-Pin is set. Restrictions implied by
the Master Section of the flash descriptor are NOT in effect. Please note
that Protected Range (PR) restrictions still apply.
Enabling hardware sequencing because some important opcode is locked.
OK.
Found Programmer flash chip "Opaque flash chip" (16384 kB, Programmer-specific) on internal.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

Ako vidite Verifying flash... VERIFIED. to je to.

Poslednji korak je da izvučete kabl iz struje da biste pokrenuli Libreboot po prvi put.