Здравствуйте мои маленькие токсичные борцы с дивана.
Сегодня я расскажу вам как сделать загрузочную флешку, с которой вы сможете загрузать любой ISO образ, просто положив этот ISO образ на флешку.
Таким образом вы сможете создать мультизагрузочную флешку с Debian, Ubuntu, Arch и другими дистрибутивами. Любой Live-дистрибутив на выбор, и всё из одного меню.
Интересно?
Вся прелесть данного метода заключается в том, что, GRUB2 умеет монтировать ISO образы и загружаться в них напрямую!
Дублируя загрузочные пункты меню menuentry вы можете добавлять различные дистрибутивы и ISO образы!
Давайте более детально рассмотрим menuentry Debian, что тут есть:
menuentry "Debian GNU/Linux Live 11.6.0 kde+nonfree (linux 5.10.0-20-amd64)" {
iso_path=/debian-live-11.6.0-amd64-kde+nonfree.iso
export iso_path
loopback loop $iso_path
set root=(loop)
set loopback="findiso=${iso_path}"
export loopback
linux /live/vmlinuz-5.10.0-20-amd64 boot=live components toram \
locales=ru_RU.UTF-8 keyboard-model=pc105 keyboard-layouts=us,ru \
username=spoofing \
splash quiet "${loopback}"
initrd /live/initrd.img-5.10.0-20-amd64
}
iso_path указывает, где лежит необходимый ISO: в корне флешки.
Параметрами boot=live components toram мы загружаем систему целиком в RAM, так что потом флешку можно вытащить, и система с Debian/KDE останется рабочей!
Параметрами locales=ru_RU.UTF-8 keyboard-model=pc105 keyboard-layouts=us,ru мы задаём язык системы и раскладку клавиатуры из коробки, у нас будет доступно переключение на русский язык сразу после загрузки системы.
Параметр username=spoofing задаёт имя пользователя live, просто приятное дополнение, чтобы в терминале был ваш родной никнейм.

