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
Next revisionBoth sides next revision
linux_faq:universal_multiboot_grub_bios_uefi [2019/09/06 11:54] – [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