LINUXTALKS.CO

3
Всего сообщений: 76

Загрузка ISO с FAT32 флешки а-ля Ventoy на минималках

Группа Персональные блоги участников

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

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

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

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

 , ,

Spoofing ()