Compare commits
1 Commits
9a0eadd903
...
9927855e53
Author | SHA1 | Date |
---|---|---|
Adrian | 9927855e53 |
|
@ -0,0 +1,189 @@
|
|||
# 3-in-1 Hybrid Boot Disk (BIOS/UEFI)
|
||||
|
||||
This guide shows how to prepare a disk on Ubuntu
|
||||
to be bootable from BIOS, 32-bit and 64-bit UEFI
|
||||
with Secure Boot enabled.
|
||||
The intention is to create a bootable USB stick
|
||||
that can be used to boot a rescue system.
|
||||
|
||||
All commands should be executed as root.
|
||||
|
||||
For more technical information, see the [notes section](#notes) at the end.
|
||||
|
||||
Grub will be used as the bootloader.
|
||||
Install the following packages:
|
||||
|
||||
apt install grub-efi-amd64-bin grub-efi-ia32-bin grub-pc-bin
|
||||
apt install grub-efi-amd64-signed # grub-efi-ia32-signed not available on Ubuntu
|
||||
|
||||
## Partitioning
|
||||
|
||||
* The GUIDs are fixed for easier setup with Windows
|
||||
* The last partition is optional: it can be used to make changes of Ubuntu persistent
|
||||
* Set the `dev` variable accordingly
|
||||
|
||||
<!-- -->
|
||||
|
||||
dev=/path/to/dev
|
||||
|
||||
sgdisk --disk-guid=4b534944-4949-4949-b741-44495858580a $dev
|
||||
|
||||
sgdisk --new=1:1M:+1M --typecode=1:ef02 --partition-guid=1:42555247-4949-4949-b741-44495858580a $dev
|
||||
sgdisk --new=2:2M:+14M --typecode=2:ef00 --partition-guid=2:49494645-4949-4949-b741-44495858580a $dev
|
||||
sgdisk --new=3:16M:+496M --typecode=3:2700 --partition-guid=3:524e4957-4945-4949-b741-44495858580a $dev
|
||||
sgdisk --new=4:512M:+2048M --typecode=4:8300 --partition-guid=4:4e554255-5554-4949-b741-44495858580a $dev
|
||||
sgdisk --new=5:2560M:4G --typecode=5:8300 --partition-guid=5:50534143-5245-4949-b741-44495858580a $dev
|
||||
|
||||
## Format
|
||||
|
||||
* Run `partprobe` before working with the disk references below
|
||||
* The labels are set for easier configuration of GRUB
|
||||
* The first partition is not formatted as it will be used by GRUB to store its executable code
|
||||
|
||||
<!-- -->
|
||||
|
||||
mkdosfs -F 16 -n hybrid-boot /dev/disk/by-partuuid/49494645-4949-4949-b741-44495858580a
|
||||
mkntfs -Q -L hybrid-winre /dev/disk/by-partuuid/524e4957-4945-4949-b741-44495858580a
|
||||
mkfs.ext4 -L hybrid-ubuntu /dev/disk/by-partuuid/4e554255-5554-4949-b741-44495858580a
|
||||
mkfs.ext4 -L casper-rw /dev/disk/by-partuuid/50534143-5245-4949-b741-44495858580a
|
||||
|
||||
## Install GRUB
|
||||
|
||||
* Set the `mnt` variable accordingly
|
||||
|
||||
<!-- -->
|
||||
|
||||
mnt=/path/to/mount
|
||||
|
||||
mount /dev/disk/by-partuuid/4e554255-5554-4949-b741-44495858580a $mnt
|
||||
mkdir -p $mnt/boot/efi
|
||||
mount /dev/disk/by-partuuid/49494645-4949-4949-b741-44495858580a $mnt/boot/efi
|
||||
|
||||
grub-install --root=$mnt --removable --no-nvram --uefi-secure-boot --target=x86_64-efi $dev
|
||||
grub-install --root=$mnt --removable --no-nvram --uefi-secure-boot --target=i386-efi $dev
|
||||
grub-install --root=$mnt --modules='ext2 part_gpt' --target=i386-pc $dev
|
||||
|
||||
Place the following configuration snippets in `$mnt/boot/grub/grub.cfg`.
|
||||
|
||||
### Ubuntu
|
||||
|
||||
menuentry 'Ubuntu' {
|
||||
search --set --label hybrid-ubuntu
|
||||
linux /casper/vmlinuz boot=casper ignore_uuid persistent
|
||||
initrd /casper/initrd
|
||||
}
|
||||
|
||||
The `persistent` parameter is only useful, if the persistence partition was created.
|
||||
|
||||
### Windows
|
||||
|
||||
menuentry 'Windows (UEFI)' {
|
||||
search --set --label hybrid-boot
|
||||
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
|
||||
}
|
||||
|
||||
menuentry 'Windows (BIOS)' {
|
||||
search --set --label hybrid-winre
|
||||
ntldr /Boot/bootmgr
|
||||
}
|
||||
|
||||
## Copy OS Files
|
||||
|
||||
### Ubuntu
|
||||
|
||||
* Set the `cdrom` variable accordingly
|
||||
|
||||
|
||||
cdrom=/path/to/ubuntu-iso
|
||||
|
||||
cp -r $cdrom/casper $cdrom/preseed $mnt
|
||||
|
||||
### Windows
|
||||
|
||||
* Set the `cdrom` and `winre` variables accordingly
|
||||
|
||||
<!-- -->
|
||||
|
||||
cdrom=/path/to/windows-iso
|
||||
winre=/path/to/winre-mnt
|
||||
|
||||
mount /dev/disk/by-partuuid/524e4957-4945-4949-b741-44495858580a $winre
|
||||
|
||||
wim=$cdrom/sources/install.wim
|
||||
|
||||
dir=$winre/Recovery
|
||||
mkdir $dir
|
||||
7z e -o$dir $wim 1/Windows/System32/Recovery/Winre.wim
|
||||
7z e -o$dir $wim 1/Windows/System32/boot.sdi
|
||||
|
||||
dir=$winre/Boot
|
||||
mkdir $dir
|
||||
7z e -o$dir $wim 1/Windows/Boot/PCAT/bootmgr
|
||||
|
||||
dir=$mnt/boot/efi/EFI/Microsoft/Boot
|
||||
mkdir -p $dir
|
||||
7z e -o$dir $wim 1/Windows/Boot/EFI/bootmgfw.efi
|
||||
|
||||
#### BCD
|
||||
|
||||
Copy [winre-uefi.bcd](winre-uefi.bcd) and [winre-bios.bcd](winre-bios.bcd):
|
||||
|
||||
cp winre-uefi.bcd $mnt/boot/efi/EFI/Microsoft/Boot/BCD
|
||||
cp winre-bios.bcd $winre/Boot/BCD
|
||||
|
||||
## Windows Hybrid Boot
|
||||
|
||||
Windows can not be booted from BIOS and UEFI with the same configuration.
|
||||
The above procedure enables Windows to boot using UEFI.
|
||||
|
||||
### Boot in BIOS
|
||||
|
||||
Windows needs an MBR to boot from BIOS:
|
||||
|
||||
sgdisk --hybrid=3 $dev
|
||||
printf DISK | dd bs=1 seek=440 conv=notrunc of=$dev
|
||||
|
||||
If you try to boot without the above configuration,
|
||||
the following message appears in the blink of an eye:
|
||||
|
||||
ata1 master: Unknown device
|
||||
|
||||
### Boot in UEFI
|
||||
|
||||
Remove the hybrid MBR:
|
||||
|
||||
echo start=1,type=ee | sfdisk -Y dos $dev
|
||||
|
||||
Do *not* use `sgdisk` because it wipes the MBR boot code of GRUB.
|
||||
|
||||
If you try to boot without the above configuration,
|
||||
the following message appears:
|
||||
|
||||
BlInitializeLibrary failed 0xc00000bb
|
||||
|
||||
## Notes
|
||||
|
||||
### Windows Bootloaders
|
||||
|
||||
The Windows bootloader is configured using a file called `BCD` (Boot Configuration Data).
|
||||
The file is a binary Windows Registry file and references IDs from the partition table.
|
||||
This can make Windows boot problems cumbersome to fix.
|
||||
|
||||
The above BCD files are usable if the disks were created using the described IDs.
|
||||
They were created in a VM using BCDEdit:
|
||||
[create-winre-uefi.bat](create-winre-uefi.bat) and
|
||||
[create-winre-bios.bat](create-winre-bios.bat).
|
||||
|
||||
The UEFI bootloader `bootmgfw.efi` uses the disk and partition GUIDs from the GPT.
|
||||
The BIOS bootloader `bootmgr` uses the disk signature and partition start offsets in the MBR.
|
||||
|
||||
To change GUIDs in a BCD, partitions with the same GUIDs can be recreated in a VM
|
||||
and BCDEdit can be used to recreate a BCD: [create-minimal.bat](create-minimal.bat).
|
||||
|
||||
Alternatively `hivexsh` can be used to change the GUIDs in an existing BCD.
|
||||
|
||||
### Casper Persistence
|
||||
|
||||
The casper manual mentions the use of a file,
|
||||
but this only works on FAT, see
|
||||
[find_cow_device in casper-helpers](https://git.launchpad.net/ubuntu/+source/casper/tree/scripts/casper-helpers).
|
|
@ -0,0 +1,14 @@
|
|||
@echo off
|
||||
|
||||
bcdedit /createstore minimal.bcd
|
||||
|
||||
bcdedit /store minimal.bcd /create {bootmgr}
|
||||
bcdedit /store minimal.bcd /create {2f4e4957-0d58-11e9-8000-080027414449} /application osloader /d "Windows 10"
|
||||
|
||||
bcdedit /store minimal.bcd /set {bootmgr} default {2f4e4957-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store minimal.bcd /set {bootmgr} displayorder {default}
|
||||
|
||||
bcdedit /store minimal.bcd /set {default} device partition=C:
|
||||
bcdedit /store minimal.bcd /set {default} osdevice partition=C:
|
||||
bcdedit /store minimal.bcd /set {default} path \Windows\System32\winload.efi
|
||||
bcdedit /store minimal.bcd /set {default} systemroot \Windows
|
|
@ -0,0 +1,19 @@
|
|||
@echo off
|
||||
|
||||
bcdedit /createstore winre-bios.bcd
|
||||
|
||||
bcdedit /store winre-bios.bcd /create {bootmgr}
|
||||
bcdedit /store winre-bios.bcd /create {2e455257-0d58-11e9-8000-080027414449} /application osloader /d "Windows Recovery Environment"
|
||||
bcdedit /store winre-bios.bcd /create {2e564544-0d58-11e9-8000-080027414449} /device
|
||||
|
||||
bcdedit /store winre-bios.bcd /set {bootmgr} default {2e455257-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-bios.bcd /set {bootmgr} displayorder {default}
|
||||
|
||||
bcdedit /store winre-bios.bcd /set {default} device ramdisk=[C:]\Recovery\Winre.wim,{2e564544-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-bios.bcd /set {default} osdevice ramdisk=[C:]\Recovery\Winre.wim,{2e564544-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-bios.bcd /set {default} path \Windows\System32\winload.exe
|
||||
bcdedit /store winre-bios.bcd /set {default} systemroot \Windows
|
||||
bcdedit /store winre-bios.bcd /set {default} winpe yes
|
||||
|
||||
bcdedit /store winre-bios.bcd /set {2e564544-0d58-11e9-8000-080027414449} ramdisksdidevice partition=C:
|
||||
bcdedit /store winre-bios.bcd /set {2e564544-0d58-11e9-8000-080027414449} ramdisksdipath \Recovery\boot.sdi
|
|
@ -0,0 +1,19 @@
|
|||
@echo off
|
||||
|
||||
bcdedit /createstore winre-uefi.bcd
|
||||
|
||||
bcdedit /store winre-uefi.bcd /create {bootmgr}
|
||||
bcdedit /store winre-uefi.bcd /create {2f455257-0d58-11e9-8000-080027414449} /application osloader /d "Windows Recovery Environment"
|
||||
bcdedit /store winre-uefi.bcd /create {2f564544-0d58-11e9-8000-080027414449} /device
|
||||
|
||||
bcdedit /store winre-uefi.bcd /set {bootmgr} default {2f455257-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-uefi.bcd /set {bootmgr} displayorder {default}
|
||||
|
||||
bcdedit /store winre-uefi.bcd /set {default} device ramdisk=[C:]\Recovery\Winre.wim,{2f564544-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-uefi.bcd /set {default} osdevice ramdisk=[C:]\Recovery\Winre.wim,{2f564544-0d58-11e9-8000-080027414449}
|
||||
bcdedit /store winre-uefi.bcd /set {default} path \Windows\System32\winload.efi
|
||||
bcdedit /store winre-uefi.bcd /set {default} systemroot \Windows
|
||||
bcdedit /store winre-uefi.bcd /set {default} winpe yes
|
||||
|
||||
bcdedit /store winre-uefi.bcd /set {2f564544-0d58-11e9-8000-080027414449} ramdisksdidevice partition=C:
|
||||
bcdedit /store winre-uefi.bcd /set {2f564544-0d58-11e9-8000-080027414449} ramdisksdipath \Recovery\boot.sdi
|
Binary file not shown.
Binary file not shown.
|
@ -1,136 +0,0 @@
|
|||
# Introduction
|
||||
|
||||
This guide describes how to create a bootable medium
|
||||
for the following purpose:
|
||||
|
||||
* Boot in BIOS (Legacy/CSM) mode
|
||||
* Boot in UEFI mode using Secure Boot
|
||||
* Start Ubuntu or a Windows 7, 8, or 10 installation
|
||||
|
||||
Set the following variables accordingly:
|
||||
|
||||
FULLDEV=/dev/sdb
|
||||
DEV=${FULLDEV}1
|
||||
MNT=/mnt
|
||||
|
||||
# Preparation
|
||||
|
||||
## Partition An Empty Medium
|
||||
|
||||
parted "$FULLDEV"
|
||||
mklabel msdos
|
||||
mkpart pri fat32 1MiB -1s
|
||||
set 1 boot on
|
||||
quit
|
||||
mkdosfs -F 32 -R 8 "$DEV"
|
||||
|
||||
## Create Directory Structure
|
||||
|
||||
See below for the config files `syslinux.cfg` and `grub.cfg`
|
||||
|
||||
mount -o shortname=winnt "$DEV" "$MNT"
|
||||
mkdir -p "$MNT"/boot/syslinux
|
||||
mkdir -p "$MNT"/boot/grub
|
||||
mkdir -p "$MNT"/efi/boot
|
||||
cp syslinux.cfg "$MNT"/boot/syslinux
|
||||
cp grub.cfg "$MNT"/boot/grub
|
||||
|
||||
# BIOS
|
||||
|
||||
syslinux -i -d boot/syslinux "$DEV"
|
||||
cd /usr/lib/syslinux
|
||||
for f in libutil libcom32 menu chain; do cp modules/bios/$f.c32 "$MNT"/boot/syslinux; done
|
||||
sh -c "cat mbr/mbr.bin > $FULLDEV"
|
||||
|
||||
Note: If a `Boot error` gets reported, try this:
|
||||
|
||||
* Try a 3.xx version
|
||||
* `mkdiskimage -4 $FULLDEV 0 64 32`
|
||||
|
||||
# UEFI
|
||||
|
||||
grub-install --target=x86_64-efi --uefi-secure-boot \
|
||||
--efi-directory="$MNT" --boot-directory="$MNT"/boot \
|
||||
--bootloader-id=boot --no-nvram "$DEV"
|
||||
cp /usr/lib/shim/shim.efi.signed "$MNT"/efi/boot/bootx64.efi
|
||||
|
||||
Note: Due to [a bug](https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1450783),
|
||||
the config file needs to be in efi/ubuntu:
|
||||
|
||||
mkdir -p "$MNT"/efi/ubuntu
|
||||
cp -a "$MNT"/efi/boot/grub.cfg "$MNT"/efi/ubuntu
|
||||
|
||||
# Copy OS files
|
||||
|
||||
## Ubuntu
|
||||
|
||||
Execute the following commands in the directory of the mounted ISO:
|
||||
|
||||
rsync -Pa casper preseed "$MNT"/
|
||||
|
||||
## Windows
|
||||
|
||||
Execute the following commands in the directory of the mounted ISO:
|
||||
|
||||
rsync -Pa sources boot efi "$MNT"/
|
||||
rm "$MNT"/sources/ei.cfg # To enable Edition selection
|
||||
cp bootmgr "$MNT"/boot
|
||||
7z e -o"$MNT"/efi/microsoft/boot sources/boot.wim 1/Windows/Boot/EFI/bootmgfw.efi
|
||||
|
||||
When copying Windows 8, the default bootloader gets replaced. Install Shim again:
|
||||
|
||||
cp /usr/lib/shim/shim.efi.signed "$MNT"/efi/boot/bootx64.efi
|
||||
|
||||
# Config Files
|
||||
|
||||
## syslinux.cfg
|
||||
|
||||
default menu.c32
|
||||
prompt 0
|
||||
|
||||
menu title Select Operating System
|
||||
|
||||
label ubuntu
|
||||
menu default
|
||||
menu label Start Ubuntu
|
||||
kernel /casper/vmlinuz.efi
|
||||
append initrd=/casper/initrd.lz file=/cdrom/preseed/ubuntu.seed boot=casper ignore_uuid maybe-ubiquity quiet splash --
|
||||
|
||||
label win7x64
|
||||
menu label Install Windows
|
||||
com32 chain.c32
|
||||
append fs ntldr=/boot/bootmgr
|
||||
|
||||
# grub.cfg
|
||||
|
||||
insmod efi_gop
|
||||
insmod efi_uga
|
||||
insmod font
|
||||
|
||||
menuentry "Start Ubuntu" {
|
||||
set gfxmode=auto
|
||||
set gfxpayload=keep
|
||||
linux /casper/vmlinuz.efi file=/cdrom/preseed/ubuntu.seed boot=casper ignore_uuid maybe-ubiquity quiet splash --
|
||||
initrd /casper/initrd.lz
|
||||
}
|
||||
|
||||
menuentry "Install Windows" {
|
||||
insmod part_gpt
|
||||
insmod chain
|
||||
set root='(hd0,1)'
|
||||
chainloader /efi/microsoft/boot/bootmgfw.efi
|
||||
}
|
||||
|
||||
menuentry "UEFI Setup" {
|
||||
fwsetup
|
||||
}
|
||||
|
||||
# Recommended Disk Partitioning for Multiboot Systems
|
||||
|
||||
parted /dev/sda
|
||||
mklabel gpt
|
||||
mkpart Boot fat32 1MiB 257MiB
|
||||
mkpart SysUbuntu ext4 257MiB 12GiB
|
||||
mkpart SysWin ntfs 12GiB 52GiB
|
||||
mkpart Data ext4 52GiB -1s
|
||||
set 1 esp on
|
Loading…
Reference in New Issue