I am not a native English speaker; this article was translated by Gemini.
As a long-time Linux enthusiast, I usually install a Linux distro as soon as I get a new laptop. That makes the preinstalled Windows almost useless, but I still couldn’t delete it — I needed it to run vendor BIOS updaters. Keeping a ~100GB Windows partition just for the occasional BIOS update is pretty annoying. Sure, something like Windows To Go exists, but that doesn’t really change the situation: you’re still relying on Windows.
Right before the end of 2024, I came across someone mentioning a pure-Linux BIOS update workflow on Twitter: https://x.com/felixonmars/status/1876646199207604351
It was only a few lines, but it lit the tinkering fire in my head: this might work — let’s do it.
All my laptops are Lenovo ThinkBooks. I started with one machine at home (A). Specs:
OS: Ubuntu oracular 24.10 x86_64
Host: 21D0 (ThinkBook 14 G4+ ARA)
Kernel: Linux 6.12.9-bigv
Uptime: 1 day, 53 mins
Packages: 2800 (dpkg), 7 (flatpak)
Shell: zsh 5.9
Display (AUOC391): 2880x1800 @ 90 Hz in 14"
DE: GNOME
WM: Mutter (X11)
WM Theme: Yaru
Theme: Yaru [GTK2/3/4]
Icons: Yaru [GTK2/3/4]
Font: Cantarell (11pt) [GTK2/3/4]
Cursor: DMZ-White (48px)
Terminal: tmux 3.4
CPU: AMD Ryzen 7 6800H (16) @ 4.79 GHz
GPU: AMD Radeon 680M [Integrated]
Memory: 12.95 GiB / 29.55 GiB (44%)
Swap: 5.25 MiB / 32.00 GiB (0%)
Disk (/): 312.72 GiB / 414.32 GiB (75%) - btrfs
Local IP (wlan0): 192.168.31.157/24
Battery (AP16L5J): 77% [AC Connected]
Locale: en_US.UTF-8- Download Framework’s UEFI Shell flashing tool. We only need
H2OFFT-Sx64.efi. Save it to/boot/efi: https://downloads.frame.work/bios/Framework_Laptop_13_13th_Gen_Intel_Core_BIOS__3.05_EFI.zip - Download UEFI Shell. Save
shellx64.efito/boot/efi: https://github.com/pbatard/UEFI-Shell/releases/tag/24H2 - Download the BIOS updater for your exact laptop model from Lenovo’s driver page. It’s usually named something like
j6cn50ww.exe. - Try extracting the
exewith7z:7z e j6cn50ww.exe. You may see output like:Comments: This installation was built with Inno Setup. - Use
innoextractto unpack it:innoextract -e j6cn50ww.exe. You’ll get a newexe— mine wasJ6CN50WW.exe. - Extract again with
7z:7z e J6CN50WW.exe. This time you should get the actual BIOS firmware,WinJ6CN50WW.fd. - Save
WinJ6CN50WW.fdto/boot/efi. - Add a UEFI Shell boot entry. Edit
/etc/grub.d/40_custom, paste the following, then runsudo update-grub:menuentry "UEFI Shell" { insmod part_gpt insmod chain set root='(hd0,gpt1)' chainloader /shellx64.efi } - Reboot into UEFI Shell. Type
FS0:and press Enter to switch to the EFI partition, then runH2OFFT-Sx64.efi WinJ6CN50WW.fdand press Enter. - You should see the familiar BIOS flashing UI. Wait for it to complete.
Finally, I can throw the bundled Windows partition into the trash ✌️
Note: For some newer Lenovo models, 7z may be able to extract the BIOS firmware directly — usually named xxx.bin — so innoextract is not required. Also, 7z isn’t mandatory either. You can use any tool that can unpack an exe (for example bsdtar).
NOTE: I am not responsible for any expired content.
Created at: 2025-01-12T16:58:10+08:00
Updated at: 2025-01-12T17:04:21+08:00
Origin issue: https://github.com/ferstar/blog/issues/83