A USB drive with only 1 partition* to load GRUB2 on USB-bootable machines with Legacy BIOS
, 64-bit UEFI
or 32-bit UEFI
.
*Due to the maximum size of a file inside an EFI system partition, files of 4 GiB or larger (such as some ISO images) must be placed on another partition. That second partition can be of type ext4
, for instance.
Warning : the USB drive will be formatted, save your data before proceeding!
First of all, on your current installation, check if the folder /usr/lib/grub/
exists and is not empty.
If it is empty or does not exist, make sure the package grub-common (or equivalent for your distribution) version 2 or higher is installed.
Depending on the system, /usr/lib/grub/
will contain one or more of the following folders : x86_64-efi
, x86_64-efi-signed
, i386-pc
, i386-efi
, ...
The x86_64-efi
, i386-pc
and i386-efi
folders need to be present in order to install the corresponding bootloader on the USB drive.
sudo apt install --no-install-recommends --yes grub-pc-bin grub-efi-ia32-bin grub-efi-amd64-bin
Now, find the device file for your USB drive. Here, the file is /dev/sdX
. Replace X
with the appropriate lower case letter(s) in the commands.
sudo fdisk -l /dev/sdX
sudo fdisk /dev/sdX
o
<enter>
# Create a new empty DOS partition table
n
<enter>
# Create a new partition
p
<enter>
# Select primary partition type
1
<enter>
# Set partition number to 1
<enter>
# Start partition at the first possible sector (default)
<enter>
# Set partition end to the last possible sector (default)
Note : if you are asked whether the partition signature should be deleted, then answer yes.
t
<enter>
# Change partition type
e
f
<enter>
# Set partition type to EFI (FAT-12/16/32)
a
<enter>
# Enable the bootable flag on partition 1
w
<enter>
# Write the partition table
sudo mkfs.fat -F32 /dev/sdX1
sudo mount -o umask=000 /dev/sdX1 /mnt
sudo grub-install --no-floppy --boot-directory=/mnt/boot --target=i386-pc /dev/sdX
Install /EFI/BOOT/BOOTX64.EFI
and other GRUB files required to load GRUB from a 64-bit UEFI firmware :
sudo grub-install --removable --boot-directory=/mnt/boot --efi-directory=/mnt --target=x86_64-efi /dev/sdX
sudo grub-install --removable --boot-directory=/mnt/boot --efi-directory=/mnt --target=i386-efi /dev/sdX
touch /mnt/boot/grub/grub.cfg
Notes :
- Skip this part if you already have a working grub.cfg for the USB drive.
- Other examples can be found in this repository's grub.cfg file.
mkdir /mnt/isos
Download a Xubuntu ISO image (for example : Xubuntu 22.04 64-bit) :
Note : make sure there is enough space on the USB drive.
wget --directory-prefix=/mnt/isos http://cdimages.ubuntu.com/xubuntu/releases/jammy/release/xubuntu-22.04.5-desktop-amd64.iso
nano /mnt/boot/grub/grub.cfg
if [ "${grub_platform}" = "efi" ]; then rmmod tpm; fi # See https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311
menuentry 'Xubuntu 22.04 amd64' {
set isofile="/isos/xubuntu-22.04.5-desktop-amd64.iso"
#search --set=root --file $isofile # Uncomment if the bootloader and OS files are on different partitions
loopback isoloop $isofile
linux (isoloop)/casper/vmlinuz locale=en_US console-setup/layoutcode=us boot=casper iso-scan/filename=$isofile quiet --
initrd (isoloop)/casper/initrd
}
Notes about kernel boot parameters :
- Boot parameters used in the above example are specific to Ubuntu and its variants.
locale=
sets the language of the live system. Valid values includeen_US
,pt_BR
,zh_CN
,fr_FR
, ...console-setup/layoutcode=
sets the keyboard layout. Some possible values areus
,br
,cn
,fr
, ...
CTRL+O
<enter>
# Save grub.cfg
CTRL+X
# Exit nano
sudo umount /mnt