Table of Contents

Мультизагрузочная Linux-флешка

Тут описана процедура создания флешки для загрузки множества iso-образов на компьютерах с BIOS. На компьютерах с UEFI она не работает. Для компов с UEFI я делал Универсальную загрузочную флешку для BIOS/UEFI.
Хорошо иметь под рукой флешку, с которой можно загрузиться для восстановления или установки системы. Также хорошо бы чтобы на ней помещались несколько разных образов ISO, доступных из меню. Создать такую флешку можно с помощью специализированных программных средств как под Linux ( Multisystem) так и под Windows (XBOOT), и даже мультиплатформенных (Yumi). Но можно пойти true linux way™ и использовать GRUB.

Создание и форматирование раздела

Сначала нужно создать на флешке раздел и сделать его загрузочным. Запускаем fdisk и натравливаем его на нашу флешку. Нижеприведенные команды делаем с правами root. Список дисков смотрим командой:

fdisk -l

Запускаем fdisk (указав свою флешку):

fdisk /dev/sdx

Если на диске есть разделы, то ликвидируем их. Для этого жмем d
После удаления разделов жмем n и создаем новый.
В процессе создания указваем что раздел p (primary).
После создания жмем a, чтобы сделать раздел активным.
Затем жмем t, чтобы задать тип раздела и вводим тип c (FAT32).
Жмем w и записываем изменения на флешку.

Теперь надо отформатировать созданный раздел в FAT32:

umount /dev/sdx1
mkfs.vfat -F 32 -n MULTIBOOT /dev/sdx1

Установка загрузчика GRUB

Дальше ставим GRUB2 на флешку.
Создаем точку монтирования и монтируем флешку (не забываем sdx менять на актуальные буквы, соотвествующие флешке):

sudo mkdir /mnt/USB && sudo mount /dev/sdx1 /mnt/USB

Устанавливаем GRUB (выполняем с правами root):

sudo grub-install --force --no-floppy --boot-directory=/mnt/USB/boot /dev/sdx 

Старые версии GRUB вместо –boot-directory используют -root-directory. Если что-то не так, то установщик GRUB скажет что “Installation is impossible. Aborting”.

Создаем на флешку файлик grub.cfg

nano /mnt/USB/boot/grub/grub.cfg

И заполняем его примерно так:

set timeout=10
set default=0

menuentry "KNOPPIX_V7.2.0CD-2013-06-16-EN LiveCD" {
loopback loop /KNOPPIX_V7.2.iso
#linux (loop)/boot/isolinux/linux bootfrom=/KNOPPIX_V7.2.iso acpi=off keyboard=us language-us
linux (loop)/boot/isolinux/linux bootfrom=/KNOPPIX_V7.2.iso keyboard=us language-us
initrd (loop)/boot/isolinux/minirt.gz
}

menuentry "SystemRescueCd 4.6.1 Live (64bit, cache all files in memory and startX)" {
 loopback loop /systemrescuecd.4.6.1.iso
 linux (loop)/isolinux/rescue64 isoloop=/systemrescuecd.4.6.1.iso setkmap=us docache dostartx
 initrd (loop)/isolinux/initram.igz
}

menuentry "SystemRescueCd 4.6.1 Live (64bit, default boot options)" {
 loopback loop /systemrescuecd.4.6.1.iso
 linux (loop)/isolinux/rescue64 isoloop=/systemrescuecd.4.6.1.iso setkmap=us
 initrd (loop)/isolinux/initram.igz
}
  
menuentry "SystemRescueCd 4.6.1 Live (32bit, default boot options)" {
 loopback loop /systemrescuecd.4.6.1.iso
 linux (loop)/isolinux/rescue32 isoloop=/systemrescuecd.4.6.1.iso setkmap=us
 initrd (loop)/isolinux/initram.igz
}

menuentry "Ubuntu 14.04.3 x64 Desktop with GNOME. Live and Install" {
 loopback loop /ubuntu-14.04.3-desktop-amd64.iso
 linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.3-desktop-amd64.iso quiet splash
 initrd (loop)/casper/initrd.lz
}

menuentry "Kubuntu 14.04.3 x64 Desktop with KDE. Live and Install" {
 loopback loop /kubuntu-14.04.3-desktop-amd64.iso
 linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/kubuntu-14.04.3-desktop-amd64.iso quiet splash
 initrd (loop)/casper/initrd.lz
}

