After months of disappearing, I’m able to come back blogging, with A LOTS of drafts. I’ll be updating more details about my current situation in a more dedicated post. But for now, let’s talk something technological interesting.
Dell Optiplex 3050 Micro has been my ideal open source desktop PC for quite a while, probably since the first time when Libreboot added its support. Recently, I got the chance to have one of these as an upgrade from my older mini PC build.
It is very capable compare to other builds with older specifications such as my beloved Sandy Bridge, yet much easier to install Libreboot thanks to the internal flash capability on this board.
It’s quite limited to find guides comparing to ThinkPad. Here are some resources I found really helpful:
https://www.youtube.com/watch?v=w5ZjmF4JdMo
https://gist.github.com/waal70/929d45ecd077c3cd201de9c40ff87284
https://libreboot.org/docs/install/dell3050.html
However, all of these guides are not comprehensive enough. That’s what I’m writing this post for.
CPU Upgrading
For CPU upgrade, 6/7 gen are supported by stock ROM. After flashing Libreboot, it unlocks some more options for low-end build such as i3-6x00T and i3-7x00T, the score is pulled from Passmark.
i5-7500T (4C4T 2.7GHz) 5240
i3-9100T (4C4T 3.1GHz) 5631
i3-9300T (4C4T 3.2GHz) 6323
i7-7700T (4C8T 2.9GHz) 7546
#Below needs hardware MOD, not tested yet
i7-8700T (6C12T 2.4GHz) 10228
i7-9700T (8C8T 2.0GHz) 10529
i9-9900T (8C16T 2.1GHz) 13060
In the used market, i5-7500T is at the cheaper end and i7-7700T is at the expensive end. i3-9100T is at the sweet spot for a cost-effective build. The more capable options are i3-9300T with higher freqency and i7-7700T with more threads, choose upon use case.
Libreboot with GRUB (BIOS/MBR)
The environment I’m working on is a fresh installed Lubuntu, which is very fast and handy to compile codes.
Set up the working directories:
mkdir dell3050
git config --global user.name "John Doe"
git config --global user.email [email protected]
git clone https://codeberg.org/libreboot/lbmk && cd lbmk
Prepare and compile with default config first:
export XBMK_THREADS=4
sudo ./mk dependencies ubuntu
./mk -b flashprog
./mk -b coreboot dell3050micro_vfsp_16mb
Make backups and apply HT/SMT modification
cp ./bin/dell3050micro_vfsp_16mb/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb_usqwerty.rom ~/dell3050/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb_usqwerty_default.rom
cp ./elf/flashprog/flashprog ~/dell3050/
./mk -m coreboot dell3050micro_vfsp_16mb
It’s important to get the terminal window large enough for mk -m command working without error.
Under
Mainboardgo toSystem Power State after failure, where I choseKeep Previous State. In the menu that appears, goChipset->Enable Hyper-Threadingand turn it on.
After done, save and exit the configuration tool. Regenerate the custom rom with modified config
./mk -b coreboot dell3050micro_vfsp_16mb
cp ./bin/dell3050micro_vfsp_16mb/custom_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom ~/dell3050/seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb_usqwerty_mod.rom
Test the flashing tool, back up the current stock rom from dell and check the backup’s integrity if they match
cd ~/dell3050
sudo ./flashprog -p internal
sudo ./flashprog -p internal -r Dell3050_stock1.rom
sudo ./flashprog -p internal -r Dell3050_stock2.rom
sha1sum Dell3050_stock*.rom
At last, flash the custom version of Libreboot, don’t mistakenly (like other guides) use flashprog -p internal -r which overrides Libreboot rom with stock rom
sudo ./flashprog -p internal -w seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb_usqwerty_mod.rom
Upon finished, it should print VERIFIED rather than Warning.
Now, unplug the power cable instead of regular poweroff from the OS.
Power it back on and libreboot shall apear right away.
Dual-boot Linux/Windows
I’m happy about that now my 3050 Micro unlocked the capability for CPU upgrading across generations, so I made it from i3-7100T to i3-9100T. Although it is a plus rather than my main goal—mitigating the spy blobs of the stock firmware as much as possible. Nevertheless, Libreboot as a firmware gives liberation but also comes with limitation.
About the limitation which Libreboot puts on my machine is booting Windows 11. As an advocate of the FOSS movement, I have a million reasons to keep myself and others around me staying away from the evilness of Microsoft.
I would like to make my FOSS mini desktop fully praise the FSF fundamentalism, by running Trisquel if not PureOS/Qubes to protect my privacy.
However, there are also some cases that I need one of my PC to run Windows on baremetal rather than inside a VM. And at this moment, 3050 Micro is very likely to be the one.
Of course there will be no case that this machine runs only on Windows but not dual/multi boot with GNU/Linux.
I tend to believe blocking Windows isn’t done on purpose. It’s simply because of the lack of UEFI support in Libreboot by default (unless fallback to seabios payload), so it can’t boot neither Linux nor Windows 11 via EFI file equally. What made it worse is Microsoft removed BIOS installer from Windows 11 image.
I’ve tried different bootloaders to boot a cloned Windows partition, with Grub2, Clover and rEFInd. Nothing worked. As a result, I have to use SeaBIOS payload to boot Windows via BIOS/MBR.
It is trivial to play with the bootloader/partition configurations to make it boots Linux and Windows via BIOS/MBR within one drive.
But thanks to the extensibility of Dell’s hardware design, it is more reasonable to install Linux on a m.2 drive and Windows on a SATA drive for the sake of sanity/simplicity.
There are many tutorials on how to install Windows 11 via BIOS/MBR ,and on an “unsupported/unqualified” hardware which is outdated(prohibited) by Microsoft.
My recommendation is using an spare SATA drive, or finding a dirt cheap used SSD with MLC NAND and DRAM like Intel DC S3610/3710, because it’s insane to buy a new drive during the disastrous 2026 price surge.
Then, booting up a Windows PE image with Ventoy via SeaBIOS, and using DiskGenius/Bootice/Dism++ to create a new partition table with MBR.
Then, either fresh install Windows 11 with WinNTSetup, or restore it from a backup image or partition cloning and set correct BCD or run bootloader fixer before rebooting.
It’s better in this case to have only one partition per drive. So when booting up Windows 11 from the Libreboot GRUB menu, select Return to SeaBIOS [B] - hit ESC - select AHCI/0 drive.
Installing Linux in the NMVe drive is trivial and it boots up inattentively without any issue, unless installation in UEFI is required in some rare cases (adding UEFI support will be covered in next section).
It is possible to boot OSes in UEFI mode via U-boot payload, but the buggy xHCI support makes my favorate USB keyboard unable to do anything from selecting menu entry to unlocking LUKS partition. So it’s always more stable to use Load Operating System (incl. fully encrypted disks) [o] to boot Linux.
Libreboot with EDK2 (UEFI/GPT)
Default Libreboot (BIOS/MBR) provides strict implementation, but very limited to boot all sorts of modern images. In that case, it is needed to add UEFI support at the cost of slightly loose implementation. There is no right or wrong way, just be sure it serves the use case and specific threat model.
Following the BIOS/MBR part until make modification part
./mk -m coreboot dell3050micro_vfsp_16mb
Here are some extra options to enable for full UEFI support
#Enable basic UEFI support:
`Payload` - uncheck `Don't add a payload` - `Payload to add` - `edk2 payload`
#Allow the ability to store UEFI settings
`Payload` - `Load and Execute OpROMs on PCIe devices`
`Generic Drivers` - `Include EFI variable store driver` - `Support for flash based, SMM mediated data store` - `Use version 2 of SMMSTORE API`
(Optional) Some extra notes for anyone who may need
#The working payloads are
`Don't add a payload` - default config with SeaGRUB=GRUB2+SeaBIOS+U-Boot
`SeaBIOS/U-Boot` - not useful alone, more limited than default
`edk2` - ignores any secondary payloads
So, there are only two useful options, either No added payload for BIOS/MBR or edk2 for UEFI/GPT.
#Some other useful options
`Use Escape key for Boot Manager`
`Prioritize internal boot devices`
#Some troublesome options that triggers compiling failure
Disabling `Include EFI Shell`
enabling `Early PCI bridge`, `Verified Boot (vboot)`
#Potential useful options that to be tested
Enableing `Support PCIe Resizable BARs` and `Extend resource window for PCIe devices above 4G` for large VRAM GPU
`Security` - `CBFS verification` - `Enable CBFS verification`
#Danger zone
Disabling `Add Intel ME/TXE firmware` and/or enabling `Strip down the Intel ME/TXE firmware` can brick the board, see below section to debrick
#Note
Compiling errors may affect local repository irreversibly. Keep a clean backup of local repo for easy experimentation.
After done, save and exit the configuration tool. Regenerate the custom ROM with modified config
./mk -b coreboot dell3050micro_vfsp_16mb
cp ./bin/dell3050micro_vfsp_16mb/custom_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom ~/dell3050/custom_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom
At last, flash the custom version of Libreboot
sudo ./flashprog -p internal -w custom_dell3050micro_vfsp_16mb_libgfxinit_corebootfb.rom
Upon finished, it should prints VERIFIED rather than Warning
Reboot and libreboot shall apear right now.
Debricking
This is just the way to flash the ROM externally. It was the only way to install Libreboot on my ThinkPad X230. I want to experiment with different configurations, so being able to flash a good ROM externally is essential when the modification could mess things up at anytime.
Buy all needed tools as the guide suggests, in my case I bought a RP2024 and a few SOIC8 clips. Although I have one CH341A already for debricking my router and my Flipper Zero with SPI Mem Manager.
Download serprog and verify its integrity/legitimacy
wget https://rsync.libreboot.org/stable/26.01rev1/roms/libreboot-26.01rev1_serprog_pico.tar.xz
wget https://rsync.libreboot.org/stable/26.01rev1/roms/libreboot-26.01rev1_serprog_pico.tar.xz.sha512
wget https://rsync.libreboot.org/stable/26.01rev1/roms/libreboot-26.01rev1_serprog_pico.tar.xz.sig
sha512sum -c libreboot-26.01rev1_serprog_pico.tar.xz.sha512
wget https://libreboot.org/lbkey.asc
gpg --import lbkey.asc
gpg --verify libreboot-26.01rev1_serprog_pico.tar.xz.sig libreboot-26.01rev1_serprog_pico.tar.xz
tar -xvf libreboot-26.01rev1_serprog_pico.tar.xz
plug RP2040 Pico into a Linux computer via USB while holding BOOTSEL button, then copy the firmware
cp bin/serprog_pico/serprog_pico.uf2 /run/media/username/RPI-RP2/
then it shows as libreboot.org pico-serprog (pico) under lsusb and connects as /dev/ttyACM0
unplug RPI Pico from USB, solder pins and incert wires between the board and SOCI-8 clip, the blue color clip (very rare to find) is easier to use than the black one
Next, clip on the chip and connect Pico board to the computer via USB and run sudo dmesg -wH, it should return ttyACM0: USB ACM device
Now, simply pull out the default ROM from the backup folder dell3050
Test if the connection is ready
sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M
It should return followings. If not, try reconnect the clip or wires (it’s better to solder the wires on or at least reinforce the sockets/pins with hot glue)
serprog: Programmer name is "pico-serprog"
Found Macronix flash chip "MX25L12805D" (16384 kB, SPI) on serprog.
Found Macronix flash chip "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F" (16384 kB, SPI) on serprog.
Multiple flash chip definitions match the detected chip(s): "MX25L12805D", "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F"
Please specify which chip definition to use with the -c <chipname> option.
Flash the first chip only is enough, where the second chip is just a mirror
sudo ./flashprog -p serprog:dev=/dev/ttyACM0,spispeed=16M -c MX25L12805D -w seagrub_dell3050micro_vfsp_16mb_libgfxinit_corebootfb_usqwerty_default.rom
Upon finished, reboot and the machine should be back to normal
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
serprog: Programmer name is "pico-serprog"
Found Macronix flash chip "MX25L12805D" (16384 kB, SPI) on serprog.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
Happy hacking!