Здравствуйте мои маленькие токсичные борцы с дивана.

Сегодня я расскажу вам как сделать загрузочную флешку, с которой вы сможете загрузать любой 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 готова!

После подключения флешки в компьютер или в виртуалку вы увидите похожую картину:

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

  • SpoofingOP
    link
    fedilink
    arrow-up
    0
    ·
    4 years ago

    Любые другие 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 не нужны. Вот.

    • Александр
      link
      fedilink
      arrow-up
      0
      ·
      4 years ago

      Ну я ещё очень много лет назад чот такое делал с grub4dos, у меня там и венды были, и линуксы, но оно всё на костылях и подпорках держалось, вот если оно прям iso монтирует, то интересно