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