Мультизагрузочная флешка (multiboot flash drive with grub 2)

grub2, persistence live cd, grub.conf

Skafiend
6 min readDec 9, 2020

Grub2 установка из под windows

  • Заходим в распакованный архив из cmd
cd /d C:\grub-2.02-for-windows
  • Grub можно установить для трех платформ i386-pc, x86_64 и i386-efi. Утилита закинет необходимые файлы на флешку и пропишется в ее MBR.
Заливаем файлы для всех платформ
  • i386-pc (PHYSICALDRIVE2 — номер диска из diskpart, G: — буква, присваемая флешке Windows)
grub-install.exe --boot-directory=G:\ --target=i386-pc //./PHYSICALDRIVE2
  • x86_64-e
grub-install.exe --boot-directory=G:\ --efi-directory=G: --removable --target=x86_64-efi
  • i386-efi
grub-install.exe --boot-directory=G:\ --efi-directory=G: --removable --target=i386-efi
  • Свой файл grub.cfg кидаем на флешку в папку grub

Проверка флешки из под Windows (без перезагрузок)

Выбираем свою флешку, размер RAM и запускаем тест

Debian Live CD (persistent mode)

  • Скачиваем Redo Rescue: Backup and Recovery

https://sourceforge.net/projects/redobackup/

Из iso файла выдираем на флешку три файла. ВАЖНО!!! имена всех файлов должны быть исключительно в нижнем регистре. НИКАКИХ ЗАГЛАВНЫХ БУКВ!!!
  • Для live cd с сохранением изменений в наш файл grub.cfg добавляем следующие строки (примеры конфигураций лежат в iso образе boot/grub/grub.cfg)
menuentry "1. Rescue 4.0.0 Safe mode" --class anonymous --hotkey=1 {
linux /live/vmlinuz boot=live quiet splash noprompt nocomponents \
nomodeset toram setkmap=us
initrd /live/initrd
}
menuentry "2. Rescue 4.0.0 Persistence" --class parrot --hotkey=2 {
linux /live/vmlinuz boot=live quiet splash noprompt persistence nocomponents setkmap=us
initrd /live/initrd
}
  • Загружаемся с нашей флешки в Safe mode.

Создаем файл persistence отформатированный в файловую систему ext. В корень данного файла необходимо поместить файл persistence.conf. Сам файл persistence достаточно кинуть в корень любого раздела на флешке. Возможно способ работает с любым LiveCD Linux, я тестировал только Parrot и Redo

root@redorescue:~# dd if=/dev/zero of=persistence bs=1M count=256 
256+0 records in
256+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 0.0719142 s, 3.7 GB/s
root@redorescue:~# mkfs.ext2 -L persistence persistence
mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done
Creating filesystem with 262144 1k blocks and 65536 inodes
Filesystem UUID: 9efd1143–4aab-4d4f-950f-b4d19142583b
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
root@redorescue:~# mkdir test
root@redorescue:~# mount persistence test/
root@redorescue:~# echo / union > test/persistence.conf
root@redorescue:~# umount test/

В данном случае будет создан файл на 256mb с меткой раздела “persistence” и аналогичным названием. Не советую помещать файл на NTFS разделы, изменения сохраняются, но Live CD не может отмонтировать файл при выключении. С FAT32 таких проблем не замечено

  • Если мы хотим сделать раздел вместо файла на флешке.

Создаем раздел в файловой системе ext2, присвоиваем ему метку persistence, а в корень раздела помещаем файл persistence.conf с содержимым / union

root@redorescue:~# parted -l | grep -A15 Cruzer
Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdd: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 4195MB 4194MB primary fat32
2 4195MB 15.5GB 11.3GB primary ntfs
root@redorescue:~# parted
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) select /dev/sdd
Using /dev/sdd
(parted) mkpart primary ext2 15500 15756
(parted) quit
Information: You may need to update /etc/fstab.
root@redorescue:~# parted -l | grep -A10 Cruzer
Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdd: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 4195MB 4194MB primary fat32
2 4195MB 15.5GB 11.3GB primary ntfs
3 15.5GB 15.8GB 256MB primary
root@redorescue:~# mkfs.ext2 -L persistence /dev/sdd3
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 249856 1k blocks and 62496 inodes
Filesystem UUID: fd385626-bcd5–434c-a715-d35466aa9c43
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
root@redorescue:~# mkdir test
root@redorescue:~# mount /dev/sdd3 test/
root@redorescue:~# echo / union > test/persistence.conf
  • Перезагружаемся. Выбираем пункт меню Persistence и настраиваем систему под себя
  • Live CD сохраняющий изменения готов.

Grub.cfg

