Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revisionBoth sides next revision
linux_faq:universal_multiboot_grub_bios_uefi [2019/11/12 11:21] – [Hybrid MBR - гибридный MBR] adminlinux_faq:universal_multiboot_grub_bios_uefi [2021/09/07 07:09] – [Разметка флешки] admin
Line 1: Line 1:
 +====== Универсальная загрузочная флешка для BIOS/UEFI ======
 +В один прекрасный момент я стал обладателем машинки, которая загружалась только с помощью **UEFI**. Переключателя на классический режим загрузки в **BIOS** не обнаружилось. Загрузиться с моей любимой [[linux_faq:мультизагрузочная_флешка_с_помощью_grub|Мультизагрузочной 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
 +
 +====== Разметка флешки ======
 +Полностью переразмечаем диск. Создадим четыре раздела.
 +  - Раздел с данными, на котором будут лежать ISO-образы и конфигурация **grub**.
 +  - Раздел 8Gb для распакованного дистрибутива **Windows** (или образа **WinPE**).
 +  - Загрузочный раздел **EFI** (размер - 48 Мб).
 +  - Загрузочный раздел **BIOS** (размер 1 Мб).
 +<code>
 +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
 +</code>
 +
 +Отформатируем разделы и смонтируем их. \\
 +Разделы с данными будем форматировать в **NTFS**. Это позволит работать с флехой из-под **Windows** и заливать большие файлы (больше 4-х Гб). \\
 +Как ни странно, и **KNOPPIX** и **SystemRescueCD** нормально загрузились с помощью образов, размещенных на разделах, отформатированных в **NTFS**!!! \\
 +Стоит отметить, что при использовании **ntfs-3g**, запись на разделы отформатированные в **NTFS** в **Linux** происходит гораздо медленнее, чем на разделы **FAT32** или **ExFAT**. Однако, с этим можно смириться - ведь образы заливаешь один раз, но при этом - сохраняется возможность работать с флехой под виндой и загружаться с больших образов. 
 +
 +<code>
 +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/
 +</code>
 +
 +Установим **grub** и **EFI**:
 +<code>
 +sudo grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt/usb_efi/ --boot-directory=/mnt/usb_data/boot-grub --verbose
 +sudo grub-install --target=i386-pc --recheck --boot-directory=/mnt/usb_data/boot-grub $disk --verbose
 +</code>
 + 
 +Ну и дальше настраиваем **grub**, редактируя файлик **/mnt/usb_data/boot-grub/grub/grub.cfg**: \\
 +http://trcmdisk01.tripod.com/linux/s_mmlf01.html \\
 +<code>
 +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 "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
 +}</code>
 +
 +
 +====== Загрузка образов дискет (FreeDOS, MemTest, MHDD, etc...) ======
 +В образе **SystemRescueCD** в папке **/bootdisk** есть образы дискет **DOS** с разными утилитами. Пока что мне не удалось запустить ни один из таких образов. Однако, известно, что для их запуска используется утилита [[https://www.syslinux.org/wiki/index.php?title=MEMDISK|memdisk]], которая лежит в папке **/isolinux**. \\
 +Немного информации есть тут: https://www.linux.org.ru/forum/general/9653654 \\
 +Общий принцип - в качестве ядра указывается **memdisk**, а в качестве **initrd** - образ дискеты
 +<code>linux16 (loop)/isolinux/memdisk
 +initrd16 (loop)/isolinux/fdboot.img</code>
 +
 +====== Установка Windows с такой UEFI-флешки ======
 +После копирования файлов iso-образа на раздел:
 +  rsync -av /mnt/cdrom/ /mnt/flash/
 +Выяснилось, что стандартный способ загрузки Windows из **grub** на такой флешке не работает! \\
 +<code>menuentry "Windows 10 Installer" {
 +    insmod ntfs
 +    search --set=root --file /bootmgr
 +    ntldr /bootmgr
 +    boot
 +}</code>
 +Оказалось, что **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**. \\
 +Такая конфигурация не описана стандартами и разные ОС обрабатывают её по разному. Поведение различных ОС при встрече с таким чудом [[https://www.rodsbooks.com/gdisk/hybrid.html#reactions|описано тут]]. \\
 +Запускаем **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).   
 +
 +
  
  • linux_faq/universal_multiboot_grub_bios_uefi.txt
  • Last modified: 2021/09/07 07:49
  • by admin