Write bootable BIOS update .ISO to USB stick

Lenovo distributes BIOS updates as .iso files (example) that are supposed to be burnt on a CD and booted. Burning it to a CD worked and booted correctly, but now I want to use a USB stick instead (because I don't trust my CD drive), how to create this USB stick using Ubuntu?

There are many tutorials explaining how to create bootable USB sticks from Linux-based ISOs (using UNetbootin and similar, they create Linux-related files at the root of the USB stick) and from Windows-based utilities (with FreeDOS and similar). I believe neither are solutions here as the BIOS update ISO file is not Linux-based nor DOS-based (mounting the ISO does not show any known filesystem)


Solution 1:

I found what may be a solution to the issue at http://positon.org/lenovo-thinkpad-bios-update-with-linux-and-usb.

First convert the iso image to an img file:

sudo apt-get install genisoimage
geteltorito -o bios.img gruj09us.iso

Then copy to the USB key:

sudo fdisk -l /dev/sdb  # double check that the device is right
sudo dd if=bios.img of=/dev/sdb #Will Erase the drive!! 

That said I think you should just try first whether it boots okay if you just write the .iso with a generic tool as you normally would. (Provided it needs some input and does not automatically start mucking about in your BIOS as you boot up.) Last two times I installed a Linux I didn't use the recommended tool. (I made a bootable USB for 15.04 with SUSE Studio Image Writer since Unetbootin messed it straight up multiple times.It worked fine.)

Solution 2:

As Arch user said in the comments, the most straightforward way to write a bootable ISO to an USB drive is to dd the image to the drive.

First triple-check to which block device your USB drive is currently mapped to:

lsblk

Than dd the image to the USB drive. For example if your USB drive happens to be mapped to /dev/sdb:

sudo dd if=/path/to/image of=/dev/sdb bs=8M && sync

Different block sizes usually peform differently, however usually a bigger block size performs better than a smaller block size; a block size of 8M should be enough to let the process run at full speed.

If you want to monitor the progress of the process, install pv:

sudo apt-get update && sudo apt-get install pv

And run this command instead:

pv /path/to/image | sudo dd of=/dev/sdb bs=8M && sync

Solution 3:

Just in case someone is still looking for the answer.

The solution above alone was not enough for my Lenovo E470 which is UEFI-capable. The BIOS update utility just does not start from USB stick.

One has to read the README file corresponding to BIOS update file.

On reboot press Enter to interrupt normal startup and after entering the BIOS Setup:

...
-> 7. In "UEFI/Legacy Boot", make sure "UEFI only" is chosen.
   8. Choose "Boot" from the menu. Note the current boot priority order for
      restoration later if you need to modify your boot list.
   9. In "Boot Priority Order", make sure the following device is on top of
      "ATA HDD0".
      - "ATAPI CD0" (when using a ThinkPad internal optical drive)
      - "USB CD"    (when using a USB optical drive)
->    - "USB HDD"   (for my USB stick)

After restart you should be able to boot from you "USB HDD".