Установка Windows 10 с USB флешки

Просмотреть код -> Выбрать любое мобильное устройство -> Обновить страницу. После манипуляций появляется возможность скачать ISO
  • На флешке создаем NTFS раздел больше 8GB и распаковываем ISO образ на него, сохраняя структуру папок и файлов
  • В grub.cfg прописываем следующие строки
menuentry 'Windows 10 x64 Setup' --class windows --class os {    insmod part_msdos
insmod fat
insmod ntldr
search --no-floppy --fs-uuid --set=root 3EE0BE5975E558A3
ntldr /bootmgr
}
3EE0BE5975E558A3 — уникальный номер раздела в Linux узнается командой blkid, Windows аналог — утилита vol

blkid и vol могут выдавать разные UUID для одного и того же раздела (не знаю почему). Если результаты совпадают, то все ок grub их принимает, когда результаты отличаются grub обрабатывает только UUID полученный из Linux т.е. от blkid

  • Если мы запускаем grub с флешки, a bootmgr для установки цепляем с жесткого диска, то установка БУДЕТ КРАШИТЬСЯ на этапе разметки жесткого диска.

Memtest86

  • Выдираем файл mt86plus из \ubuntu-20.04.1-desktop-amd64.iso\install\
menuentry "Test memory" {
linux16 /iso/mt86plus
}

Загрузка с жесткого диска

  • hd1 это наш первый жесткий диск, после флешки hd0, а команда chainloader передает управление загрузчику с этого жесткого диска.
menuentry "Load Hard Disk" {
set root="(hd1)"
chainloader +1
}

Загрузка любого ISO образа в память

menuentry "Acronis True Image" {
search --no-floppy --fs-uuid --set=root 91E3-64EE
insmod memdisk
linux16 /boot/memdisk iso
initrd16 /TrueImage.iso
}

Установка темы оформления

  • Добавляем в grub.cfg:
dir=$prefix/themes/Vimix # каталог с темой
set theme=$dir/theme.txt # задаём файл описания
insmod regexp # этот модуль позволяет использовать шаблоны в именах файлов
loadfont $dir/*.pf2 # загружаем по шаблону сразу все шрифты из темы
insmod png # модуль поддержки картинок
insmod jpeg
set gfxmode=auto
set lang=ru
insmod gfxterm
insmod vbe
terminal_output gfxterm
  • Чтобы работали иконки из темы у пунктов меню, для каждого пункта нужно определить свойство class с названием иконки
menuentry "Parrot Persistence" --class parrot 
Тему взял здесь — https://www.gnome-look.org/p/1009236/

Пример файла grub.cfg

set default=0
set timeout=30
dir=$prefix/themes/Vimix # каталог с темой
set theme=$dir/theme.txt # задаём файл описания
insmod regexp # этот модуль позволяет использовать шаблоны в именах файлов
loadfont $dir/*.pf2 # загружаем по шаблону сразу все шрифты из темы
insmod png # модуль поддержки картинок
insmod jpeg
set gfxmode=auto
set lang=ru
insmod gfxterm
insmod vbe
terminal_output gfxterm
menuentry "Load Hard Disk" --class restart {
set root="(hd1)"
chainloader +1
}
menuentry "ParrotOS 4.10 RAM mode" --class anonymous {
linux /live/vmlinuz boot=live hostname=parrot quiet splash components noautomount toram
initrd /live/initrd.img
}
menuentry "ParrotOS 4.10 Persistence" --class parrot {
linux /live/vmlinuz --fs-uuid --set=root 20CD-DC42 boot=live hostname=parrot quiet splash components noautomount persistence
initrd /live/initrd.img
}
menuentry "Acronis True Image 2017" --class void {
search --no-floppy --fs-uuid --set=root 20CD-DC42
insmod memdisk
linux16 /memdisk iso
initrd16 /acronis.iso
}
menuentry 'Windows 10 October 2020 Update x64' --class windows {
insmod part_msdos
insmod fat
insmod ntfs
insmod ntldr
search --no-floppy --fs-uuid --set=root 63817B791E84B85A
ntldr /bootmgr
}
menuentry "Rescue 4.0.0 Safe mode" --class anonymous --hotkey=1 {
linux /live/vmlinuz boot=live quiet splash noprompt nocomponents \
nomodeset toram setkmap=us
initrd /live/initrd
}
menuentry "Rescue 4.0.0 Persistence" --class parrot --hotkey=2 {
linux /live/vmlinuz boot=live quiet splash noprompt persistence nocomponents setkmap=us
initrd /live/initrd
}
menuentry "Memtest86" --class memtest {
linux16 /mt86plus
}

--

--