LINUXTALKS.CO

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

 , ,

L


0

2

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

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

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

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

★★★★★★

Проверено: Kaschenko ()

Знаете чего очень хотелось бы видеть в Debian? Параметр afterboot, который бы указывал расположение rc.local на внешнем устройстве.

Так, чтобы Debian после загрузки донастраивал сам себя беря за основу rc.local который лежит в корне флешки, с которой Debian только что загрузился.

Тогда никакие booty не нужны будут.

Т.е. ты просто дописываешь в опции загрузки ядра afterboot=http://.../rc.local или afterboot=(usbstick)/rc.local, и после того как Debian загрузился, он выполняет rc.local, в котором мы уже описываем все необходимые apt install и другие настроки для системы.

Вот это была бы пушка! Тогда никакие booty не пришлось бы костылить. Если я мог бы всё делать на базе Debian с флешки.

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

Знаете чего очень хотелось бы видеть в Debian? Параметр afterboot, который бы указывал расположение rc.local на внешнем устройстве.

А в чём проблема добавить такое?

cocucka    
★★★★★★★★★★
Ubuntu / Firefox
Ответ на: комментарий от cocucka

Добавить самому не проблема, так же не проблема целиком пересобирать образ Debian включая туда необходимый набор программ, но…

Но вот выходит обновление Debian 11.7, ты скачиваешь свежий ISO, а там этого опять нет! Понимаешь?

Я хочу такую фичу в мейнстриме, чтобы Debian после загрузки, если ему указана опция в загрузке, ну грубо говоря, external-rc-local=(usbstick)/rc.local, то чтобы Debian после загрузки выполнял этот скрипт.

А туда ты уже можешь напихать всё что хошь. По сути ты имеешь всегда свежий официальный Debian и небольшой скрипт rc.local на флешке, который выполняет все команды после загрузки.

Который будет делать тебе apt install и вси прочие настройки.

Вот записывал ты ISO debian netinst на флешку. Он с неё загрузился. Дальше он увидет rc.local на флешке. И начнёт его выполнять. А там у тебя wait inet_connection && apt install xorg firefox-esr fvwm.

Пока ты наливал себе чай, у тебя с флешки задеплоился свежий дебиян на компе! Понимаешь? :)

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Kaschenko

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

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

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

Kaschenko    
★★★★★
Android / Yandex
Ответ на: комментарий от cocucka

я совсем забыл про preseed, щя гляну чо там за формат

Spoofing    
★★★★★★
Linux / Firefox

Ну привет, изобретатель лисапедов!
Ты предлагаешь вместо выбора что грузить из списка ручками править конфиг под каждый исошник?
Да ну нах!

Minona    
★★★★★
Windows / Yandex
Ответ на: комментарий от Minona

это тред не про выбор ОС из списка.

у тебя есть возможность ПЕРЕДАТЬ ПАРАМЕТРЫ ЯДРУ КОТОРЫЙ НАХОДИТСЯ ВНУТРИ ISO, НЕ РАСПАКОВЫВАЯ ЕГО, ПОНИМАЕШЬ?

у Debian и других дистрибутивов у их штатных initrd есть множество фич, которые ты можешь использовать.

ты возьми просто образ Debian, просто загрузки его с флешки обычным образом.

ты получишь Live систему, но если ты флешку вытащишь, она, система, перестанет работать.

а я предлагаю вариант при котором ты можешь передать опцию toram чтобы Live система целиком загрузилась в RAM.

в моём варианте ты можешь передавать различные опции ядру (штатному дистрибутивному initrd), чтобы использовать различные киллер-фичи этого самого initrd.

и это всё при использовании стандартных ISO, НЕ ПЕРЕПАКОВЫВАЯ ЕГО.

понимаешь? или нет?

Spoofing    
★★★★★★
Linux / Firefox

Лог работы скрипта чтобы никто не пугался непонятных надписей:

# sh /sshfs/10.0.0.251/initramfs/inventory/tools/mkbootusb.sh /dev/sda
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.116774 s, 9.0 MB/s
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 3.51379 s, 298 kB/s
Disk /dev/sda: 29.3 GiB, 31457280000 bytes, 61440000 sectors
Disk model: CoolFlash USB3.1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new GPT disklabel (GUID: 85ADA1E8-BFFD-A243-AB7A-04C30FF6AA51).
/dev/sda1: Created a new partition 1 of type 'Microsoft basic data' and of size 7.5 GiB.
/dev/sda2: Created a new partition 2 of type 'EFI System' and of size 32 MiB.
/dev/sda3: Created a new partition 3 of type 'BIOS boot' and of size 1007.5 KiB.
/dev/sda4: Done.

New situation:
Disklabel type: gpt
Disk identifier: 85ADA1E8-BFFD-A243-AB7A-04C30FF6AA51

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

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Disk /dev/sda: 29.3 GiB, 31457280000 bytes, 61440000 sectors
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: dos
Disk identifier: 0x00000000

Old situation:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1           1 61439999 61439999 29.3G ee GPT

>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS disklabel with disk identifier 0x09821d59.
/dev/sda1: Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 7.5 GiB.
/dev/sda2: Created a new partition 2 of type 'EFI (FAT-12/16/32)' and of size 32 MiB.
/dev/sda3: Created a new partition 3 of type 'GPT' and of size 1023.5 KiB.
/dev/sda4: Done.

New situation:
Disklabel type: dos
Disk identifier: 0x09821d59

Device     Boot    Start      End  Sectors    Size Id Type
/dev/sda1  *        2048 15702015 15699968    7.5G  c W95 FAT32 (LBA)
/dev/sda2       15702016 15767551    65536     32M ef EFI (FAT-12/16/32)
/dev/sda3              1     2047     2047 1023.5K ee GPT

Partition table entries are not in disk order.

The partition table has been altered.
Syncing disks.
mkfs.fat 4.2 (2021-01-31)
mkfs.fat 4.2 (2021-01-31)
Installing for x86_64-efi platform.
Installation finished. No error reported.
Installing for i386-efi platform.
Installation finished. No error reported.
Installing for i386-pc platform.
Installation finished. No error reported.

Spoofing    
★★★★★★
Linux / Firefox
Ответ на: комментарий от Spoofing

Добавить самому не проблема

Я хочу такую фичу в мейнстриме

Ну если не проблема — думаю, для начала стоит ошарашить их патчем и ждать объяснения, почему не принимают реакции на этот патч.

P.S. Интересно, есть ли на LT понятие «некропостинга».

hobbit    
★★★★★
Windows / Chrome
Ответ на: комментарий от hobbit

это раздел статей, которые актуальны во все времена, поэтому на этот раздел некропостинг не распространяется.

Spoofing    
★★★★★★
Последнее исправление: Spoofing (всего исправлений: 1)

Linux / Firefox
Ограничение на отправку комментариев: только для зарегистрированных пользователей, score>=90