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

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

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

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

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

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

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

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

      Добавить самому не проблема, так же не проблема целиком пересобирать образ 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.

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

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

        Дык а preseed для кого придумали? Его можно даже по сети инсталлеру скормить.

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

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

      • hobbit
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

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

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

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

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

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

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