26

I am not asking how to boot the LiveCD from a USB.

I have 2 Ubuntu installations, one on my computer's internal hard drive and another on a USB drive.

Is there a way to add a GRUB2 menu entry (to the GRUB on my internal hard drive) to boot the Ubuntu OS which I have installed to the USB flash drive and have this same menu entry still work after I've upgraded the Linux kernel on the USB installation?

kiri
  • 28,986

3 Answers3

40

Each time you upgrade kernel on external, you can run this to update boot stanza in grub on the internal drive.

sudo update-grub

But you can also add a boot stanza to grub2's 40_custom that boots the partition, not the specific kernel. Ubuntu installs links in / (root) to boot the most recent install. Adjust example below if necessary to your drive & partition. Boot drive with grub is always hd0, but then other drives are in BIOS reported order which may vary.

Edit with:

sudoedit /etc/grub.d/40_custom

then, add:

menuentry "Install on sdb1" {
    set root=(hd1,1)
    linux /boot/vmlinuz root=/dev/sdb1 ro quiet splash
    initrd /boot/initrd.img
}

Update: older installs put links in /, but newer ones now use /boot. Changed example to show /boot

While above works, I find the drive may change when plugging in a flash drive or any other USB device. So I am converting to use labels.

menuentry "Cosmic 18.10 on sdb12 test" {
    search --set=root --label cosmic_b --hint hd2,gpt12
    configfile /boot/grub/grub.cfg 
}

Another example using configfile to load grub in install on sda10:

menuentry "Ubuntu 22.04 jammy /dev/sda10)" {
    search --set=root --label jammy_a
    #search.label jammy_b root -hint hd1,gpt10
    configfile /boot/grub/grub.cfg
}
oldfred
  • 12,583
14

I found out how to use the UUID of the drive, useful if you have multiple drives plugged in at boot time. Credits to oldfred for his note about /vmlinux and /initrd.img symlinks.

Add this to the file /etc/grub.d/40_custom, replacing UUID=XXXX-YYYY with the partition UUID (get UUID with command blkid)

menuentry "Boot from USB Drive" {
    set root=UUID=XXXX-YYYY
    linux /vmlinuz root=UUID=XXXX-YYYY ro quiet splash
    initrd /initrd.img
}
waltinator
  • 37,856
kiri
  • 28,986
6

To boot from Ubuntu Live USB menu entry in /etc/grub.d/40_custom should look like that (Replace DRIVE_UUID with your partition's uuid):

menuentry "Boot from LIVE USB Drive" {
   search --set=root --fs-uuid DRIVE_UUID
   linux ($root)/casper/vmlinuz boot=casper quiet splash --
   initrd ($root)/casper/initrd.lz
}

To apply changes run:

sudo update-grub