menuentry "Xubuntu 14.04.3 x64 Desktop with LXDE. Live and Install" {
        loopback loop /xubuntu-14.04.3-desktop-amd64.iso
        linux   (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/xubuntu-14.04.3-desktop-amd64.iso quiet splash --
        initrd  (loop)/casper/initrd.lz 
}

menuentry "Ubuntu 14.04.3 x64 Server" {
        loopback loop /ubuntu-14.04.3-server-amd64.iso
	linux	(loop)/install/vmlinuz iso-scan/filename=/ubuntu-14.04.3-server-amd64.iso quiet --
	initrd	(loop)/install/initrd.gz
}

menuentry "CentOS 7 03.15 x64 Install" {
        loopback loop /CentOS-7-x86_64-Minimal-1503-01.iso
	linux	(loop)/isolinux/vmlinuz noeject inst.stage2=hd:LABEL=MIKEBOOT:/CentOS-7-x86_64-Minimal-1503-01.iso
	initrd	(loop)/isolinux/initrd.img
}

menuentry "SystemRescueCd 4.8.1 Live (64bit, default boot options)" {
 loopback loop /systemrescuecd-x86-4.8.1.iso
 linux (loop)/isolinux/rescue64 isoloop=/systemrescuecd-x86-4.8.1.iso setkmap=us
 initrd (loop)/isolinux/initram.igz
}

menuentry "Try Xubuntu x64 16.04.1 without installing" {
        loopback loop /xubuntu-16.04.1-desktop-amd64.iso
	set gfxpayload=keep
	linux	(loop)/casper/vmlinuz.efi iso-scan/filename=/xubuntu-16.04.1-desktop-amd64.iso file=(loop)/preseed/xubuntu.seed boot=casper quiet splash ---
	initrd	(loop)/casper/initrd.lz
}
menuentry "Install Xubuntu 16.04.1 x64" {
        loopback loop /xubuntu-16.04.1-desktop-amd64.iso
	set gfxpayload=keep
	linux	(loop)/casper/vmlinuz.efi iso-scan/filename=/xubuntu-16.04.1-desktop-amd64.iso file=(loop)/preseed/xubuntu.seed boot=casper only-ubiquity quiet splash ---
	initrd	(loop)/casper/initrd.lz
}

menuentry "Install Xubuntu 16.04.1 i386" {
        loopback loop /xubuntu-16.04.1-desktop-i386.iso
	set gfxpayload=keep
	linux	(loop)/casper/vmlinuz iso-scan/filename=/xubuntu-16.04.1-desktop-i386.iso file=(loop)/preseed/xubuntu.seed boot=casper only-ubiquity quiet splash ---
	initrd	(loop)/casper/initrd.lz
}

menuentry "Install Ubuntu Server 16.04.2 {
    loopback loop /ubuntu-16.04.2-server-amd64.iso
	set gfxpayload=keep
	linux	(loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed quiet ---
	initrd	(loop)/install/initrd.gz
}

menuentry "Fedora-Workstation-Live 25" {
 loopback loop /Fedora-Workstation-Live-x86_64-25-1.3.iso
 linux (loop)/isolinux/vmlinuz iso-scan/filename=/Fedora-Workstation-Live-x86_64-25-1.3.iso root=live:CDLABEL=Fedora-WS-Live-25-1-3 rd.live.image quiet rootfstype=auto ro rhgb rd.luks=0 rd.md=0 rd.dm=0
 initrd (loop)/isolinux/initrd.img
}

menuentry "Fedora-KDE-Live 25" {
 loopback loop /Fedora-KDE-Live-x86_64-25-1.3.iso
 linux (loop)/isolinux/vmlinuz iso-scan/filename=/Fedora-KDE-Live-x86_64-25-1.3.iso root=live:CDLABEL=Fedora-KDE-Live-25-1-3 rd.live.image quiet rootfstype=auto ro rhgb rd.luks=0 rd.md=0 rd.dm=0
 initrd (loop)/isolinux/initrd.img
}

menuentry "Install Kubnuntu 16.04.2 Desktop" {
        loopback loop /kubuntu-16.04.2-desktop-amd64.iso
	set gfxpayload=keep
	linux	(loop)/casper/vmlinuz.efi  iso-scan/filename=/kubuntu-16.04.2-desktop-amd64.iso file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
	initrd	(loop)/casper/initrd.lz
}

Этот содержит конфигурацию для загрузки с флешки KNOPPIX 7.2, SystemRescueCd 4.6.1, различных вариантов Ubuntu и CentOS 7. А дальше осталось просто положить указанные в grub.cfg образы ISO в корневую директорию флешки и переименовать их как указано в файле.

Еще немного примеров

menuentry "Linux Mint ISO" {
 loopback loop /linuxmint.iso
 linux (loop)/casper/vmlinuz file=/cdrom/preseed/mint.seed boot=casper initrd=/casper/initrd.l iso-scan/filename=/linuxmint.iso noeject noprompt splash --
 initrd (loop)/casper/initrd.lz
}

menuentry "DBAN ISO" {
 loopback loop /dban.iso
 linux (loop)/DBAN.BZI nuke="dwipe" iso-scan/filename=/dban.iso silent --
}
                                                                                                                                                                            
menuentry "Tinycore ISO" {                                                                                                                                                                      
 loopback loop /tinycore.iso 
 linux (loop)/boot/bzImage --
 initrd (loop)/boot/tinycore.gz
}

menuentry "Memtest 86+" {
 linux16 /memtest86+.bin
}

menuentry "Debian 9.5 i386 Install" {
    set background_color=black
    loopback loop /debian-9.5.0-i386-netinst.iso
    linux    (loop)/install.386/vmlinuz vga=788 --- quiet 
    initrd   (loop)/install.386/initrd.gz
}

menuentry "Install Kubnuntu 19.04 Desktop" {
    loopback loop /kubuntu-19.04-desktop-amd64.iso
	set gfxpayload=keep
	linux	(loop)/casper/vmlinuz  iso-scan/filename=/kubuntu-19.04-desktop-amd64.iso file=(loop)/preseed/kubuntu.seed boot=casper only-ubiquity quiet splash oem-config/enable=true ---
	initrd	(loop)/casper/initrd
}

menuentry "Install Ubnuntu 20.04 Server" {
    insmod part_gpt
    insmod ext2
    insmod search_fs_uuid
    rmmod tpm

    search --no-floppy --set=root --fs-uuid 36c1a912-77c7-4cec-8120-c2088e1e131c
    
    set isofile="/ubuntu-20.04-live-server-amd64.iso"
    set gfxpayload=keep
    
    loopback loop ($root)$isofile

	linux	(loop)/casper/vmlinuz iso-scan/filename=${isofile} quiet ---
	initrd	(loop)/casper/initrd
}

menuentry "Install Ubnuntu 21.10 Server" {
    set gfxpayload=keep
    set isofile="/ubuntu-21.10-live-server-amd64.iso"
    
    loopback loop ($root)$isofile

	linux	(loop)/casper/vmlinuz iso-scan/filename=${isofile} quiet ---
	initrd	(loop)/casper/initrd
}

menuentry "Install Ubuntu Server 16.04 i386" {
    loopback loop /ubuntu-16.04.6-server-i386.iso
	set gfxpayload=keep
	linux	(loop)/install/vmlinuz isoloop=/ubuntu-16.04.6-server-i386.iso file=/cdrom/preseed/ubuntu-server.seed quiet splash ---
	initrd	(loop)/install/initrd.gz
}

menuentry 'Debian 10 i386 Install' {
    set background_color=black
    loopback loop /debian-edu-10.0.0-i386-netinst.iso
    linux    (loop)/install.386/gtk/vmlinuz findiso=/debian-edu-10.0.0-i386-netinst.iso modules=debian-edu-install-udeb desktop=xfce vga=788 --- quiet 
    initrd   (loop)/install.386/gtk/initrd.gz
}

Добавление других образов ISO

Для добавления других образов ISO нужно в файлик /boot/grub/grub.cfg прописывать параметры, которые обычно можно найти в файлах grub.cfg, syslinux.cfg и других, входящих в состав образа ISO.
То есть создаем новый раздел меню в /boot/grub/grub.cfg (копируя уже существующий), затем указываем файл ISO в строке loopback, а в строку linux указываем путь к ядру (то что append из syslinux.cfg). В строке initrd указываем путь к файлу initrd.

Скорее всего, в строке linux после пути к файлу ядра придется указать параметры загрузки ядра, которые позволят ядру работать с loop-устройством, на которое монтируется файл ISO. Для систем со схожим ядром, параметры, как правило, одинаковые. Например, для загрузки Fedora подойдут параметры от CentOS.

Много обновляемой информации о загрузке ISO образов с помощью GRUB можно тут: https://wiki.archlinux.org/index.php/Multiboot_USB_drive

Загрузка установочных образов Windows 7 и Windows 10 c помощью GRUB

Монтируем iso-образ Windows 7 или Windows 10, копируем с него все файлы на флешку с помощью cp или rsync и дописываем в grub.cfg такое:

set timeout=10
set default=0

menuentry "Windows 7 or Windows 10 installer" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    search --no-floppy --label MULTIBOOT --set=root
    ntldr /bootmgr
}

Тут grub будет загружать модули с помощью insmod, потом search - искать раздел с меткой MULTIBOOT и когда найдет - с помощью –set укажет, что root находится на этом разделе, а затем передаст управление /bootmgr

В принципе, для красоты и удобства, было бы неплохо создать отдельный раздел на флешке (так я поступил при создании нового варианта флешки - Универсальная загрузочная флешка для BIOS/UEFI), отформатировать его с меткой Win7, распаковать файлы из iso-образа туда и указывать –label Win7. Просто в дистрибутиве windows также есть директоррия boot и если понадобится очистить флешку от инсталлятора windows, не затрагивая остальные ОС, то из этой директории файлы придется удалять вручную.