Универсальная загрузочная флешка для BIOS/UEFI
В один прекрасный момент я стал обладателем машинки, которая загружалась только с помощью UEFI. Переключателя на классический режим загрузки в BIOS не обнаружилось. Загрузиться с моей любимой Мультизагрузочной Linux-флешки оказалось невозможно. Более того - оказалось невозможно загрузиться и с помощью многих других образов, загрузчик в которых не работал с EFI.
Настало время переделать мультизагрузочную флешку, чтобы она работала на любых системах!
По мотивам https://wiki.archlinux.org/index.php/Multiboot_USB_drive#Hybrid_UEFI_GPT_.2B_BIOS_GPT.2FMBR_boot
Подготовка
На Ubuntu надо поставить такое:
sudo add-apt-repository universe sudo apt-get install grub-efi-amd64-bin exfat-fuse exfat-utils
или, если exfat-utils в вашем дистрибутиве нет, то:
sudo apt-get install grub-efi-amd64-bin exfat-fuse exfatprogs
Разметка флешки
Полностью переразмечаем диск. Создадим четыре раздела.
- Раздел с данными, на котором будут лежать ISO-образы и конфигурация grub.
- Раздел 8Gb для распакованного дистрибутива Windows (или образа WinPE).
- Загрузочный раздел EFI (размер - 48 Мб).
- Загрузочный раздел BIOS (размер 1 Мб).
disk='/dev/sdX' disk_size=`expr $(sudo sgdisk -p $disk | awk '/Disk \// {print($3)}')` sudo sgdisk --zap-all $disk sudo sgdisk --mbrtogpt --clear $disk sudo sgdisk --new=1:2048:$(expr $disk_size - 16877568) $disk sudo sgdisk --typecode=1:0700 $disk sudo sgdisk --new=2:$(expr $disk_size - 16875520):$(expr $disk_size - 102401) $disk sudo sgdisk --typecode=2:0700 $disk sudo sgdisk --new=3:$(expr $disk_size - 102400):$(expr $disk_size - 4097) $disk sudo sgdisk --typecode=3:EF00 $disk sudo sgdisk --new=4:$(expr $disk_size - 4096):$(expr $disk_size - 34) $disk sudo sgdisk --typecode=4:EF02 $disk sudo sgdisk --attributes=4:set:2 $disk
Отформатируем разделы и смонтируем их.
Разделы с данными будем форматировать в NTFS. Это позволит работать с флехой из-под Windows и заливать большие файлы (больше 4-х Гб).
Как ни странно, и KNOPPIX и SystemRescueCD нормально загрузились с помощью образов, размещенных на разделах, отформатированных в NTFS!!!
Стоит отметить, что при использовании ntfs-3g, запись на разделы отформатированные в NTFS в Linux происходит гораздо медленнее, чем на разделы FAT32 или ExFAT. Однако, с этим можно смириться - ведь образы заливаешь один раз, но при этом - сохраняется возможность работать с флехой под виндой и загружаться с больших образов.
sudo mkfs.vfat -F 32 ${disk}3 sudo mkfs.ntfs -f ${disk}1 sudo mkfs.ntfs -f ${disk}2 sudo mkdir /mnt/usb_efi sudo mkdir /mnt/usb_data/ sudo mount -o async,big_writes,noatime ${disk}1 /mnt/usb_data/ sudo mount ${disk}3 /mnt/usb_efi/
Установка grub и EFI
sudo grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt/usb_efi/ --boot-directory=/mnt/usb_data/boot-grub ${disk} sudo grub-install --target=i386-pc --recheck --boot-directory=/mnt/usb_data/boot-grub --force ${disk}
grub.cfg
Ну и дальше настраиваем grub, редактируя файлик /mnt/usb_data/boot-grub/grub/grub.cfg:
http://trcmdisk01.tripod.com/linux/s_mmlf01.html
set gfxmode=auto
insmod all_video
# https://github.com/dwarmstrong/grubs/blob/master/boot/grub/grub.cfg.sample
submenu "Ubuntu ->" {
set menu_color_normal=white/black
set menu_color_highlight=white/green
menuentry "Try or Install Xubnuntu 24.04.01 Minimal" {
set iso="/xubuntu-24.04.1-minimal-amd64.iso"
loopback loop ${iso}
linux (loop)/casper/vmlinuz iso-scan/filename=${iso} file=(loop)/cdrom/preseed/xubuntu.seed maybe-ubiquity quiet splash ---
initrd (loop)/casper/initrd
}
menuentry "Try or Install Kubuntu 24.04.1" {
set iso="/kubuntu-24.04.1-desktop-amd64.iso"
loopback loop ${iso}
linux (loop)/casper/vmlinuz iso-scan/filename=${iso} --- quiet splash
initrd (loop)/casper/initrd
}
menuentry "Try or Install Linux Mint 21.3 Cinnamon 64-bit" {
set iso="/linuxmint-21.3-cinnamon-64bit.iso"
loopback loop ${iso}
linux (loop)/casper/vmlinuz iso-scan/filename=${iso} boot=casper username=mint hostname=mint quiet splash --
initrd (loop)/casper/initrd.lz
}
menuentry "Try or Install Kubnuntu 19.04 Desktop" {
set iso="/kubuntu-19.04-desktop-amd64.iso"
loopback loop ${iso}
set gfxpayload=keep
linux (loop)/casper/vmlinuz iso-scan/filename=${iso} file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
initrd (loop)/casper/initrd
}
menuentry "Install Kubnuntu 18.04.1 Desktop" {
set iso="/kubuntu-18.04.1-desktop-amd64.iso"
loopback loop ${iso}
set gfxpayload=keep
linux (loop)/casper/vmlinuz iso-scan/filename=${iso} file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
initrd (loop)/casper/initrd
}
}
submenu "Debian ->" {
menuentry "Live system (amd64)" --hotkey=l {
set iso="/debian-live-12.9.0-amd64-xfce.iso"
loopback loop ${iso}
linux (loop)/live/vmlinuz-6.1.0-29-amd64 boot=live components quiet splash iso-scan/filename=${iso} findiso=${iso}
initrd (loop)/live/initrd.img-6.1.0-29-amd64
}
menuentry "Live system (amd64 fail-safe mode) ????" {
set iso="/debian-live-12.9.0-amd64-xfce.iso"
loopback loop ${iso}
linux (loop)/live/vmlinuz-6.1.0-29-amd64 boot=live components memtest noapic noapm nodma nomce nosmp nosplash vga=788 iso-scan/filename=${iso} findiso=${iso}
initrd (loop)/live/initrd.img-6.1.0-29-amd64
}
menuentry 'Start Debian 12.9.0 installer' {
set iso="/debian-live-12.9.0-amd64-xfce.iso"
loopback loop ${iso}
linux (loop)/install/gtk/vmlinuz iso-scan/filename=${iso} vga=788 --- quiet
initrd (loop)/install/gtk/initrd.gz
}
menuentry 'Debian 12.9.0 i386 Graphical install' {
set iso="/debian-12.9.0-i386-DVD-1.iso"
loopback loop ${iso}
set background_color=black
linux (loop)/install.386/vmlinuz iso-scan/filename=${iso} vga=788 --- quiet
initrd (loop)/install.386/gtk/initrd.gz
}
}
submenu "KNOPPIX ->" {
set menu_color_normal=white/black
set menu_color_highlight=white/green
menuentry "KNOPPIX_V9.1DVD-2021-01-25-EN LiveCD 64-bit Linux Kernel v.5.10.10" {
set iso="/KNOPPIX_V9.1DVD-2021-01-25-EN.iso"
loopback loop ${iso}
linux (loop)/boot/isolinux/linux64 bootfrom=${iso} keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}
menuentry "KNOPPIX_V8.6.1-2019-10-14-EN LiveCD 32-bit Linux Kernel v5.3.5" {
set iso="/KNOPPIX_V8.6.1-2019-10-14-EN.iso"
loopback loop ${iso}
linux (loop)/boot/isolinux/linux bootfrom=${iso} keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}
menuentry "KNOPPIX_V7.2.0CD-2013-06-16-EN LiveCD NOT WORKING. Kernel panic. No init found. Try passing init= option to kernel" {
set iso="/KNOPPIX_V7.2.0CD-2013-06-16-EN.iso"
loopback loop ${iso}
linux (loop)/boot/isolinux/linux bootfrom=${iso} keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}
}
submenu "SystemRescueCD ->" {
set menu_color_normal=white/black
set menu_color_highlight=white/green
menuentry 'Boot SystemRescue 11.03 using default options' {
set gfxpayload=keep
probe --set devuuid --fs-uuid (hd0,gpt1)
set iso="/systemrescue-11.03-amd64.iso"
loopback loop ${iso}
linux (loop)/sysresccd/boot/x86_64/vmlinuz archisobasedir=sysresccd img_dev=/dev/disk/by-uuid/${devuuid} img_loop=${iso} iomem=relaxed
initrd (loop)/sysresccd/boot/intel_ucode.img (loop)/sysresccd/boot/amd_ucode.img (loop)/sysresccd/boot/x86_64/sysresccd.img
}
menuentry 'Boot SystemRescue 11.03 and copy system to RAM (copytoram)' {
set gfxpayload=keep
probe --set devuuid --fs-uuid (hd0,gpt1)
set iso="/systemrescue-11.03-amd64.iso"
loopback loop ${iso}
linux (loop)/sysresccd/boot/x86_64/vmlinuz archisobasedir=sysresccd iomem=relaxed img_dev=/dev/disk/by-uuid/${devuuid} img_loop=${iso} copytoram
initrd (loop)/sysresccd/boot/intel_ucode.img (loop)/sysresccd/boot/amd_ucode.img (loop)/sysresccd/boot/x86_64/sysresccd.img
}
menuentry 'Boot SystemRescue 11.03 using basic display drivers (nomodeset)' {
set gfxpayload=keep
probe --set devuuid --fs-uuid (hd0,gpt1)
set iso="/systemrescue-11.03-amd64.iso"
loopback loop ${iso}
linux (loop)/sysresccd/boot/x86_64/vmlinuz archisobasedir=sysresccd img_dev=/dev/disk/by-uuid/${devuuid} img_loop=${iso} iomem=relaxed nomodeset
initrd (loop)/sysresccd/boot/intel_ucode.img (loop)/sysresccd/boot/amd_ucode.img (loop)/sysresccd/boot/x86_64/sysresccd.img
}
menuentry "SystemRescueCD 5.3.1 Live, linux kernel v.4.14 (64bit, cache all files in memory and startX) wont start X on AMD Ryzen 4000 series. Shell seems to work." {
set iso="/systemrescuecd-x86-5.3.1.iso"
loopback loop ${iso}
linux (loop)/isolinux/rescue64 isoloop=${iso} setkmap=us docache dostartx nomodeset
initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCD 5.3.1 Live (64bit, default boot options)" {
set iso="/systemrescuecd-x86-5.3.1.iso"
loopback loop ${iso}
linux (loop)/isolinux/rescue64 isoloop=${iso} setkmap=us nomodeset
initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCd 5.3.1 Live (32bit, default boot options)" {
set iso="/systemrescuecd-x86-5.3.1.iso"
loopback loop ${iso}
linux (loop)/isolinux/rescue32 isoloop=${iso} setkmap=us docache nomodeset
initrd (loop)/isolinux/initram.igz
}
}
submenu "Windows ->" {
set menu_color_normal=white/black
set menu_color_highlight=white/green
menuentry "Windows 10 Installer" {
insmod ntfs
search --set=root --file /bootmgr
ntldr /bootmgr
boot
}
menuentry "Windows 7 or Windows 10 installer" --class windows --class os {
insmod part_msdos
insmod ntfs
insmod ntldr
search --no-floppy --file /bootmgr --set=root
ntldr /bootmgr
boot
}
}
submenu 'Utilities...' {
menuentry 'Memtest86+ memory tester for UEFI from SystemRescueCD 11.03' {
insmod fat
set gfxpayload=800x600,1024x768
set iso="/systemrescue-11.03-amd64.iso"
loopback loop ${iso}
linux (loop)/EFI/memtest.efi keyboard=both
}
menuentry "Memtest 86+ (from Kubnuntu 24.04.1)" {
loopback loop /kubuntu-24.04.1-desktop-amd64.iso
set gfxpayload=keep
linux16 (loop)/boot/memtest86+x64.bin
}
menuentry 'Start EFI Shell' {
insmod fat
insmod chain
terminal_output console
set iso="/systemrescue-11.03-amd64.iso"
loopback loop ${iso}
chainloader (loop)/EFI/shell.efi
}
}
ну и старая версия
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
menuentry "Install Kubnuntu 21.04 Desktop" {
loopback loop /kubuntu-21.04-desktop-amd64.iso
set gfxpayload=keep
linux (loop)/casper/vmlinuz iso-scan/filename=/kubuntu-21.04-desktop-amd64.iso file=(loop)/preseed/kubuntu.seed maybe-ubiquity quiet splash ---
initrd (loop)/casper/initrd
}
menuentry "KNOPPIX_V8.2-2018-05-10-EN LiveCD" {
loopback loop /KNOPPIX_V8.2-2018-05-10-EN.iso
linux (loop)/boot/isolinux/linux bootfrom=/KNOPPIX_V8.2-2018-05-10-EN.iso keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}
menuentry "KNOPPIX_V7.2.0CD-2013-06-16-EN LiveCD" {
loopback loop /KNOPPIX_V7.2.0CD-2013-06-16-EN.iso
linux (loop)/boot/isolinux/linux bootfrom=/KNOPPIX_V7.2.0CD-2013-06-16-EN.iso keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}
menuentry "SystemRescueCd 5.3.1 Live (64bit, cache all files in memory and startX)" {
loopback loop /systemrescuecd-x86-5.3.1.iso
linux (loop)/isolinux/rescue64 isoloop=/systemrescuecd-x86-5.3.1.iso setkmap=us docache dostartx
initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCd 5.3.1 Live (64bit, default boot options)" {
loopback loop /systemrescuecd-x86-5.3.1.iso
linux (loop)/isolinux/rescue64 isoloop=/systemrescuecd-x86-5.3.1.iso setkmap=us
initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCd 5.3.1 Live (32bit, default boot options)" {
loopback loop /systemrescuecd-x86-5.3.1.iso
linux (loop)/isolinux/rescue32 isoloop=/systemrescuecd-x86-5.3.1.iso setkmap=us
initrd (loop)/isolinux/initram.igz
}
menuentry "Install Kubnuntu 18.04.1 Desktop" {
loopback loop /kubuntu-18.04.1-desktop-amd64.iso
set gfxpayload=keep
linux (loop)/casper/vmlinuz iso-scan/filename=/kubuntu-18.04.1-desktop-amd64.iso file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
initrd (loop)/casper/initrd
}
menuentry "Install Kubnuntu 18.04.2 Server" {
set isofile="/ubuntu-18.04.2-live-server-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz iso-scan/filename=$isofile boot=casper quiet ---
initrd (loop)/casper/initrd
}
menuentry "Install Kubnuntu 19.04 Desktop" {
loopback loop /kubuntu-19.04-desktop-amd64.iso
set gfxpayload=keep
linux (loop)/casper/vmlinuz iso-scan/filename=/kubuntu-19.04-desktop-amd64.iso file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
initrd (loop)/casper/initrd
}
menuentry "Install Ubnuntu 20.04 Server" {
insmod part_gpt
insmod ext2
insmod search_fs_uuid
rmmod tpm
search --no-floppy --set=root --fs-uuid 36c1a912-77c7-4cec-8120-c2088e1e131c
set isofile="/ubuntu-20.04-live-server-amd64.iso"
set gfxpayload=keep
loopback loop ($root)$isofile
linux (loop)/casper/vmlinuz iso-scan/filename=${isofile} quiet ---
initrd (loop)/casper/initrd
}
menuentry "Install Ubuntu Server 16.04 i386" {
loopback loop /ubuntu-16.04.6-server-i386.iso
set gfxpayload=keep
linux (loop)/install/vmlinuz isoloop=/ubuntu-16.04.6-server-i386.iso file=/cdrom/preseed/ubuntu-server.seed quiet splash ---
initrd (loop)/install/initrd.gz
}
menuentry "Install Ubuntu Server 16.04 x64" {
loopback loop /ubuntu-16.04.6-server-amd64.iso
set gfxpayload=keep
linux (loop)/install/vmlinuz iso-scan/filename=/ubuntu-16.04.6-server-amd64.iso file=/cdrom/preseed/ubuntu-server.seed quiet splash ---
initrd (loop)/install/initrd.gz
}
menuentry 'Debian 10 i386 Install' {
set background_color=black
loopback loop /debian-edu-10.0.0-i386-netinst.iso
linux (loop)/install.386/gtk/vmlinuz findiso=/debian-edu-10.0.0-i386-netinst.iso modules=debian-edu-install-udeb desktop=xfce vga=788 --- quiet
initrd (loop)/install.386/gtk/initrd.gz
}
menuentry "Memtest 86+ (from Kubnuntu 19.04)" {
loopback loop /kubuntu-19.04-desktop-amd64.iso
set gfxpayload=keep
linux16 (loop)/install/mt86plus
}
Загрузка образов дискет (FreeDOS, MemTest, MHDD, etc...)
В образе SystemRescueCD в папке /bootdisk есть образы дискет DOS с разными утилитами. Пока что мне не удалось запустить ни один из таких образов. Однако, известно, что для их запуска используется утилита memdisk, которая лежит в папке /isolinux.
Немного информации есть тут: https://www.linux.org.ru/forum/general/9653654
Общий принцип - в качестве ядра указывается memdisk, а в качестве initrd - образ дискеты
linux16 (loop)/isolinux/memdisk initrd16 (loop)/isolinux/fdboot.img
Установка Windows с такой UEFI-флешки
После копирования файлов iso-образа на раздел:
rsync -av /mnt/cdrom/ /mnt/flash/
Выяснилось, что стандартный способ загрузки Windows из grub на такой флешке не работает!
menuentry "Windows 10 Installer" { insmod ntfs search --set=root --file /bootmgr ntldr /bootmgr boot }
Оказалось, что bootmgr, используемый для загрузки компьютеров с BIOS не загружается с GPT-разделов. С GPT-разделов может загружаться только bootx64.efi, для работы которого нужен EFI.
Если попытаться загрузить bootmgr с такой флешки, то комп просто перезагрузится. Без всяких сообщений.
Вариантов загрузки Windows на BIOS-компьютере с GPT-диском несколько.
Первый - DUET (Developer’s UEFI Environment). В этом случае, сначала загружается эмулятор EFI, который загружает bootx64.efi.
Второй - использование режима hybrid MBR. Это можно сделать утилитой gdisk.
Hybrid MBR - гибридный MBR
https://www.rodsbooks.com/gdisk/hybrid.html
Обычный GPT-диск имеет запись MBR с единственным разделом типа 0xEE (EFI GPT), внутри которого размещаются разделы GPT.
Гибридный MBR, помимо основного раздела типа 0xEE (EFI GPT) может содержать сведения о дополнительных (до трех штук) разделах, границы которых совпадают с границами разделов, описанных в GPT.
Таким образом, операционки и утилиты, которые не знают ничего про GPT смогут работать и с GPT-разделов. Просто сведения о них они будут получать из MBR.
Очень важно, не давать таким утилитам и операционкам изменять таблицу разделов. В противном случае - они просто порушат GPT.
Такая конфигурация не описана стандартами и разные ОС обрабатывают её по разному. Поведение различных ОС при встрече с таким чудом описано тут.
Запускаем gdisk:
sudo gdisk $disk
Переходим в Recovery/transformation меню:
r
Теперь создаем гибридную запись MBR:
h
Программа спросит - какие разделы должны быть добавлены в таблицу разделов гибридной записи вводим их номера через пробел:
Type from one to three GPT partition numbers, separated by spaces, to be added to the hybrid MBR, in sequence:1 2 3 4
Дальше - система спросит хотим ли мы разместить первой таблицу EFI, чтобы работал GRUB. Отвечаем yes.
А также - какие коды типов присвоить разделам гибридной таблицы и делать ли их загрузочными.
Загрузочной делаем только 4-ю партицию.
Записываем изменения w.
В двух словах - диск с гибридизированными разделами нельзя модифицировать утилитами, которые к этому не готовы (fdisk).
Discussion