An Hybrid UEFI GPT + BIOS GPT/MBR boot USB disk is a disk that works on both UEFI and BIOS PCs.
== Requisites: ==
*A working Linux installation with the following packages: ''grub2, grub2-efi, gdisk'' (on Debian Jessie: ''grub-pc-bin, grub-efi, grub-efi-amd64, gdisk'')
*An USB drive
*Some Linux ISO.
=== Step 1: get the right /dev ===
From now on we will use a '''root shell''' because almost all commands we will use require it.
`root@debianvm:~#` '''fdisk -l'''<
>
`...............`
`Disk /dev/sdc: 14.9 GiB, 16005464064 bytes, 31260672 sectors`<
>
`Units: sectors of 1 * 512 = 512 bytes`<
>
`Sector size (logical/physical): 512 bytes / 512 bytes`<
>
`I/O size (minimum/optimal): 512 bytes / 512 bytes`<
>
`Disklabel type: dos`<
>
`Disk identifier: 0x00000000`<
>
`Device Boot Start End Sectors Size Id Type`<
>
`/dev/sdc1 2 31260671 31260670 14.9G af HFS / HFS+`<
>
Find the right dev (ie: mine was '''/dev/sdc''' and ''I WILL USE IT IN THE GUIDE'', you have to use your dev).
=== Step 2: make GUID partition table and partitions ===
`root@debianvm:~#` '''gdisk /dev/sdc''' <
>
And then we are in gdisk prompt; from now on just give the commands in '''bold''' and the press enter.
`GPT fdisk (gdisk) version 0.8.10`<
>
`Partition table scan:`<
>
`MBR: MBR only`<
>
`BSD: not present`<
>
`APM: not present`<
>
`GPT: not present`<
>
`***************************************************************`<
>
`Found invalid GPT and valid MBR; converting MBR to GPT format`<
>
`in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by`<
>
`typing 'q' if you don't want to convert your MBR partitions`<
>
`to GPT format!`<
>
`***************************************************************`<
>
`Warning! Main partition table overlaps the first partition by 32 blocks!`<
>
`You will need to delete this partition or resize it in another utility.`<
>
`Warning! Secondary partition table overlaps the last partition by`<
>
`33 blocks!`<
>
`You will need to delete this partition or resize it in another utility.`<
>
`Command (? for help): `'''o'''<
>
`This option deletes all partitions and creates a new protective MBR.`<
>
`Proceed? (Y/N):`''' y'''<
>
`Command (? for help):` '''n'''
`Partition number (1-128, default 1): `<
>
`First sector (34-31260638, default = 2048) or {+-}size{KMGTP}:`<
>
`Last sector (2048-31260638, default = 31260638) or {+-}size{KMGTP}:` '''+1M'''<
>
`Current type is 'Linux filesystem'`
`Hex code or GUID (L to show codes, Enter = 8300):` '''EF02''' <
>
`Changed type of partition to 'BIOS boot partition'`
`Command (? for help):`''' n'''<
>
`Partition number (2-128, default 2):`<
>
`First sector (34-31260638, default = 4096) or {+-}size{KMGTP}:`<
>
`Last sector (4096-31260638, default = 31260638) or {+-}size{KMGTP}:` '''+50M''' <
>
`Current type is 'Linux filesystem'`<
>
`Hex code or GUID (L to show codes, Enter = 8300):` '''EF00'''<
>
`Changed type of partition to 'EFI System'`<
>
`Command (? for help):` '''n''' <
>
`Partition number (3-128, default 3):`<
>
`First sector (34-31260638, default = 106496) or {+-}size{KMGTP}:`<
>
`Last sector (106496-31260638, default = 31260638) or {+-}size{KMGTP}: `<
>
`Current type is 'Linux filesystem'`<
>
`Hex code or GUID (L to show codes, Enter = 8300):` '''0700'''<
>
`Changed type of partition to 'Microsoft basic data'`<
>
`Command (? for help):` '''w''' <
>
`Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING`<
>
`PARTITIONS!!`<
>
`Do you want to proceed? (Y/N):` '''y'''<
>
`OK; writing new GUID partition table (GPT) to /dev/sdc.`<
>
`The operation has completed successfully.`<
>
Now gdisk will quit, it's ok.
=== Step 3: make hybrid GUID/MBR ===
`root@debianvm:~#` '''gdisk /dev/sdc'''<
>
`GPT fdisk (gdisk) version 0.8.10`<
>
``<
>
`Partition table scan:`<
>
` MBR: protective`<
>
` BSD: not present`<
>
` APM: not present`<
>
` GPT: present`<
>
``<
>
`Found valid GPT with protective MBR; using GPT.`<
>
``<
>
`Command (? for help):` '''r'''<
>
``<
>
`Recovery/transformation command (? for help):`''' h'''<
>
``<
>
`WARNING! Hybrid MBRs are flaky and dangerous! If you decide not to use one,`<
>
`just hit the Enter key at the below prompt and your MBR partition table will`<
>
`be untouched.`<
>
``<
>
`Type from one to three GPT partition numbers, separated by spaces, to be`<
>
`added to the hybrid MBR, in sequence:` '''1 2 3'''<
>
`Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? (Y/N):` '''n'''<
>
``<
>
`Creating entry for GPT partition #1 (MBR partition #1)`<
>
`Enter an MBR hex code (default EF):` '''EF02'''<
>
`Set the bootable flag? (Y/N):` '''n'''<
>
``<
>
`Creating entry for GPT partition #2 (MBR partition #2)`<
>
`Enter an MBR hex code (default EF):` '''EF00'''<
>
`Set the bootable flag? (Y/N):` '''n'''<
>
``<
>
`Creating entry for GPT partition #3 (MBR partition #3)`<
>
`Enter an MBR hex code (default 07):` '''0700'''<
>
`Set the bootable flag? (Y/N):` '''y'''<
>
``<
>
`Recovery/transformation command (? for help):` '''w'''<
>
``<
>
`Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING`<
>
`PARTITIONS!!`<
>
``<
>
`Do you want to proceed? (Y/N):` '''y'''<
>
`OK; writing new GUID partition table (GPT) to /dev/sdc.`<
>
`The operation has completed successfully.`<
>
gdisk will quit (again) and it's ok.
=== Step 4: format the partitons ===
We have to format in FAT32 two of the three partitions, '''''/dev/sdc2''''' and '''''/dev/sdc3'''''.
Umount the partitions if mounted and then:
`root@debianvm:~#` '''mkfs.fat -F32 -n GRUB2EFI /dev/sdc2'''<
>
`mkfs.fat 3.0.27 (2014-11-12)`<
>
`root@debianvm:~#` '''mkfs.fat -F32 -n DATA /dev/sdc3'''<
>
`mkfs.fat 3.0.27 (2014-11-12)`<
>
Now the partitons are ready, we will mount '''''/devsdc2''''' to '''''/mnt/efi''''' and '''''/dev/sdc3''''' to '''''/mnt/data'''''.
`root@debianvm:~#` '''mkdir /mnt/efi'''<
>
`root@debianvm:~#` '''mkdir /mnt/data'''<
>
`root@debianvm:~#` '''mount /dev/sdc2 /mnt/efi/'''<
>
`root@debianvm:~#` '''mount /dev/sdc3 /mnt/data/'''<
>
=== Step 5: install grub ===
In this step we will install grub in EFI partition (mounted in /mnt/efi) and in MBR.
`root@debianvm:~#` '''grub-install --target=x86_64-efi --efi-directory=/mnt/efi --boot-directory=/mnt/data/boot --removable --recheck'''<
>
`Installing for x86_64-efi platform.`<
>
`Installation finished. No error reported.`<
>
`root@debianvm:~#` '''grub-install --target=i386-pc --boot-directory=/mnt/data/boot --recheck /dev/sdc'''<
>
`Installing for i386-pc platform.`<
>
`Installation finished. No error reported.`<
>
=== Step 6: create folders for ISOs ===
In '''''/mnt/data''''' we should now have only one directory, '''boot'''; let's create a directory for the ISOs.
`root@debianvm:~#` '''mkdir /mnt/data/iso'''<
>
In '''''/mnt/data''''' we should now have <
>
'''''/mnt/data/'''''<
>
'''''- - - - - - - /boot/'''''<
>
'''''- - - - - - - - - - - /grub/'''''<
>
'''''- - - - - - - /iso/'''''<
>
Now we add 2 folders in '''''/iso''''', one for the other ISOs and one for Debian (this is a workaround for a [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=701772|known bug]]).<
>
`root@debianvm:~#` '''mkdir /mnt/data/iso/debian'''<
>
`root@debianvm:~#` '''mkdir /mnt/data/iso/others'''<
>
Let's download some ISOs, here i will explain ho to configure grub to boot Debian XFCE amd64 Installer and Tails i386; [[https://wiki.archlinux.org/index.php/Multiboot_USB_drive#Boot_entries|here]] there are instructions for other distros.
==== Debian ====
Download:
* iso from [[http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-8.5.0-amd64-xfce-CD-1.iso|http]] or [[http://cdimage.debian.org/debian-cd/current/amd64/bt-cd/debian-8.5.0-amd64-xfce-CD-1.iso.torrent|torrent]]
* [[https://mirrors.kernel.org/debian/dists/stable/main/installer-amd64/current/images/hd-media/vmlinuz|vmlinuz]]
* [[https://mirrors.kernel.org/debian/dists/stable/main/installer-amd64/current/images/hd-media/initrd.gz|initrd]]
And put these files into '''''/mnt/data/debian/'''''
==== Tails ====
Download the iso [[https://tails.boum.org/torrents/files/tails-i386-2.5.torrent|torrent]].
Then create a folder for tails and copy there the iso.
`root@debianvm:~#` '''mkdir /mnt/data/others/tails'''<
>
In '''''/mnt/data''''' we should now have <
>
'''''/mnt/data/'''''<
>
'''''- - - - - - - /boot/'''''<
>
'''''- - - - - - - - - - - /grub/'''''<
>
'''''- - - - - - - /iso/'''''<
>
'''''- - - - - - - - - - - /debian/'''''<
>
'''''- - - - - - - - - - - - - - - - debian-8.5.0-amd64-xfce-CD-1.iso'''''<
>
'''''- - - - - - - - - - - - - - - - vmlinuz'''''<
>
'''''- - - - - - - - - - - - - - - - initrd.gz'''''<
>
'''''- - - - - - - - - - - /others/'''''<
>
'''''- - - - - - - - - - - - - - - - /tails/'''''<
>
'''''- - - - - - - - - - - - - - - - - - - - tails-i386-2.5.iso'''''<
>
=== Step 7: configure grub ===
Now we need to configure grub; grub at boot reads its config from a config file (grub.cfg). Create a '''grub.cfg''' file with the following content and copy it into '''''/mnt/data/boot/grub/''''':
{{{
# path to the partition holding ISO images (using UUID)
probe -u $root --set=rootuuid
set imgdevpath="/dev/disk/by-uuid/$rootuuid"
insmod exfat
# Setup video
if [ "$grub_platform" = "efi" ]
then
insmod efi_gop
insmod efi_uga
fi
if [ "$grub_platform" = "pc" ]
then
insmod vbe
fi
# Setup font
insmod font
if loadfont ${prefix}/fonts/unicode.pf2
then
insmod gfxterm
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
fi
# Setup GRUB Screen
insmod jpeg
if background_image /boot/grub/grub_bg.jpg ; then
set color_normal=white/black
set color_highlight=white/green
else
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
fi
menuentry "Tails 2.5 i386" {
set isofile='/iso/others/tails/tails-i386-2.5.iso'
loopback loop $isofile
linux (loop)/live/vmlinuz2 boot=live config findiso=${isofile} live-media=removable apparmor=1 security=apparmor nopersistent noprompt timezone=Etc/UTC block.events_dfl_poll_msecs=1000 noautologin module=Tails i2p
initrd (loop)/live/initrd2.img
}
menuentry 'Debian 8.5.0 amd64 CD 1 XFCE' {
set isofile='/iso/debian/debian-8.5.0-amd64-xfce-CD-1.iso'
set initrdfile='/iso/debian/initrd.gz'
loopback loop $isofile
linux (loop)/install.amd/vmlinuz iso-scan/ask_second_pass=true
initrd $initrdfile
}
menuentry "Reboot" {
echo "System rebooting..."
reboot
}
menuentry "Shutdown" {
echo "System shutting down..."
halt
}
}}}
It's done!
If you want to customize grub's background copy a .jpg into '''''/mnt/boot/grub/''''' and rename it '''grub_bg.jpg'''.
Now unmount the USB drive and test it.<
>
`root@debianvm:~#` '''umount /mnt/efi'''<
>
`root@debianvm:~#` '''umount /mnt/data'''<
>
Sources: [[https://wiki.archlinux.org/index.php/Multiboot_USB_drive|arch linux wiki]] and many other sites.