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

Выбираем нужный пункт меню и загружаемся!
Знаете чего очень хотелось бы видеть в Debian? Параметр afterboot, который бы указывал расположение rc.local на внешнем устройстве.
Так, чтобы Debian после загрузки донастраивал сам себя беря за основу rc.local который лежит в корне флешки, с которой Debian только что загрузился.
Тогда никакие booty не нужны будут.
Т.е. ты просто дописываешь в опции загрузки ядра afterboot=http://…/rc.local или afterboot=(usbstick)/rc.local, и после того как Debian загрузился, он выполняет rc.local, в котором мы уже описываем все необходимые apt install и другие настроки для системы.
Вот это была бы пушка! Тогда никакие booty не пришлось бы костылить. Если я мог бы всё делать на базе Debian с флешки.
Знаете чего очень хотелось бы видеть в Debian? Параметр afterboot, который бы указывал расположение rc.local на внешнем устройстве.
А в чём проблема добавить такое?
Добавить самому не проблема, так же не проблема целиком пересобирать образ 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.Пока ты наливал себе чай, у тебя с флешки задеплоился свежий дебиян на компе! Понимаешь? :)
Дык а preseed для кого придумали? Его можно даже по сети инсталлеру скормить.
я совсем забыл про preseed, щя гляну чо там за формат
Добавить самому не проблема
Я хочу такую фичу в мейнстриме
Ну если не проблема — думаю, для начала стоит ошарашить их патчем и ждать
объяснения, почему не принимаютреакции на этот патч.P.S. Интересно, есть ли на LT понятие “некропостинга”.
это раздел статей, которые актуальны во все времена, поэтому на этот раздел некропостинг не распространяется.
Подтвердил. А шындовс или любые другие iso будет грузить?
Любые другие 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 монтирует, то интересно
Ну привет, изобретатель лисапедов! Ты предлагаешь вместо выбора что грузить из списка ручками править конфиг под каждый исошник? Да ну нах!
это тред не про выбор ОС из списка.
у тебя есть возможность ПЕРЕДАТЬ ПАРАМЕТРЫ ЯДРУ КОТОРЫЙ НАХОДИТСЯ ВНУТРИ ISO, НЕ РАСПАКОВЫВАЯ ЕГО, ПОНИМАЕШЬ?
у Debian и других дистрибутивов у их штатных initrd есть множество фич, которые ты можешь использовать.
ты возьми просто образ Debian, просто загрузки его с флешки обычным образом.
ты получишь Live систему, но если ты флешку вытащишь, она, система, перестанет работать.
а я предлагаю вариант при котором ты можешь передать опцию toram чтобы Live система целиком загрузилась в RAM.
в моём варианте ты можешь передавать различные опции ядру (штатному дистрибутивному initrd), чтобы использовать различные киллер-фичи этого самого initrd.
и это всё при использовании стандартных ISO, НЕ ПЕРЕПАКОВЫВАЯ ЕГО.
понимаешь? или нет?
Лог работы скрипта чтобы никто не пугался непонятных надписей:
# 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.какие красивые картинки
пасиба -




