diff --git a/README.md b/README.md index 5761db6..5d4bdad 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,204 @@ ## Update firmware to specific version -1- Download frimware version: [n24ur39w](https://download.lenovo.com/pccbbs/mobiles/n24ur39w.iso) or download from vendor +This section explains how to convert a vendor BIOS update `.iso` into a bootable USB image using `geteltorito`, and then write that generated `.img` to a USB drive using `dd`. -2- Install `[geteltorito](https://github.com/rainer042/geteltorito)` +> **WARNING** +> +> The `dd` command will completely overwrite the selected USB device. +> Always write to the whole USB disk, for example `/dev/sdb`, **not** to a partition such as `/dev/sdb1`. +> Double-check the target device before running `dd`. -3- Generate .img from .iso `geteltorito -o t480_bios_n24ur39w.img /home/lb/Downloads/n24ur40w.iso`. +### 1- Download the vendor BIOS update ISO -4- Flash iso to USB `sudo dd if=t480_bios_n24ur39w.img of=/dev/sdX bs=4M conv=fsync status=progress` +Download the required firmware version from Lenovo or from the vendor support page. + +Example for ThinkPad T480: + +```sh +mkdir -p ~/Downloads/firmware/t480 +cd ~/Downloads/firmware/t480 + +wget https://download.lenovo.com/pccbbs/mobiles/n24ur39w.iso +``` + +If you downloaded a different version, adjust the ISO filename in the following commands. + +### 2- Install `geteltorito` + +`geteltorito` extracts the El Torito boot image from a bootable vendor ISO. + +#### Debian / Ubuntu / Linux Mint + +On Debian-based systems, `geteltorito` is provided by the `genisoimage` package: + +```sh +sudo apt update +sudo apt install genisoimage +``` + +Check that it is available: + +```sh +command -v geteltorito +geteltorito --help || true +``` + +#### Arch / Manjaro + +On Arch-based systems, install it from the AUR: + +```sh +yay -S geteltorito +``` + +or: + +```sh +paru -S geteltorito +``` + +Without an AUR helper: + +```sh +cd /tmp +git clone https://aur.archlinux.org/geteltorito.git +cd geteltorito +makepkg -si +``` + +Depending on the package, the command may be installed as `geteltorito` or `geteltorito.pl`. Check which one exists: + +```sh +command -v geteltorito || command -v geteltorito.pl +``` + +### 3- Extract the bootable `.img` from the vendor `.iso` + +Go to the folder where the ISO was downloaded: + +```sh +cd ~/Downloads/firmware/t480 +``` + +If your system provides the command as `geteltorito`: + +```sh +geteltorito -o t480_bios_n24ur39w.img n24ur39w.iso +``` + +If your system provides the command as `geteltorito.pl`: + +```sh +geteltorito.pl -o t480_bios_n24ur39w.img n24ur39w.iso +``` + +Verify that the `.img` file was created: + +```sh +ls -lh n24ur39w.iso t480_bios_n24ur39w.img +file t480_bios_n24ur39w.img +``` + +### 4- Insert the USB and identify the correct device + +Insert the USB drive and run: + +```sh +lsblk -o NAME,SIZE,MODEL,TRAN,FSTYPE,MOUNTPOINTS +``` + +Example output: + +```text +NAME SIZE MODEL TRAN FSTYPE MOUNTPOINTS +sda 476.9G Samsung SSD sata / +sdb 14.6G USB Flash Disk usb vfat /run/media/user/USB +``` + +In this example, the USB is: + +```text +/dev/sdb +``` + +Do **not** use the internal disk. Do **not** use a partition like `/dev/sdb1`. + +Set a variable with the USB disk you identified: + +```sh +USB=/dev/sdX +``` + +Example: + +```sh +USB=/dev/sdb +``` + +### 5- Unmount all mounted USB partitions + +Before writing the image, unmount any mounted partitions from the USB: + +```sh +lsblk "$USB" +sudo umount "${USB}"* 2>/dev/null || true +``` + +### 6- Prepare / wipe the USB before flashing the image + +For an image generated by `geteltorito`, you do **not** need to format the USB as FAT32, exFAT or ext4. + +The correct preparation is to remove old filesystem signatures and partition metadata so the firmware image can be written cleanly with `dd`. + +Recommended: + +```sh +sudo wipefs -a "$USB" +``` + +Optional stronger wipe of the first part of the USB: + +```sh +sudo dd if=/dev/zero of="$USB" bs=1M count=16 status=progress conv=fsync +sudo blockdev --rereadpt "$USB" || true +``` + +If `blockdev --rereadpt` fails because the device is busy, unplug and reinsert the USB, then set `USB=/dev/sdX` again after checking with `lsblk`. + +### 7- Flash the generated `.img` to the USB with `dd` + +Write the `.img` to the **whole USB disk**: + +```sh +sudo dd if=t480_bios_n24ur39w.img of="$USB" bs=4M status=progress conv=fsync +sync +``` + +Alternative using `oflag=sync`: + +```sh +sudo dd if=t480_bios_n24ur39w.img of="$USB" bs=4M status=progress oflag=sync +sync +``` + +### 8- Verify and eject the USB + +Check how the USB looks after writing: + +```sh +lsblk -o NAME,SIZE,MODEL,TRAN,FSTYPE,MOUNTPOINTS "$USB" +``` + +Eject it safely: + +```sh +sudo eject "$USB" +``` + +The USB should now be bootable. Insert it into the ThinkPad, boot from USB, and follow the vendor BIOS update instructions. + +On many ThinkPads, press `F12` during boot to open the boot menu. ## Prepare flahser diff --git a/vendor/t480_bios_n24ur39w.img b/vendor/t480_bios_n24ur39w.img new file mode 100644 index 0000000..75d6649 Binary files /dev/null and b/vendor/t480_bios_n24ur39w.img differ