Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next 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 [2020/04/16 07:29] – [Разметка флешки] 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
 +}
 +<code>menuentry "Memtest 86+ (from Kubnuntu 19.04)" {
 +    loopback loop /kubuntu-19.04-desktop-amd64.iso
 + set gfxpayload=keep
 + linux16 (loop)/install/mt86plus
 +}</code>
 +</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