Для того, чтобы всё заработало, вам понадобится:
-
Пакеты grub2 и grub2-efi, скорее всего они у вас есть.
-
dosfstools для форматирования FAT32, утилита mkdosfs.
-
Все остальные утилиты типа fdisk, dd у вас уже есть.
Представляю вашему вниманию скрипт, чтобы создать загрузочную флешку.
#!/bin/sh
main () {
disk="$1"
root="$(dirname $(realpath $0))"
temp="$(mktemp --directory --tmpdir tmp.XXXXXXXXXX)"
dd bs=512 if=/dev/zero seek=0 count=2048 of=$disk
dd bs=512 if=/dev/zero seek=15767552 count=2048 of=$disk
sync
sleep 1
sfdisk --no-reread "$disk" <<EOF
label: gpt
unit: sectors
sector-size: 512
1 : start=2048, size=15699968, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="multiboot"
2 : start=15702016, size=65536, type=uefi, name="multiboot_EFI"
3 : start=15767552, size=2015, type=21686148-6449-6E6F-744E-656564454649, name="multiboot_BIOS"
EOF
sync
sleep 1
sfdisk --no-reread -Y dos "$disk" <<EOF
label: dos
sector-size: 512
1 : start=2048, size=15699968, type=0c, bootable
2 : start=15702016, size=65536, type=ef
3 : start=1, size=2047, type=ee
EOF
sync
sleep 1
mkdosfs -n MULTIBOOT "${1}1"
mkdosfs "${1}2"
mkdir "$temp/boot"
mkdir "$temp/efi"
mount "${1}1" "$temp/boot"
mount "${1}2" "$temp/efi"
mkdir $temp/boot/boot
grub-install --target=x86_64-efi --removable --no-nvram \
--root-directory=$temp/boot \
--boot-directory=$temp/boot/boot \
--efi-directory=$temp/efi
grub-install --target=i386-efi --removable --no-nvram \
--root-directory=$temp/boot \
--boot-directory=$temp/boot/boot \
--efi-directory=$temp/efi
grub-install --target=i386-pc \
--root-directory=$temp/boot \
--boot-directory=$temp/boot/boot \
"$disk"
umount "$temp/efi"
echo "source /grub.cfg" > "$temp/boot/boot/grub/grub.cfg"
umount "$temp/boot"
rm -r -f "$temp"
}
main "$@"
Сохраняем скрипт в файл mkbootusb.sh и выполняем
# ./mkbootusb.sh /dev/sda
где /dev/sda это ваша флешка размером от 8гб.
Флешка будет отформатирована, на флешку будет установлен загрузчик grub2 для Legacy BIOS и UEFI систем.
На флешке появятся три раздела:
# fdisk -l
Disk /dev/sda: 14.65 GiB, 15728640000 bytes, 30720000 sectors
Disk model: USB DISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 141D7864-77B4-3849-B430-1CE359751108
Device Start End Sectors Size Type
/dev/sda1 2048 15702015 15699968 7.5G Microsoft basic data
/dev/sda2 15702016 15767551 65536 32M EFI System
/dev/sda3 15767552 15769566 2015 1007.5K BIOS boot
Раздел /dev/sda1 это раздел для хранения данных.
Скачиваем последний Debian Live KDE
# mount /dev/sda1 /mnt
# cd /mnt
# wget https://cdimage.debian.org/cdimage/unofficial/non-free/cd-including-firmware/current-live/amd64/iso-hybrid/debian-live-11.6.0-amd64-kde+nonfree.iso
И уже ручками редактируем grub.cfg, обратите внимание, что в /boot/grub/grub.cfg на флешке всего одна строчка source /grub.cfg, суть которого сводится к тому, чтобы загрузить /grub.cfg из корня флешки.
Поэтому мы либо кладём наш grub.cfg в корень флешки, ну либо перезаписываем этот /boot/grub/grub.cfg.
# cat > /mnt/grub.cfg <<"EOF"
set default=1
set timeout=9
insmod font
if loadfont /unifont.pf2; then
insmod gfxterm
insmod png
insmod efi_uga
insmod efi_gop
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
fi
if background_image /grub-16x9.png; then
set color_normal=white/black
set color_highlight=black/white
else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi
submenu "Boot from ISO image >" {
menuentry "Debian GNU/Linux Live 11.6.0 kde+nonfree (linux 5.10.0-20-amd64)" {
iso_path=/debian-live-11.6.0-amd64-kde+nonfree.iso
export iso_path
loopback loop $iso_path
set root=(loop)
set loopback="findiso=${iso_path}"
export loopback
linux /live/vmlinuz-5.10.0-20-amd64 boot=live components toram \
locales=ru_RU.UTF-8 keyboard-model=pc105 keyboard-layouts=us,ru \
username=spoofing \
splash quiet "${loopback}"
initrd /live/initrd.img-5.10.0-20-amd64
}
}
submenu "Sign off >" {
menuentry "Next system (continue)" {
continue
}
menuentry "Reboot system (reboot)" {
reboot
}
menuentry "Shutdown system (halt)" {
halt
}
}
Тут-же в корень флешки мы складываем шрифт unifont.pf2, его вы можете найти у себя где-то тут /usr/lib/grub/fonts/unifont.pf2
И тут-же в корень флешки складываем картинку /grub-16x9.png, которую взять можно отсюда https://commons.wikimedia.org/wiki/File:Grub-16x9.png
На этом всё. Размонтируем флешку.
# umount /mnt
Загрузочная флешка с Debian Live KDE готова!
После подключения флешки в компьютер или в виртуалку вы увидите похожую картину:

Выбираем нужный пункт меню и загружаемся!

Любые другие ISO точно будет грузить. Например Ubuntu.
menuentry "Ubuntu 22.10 Desktop amd64" { loopback loop /ubuntu-22.10-desktop-amd64.iso set root=(loop) linux /casper/vmlinuz boot=casper iso-scan/filename=/ubuntu-22.10-desktop-amd64.iso toram initrd /casper/initrd.lz }Варианты есть.
На счёт винды не уверен, ну это надо ковырять Ventoy чтобы подсмотреть как реализовали там.
Энивей, это уже само по себе огромное пространство для полёта.
Когда ты можешь взять любой дистрибутив, загрузиться с флешки, и сразу тут-же задеплоить нужную конфигурацию с этой же флешки, и работать чисто в RAM.
Никакие больше убогие booty не нужны. Вот.
Ну я ещё очень много лет назад чот такое делал с grub4dos, у меня там и венды были, и линуксы, но оно всё на костылях и подпорках держалось, вот если оно прям iso монтирует, то интересно