Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2015 >> Май


15.05.2015

Создать мультизагрузочную флешку




Добрый день.

Многие наверное встречали в интернете фразу "мультизагрузочная флешка" и заинтересовавшись захотели заполучить такую в свой инвентарь? Со мной такая же история. Сегодня я расскажу свой способ как создать мультизагрузочную флешку.

Сначала немного теории: мультизагрузочная флешка позволяет загружать несколько операционных систем непосредственно с самой себя. То есть даже отсутствие в компьютере жесткого диска не станет помехой. Используются такие флешки чаще всего как спасательные - для восстановления работоспособности испорченной системы. И операционные системы, загружаемые с них могут быть самыми разными: от любого линукса, до windows (хотя ее лицензия такого не позволяет). Кроме ОС могут запускаться также и разные служебные программы, например проверка оперативной памяти или жесткого диска. Или, модные сейчас, антивирусные live-системы для проверки на вирусы и лечения ОС Windows. Помимо сказанного стоит упомянуть и дистрибутив для работы с разделами жесткого диска Clonzilla. В общем вариантов масса и такая флешка должна быть, что называется, must have.

Вариантов реализации такой флешки как минимум два.

• Первый - установить на нее одну или несколько ОС как обычно. То есть используя флешку как жесткий диск и применяя некоторые хитрости, чтобы флешка не "сносилась" раньше времени (такие как использование файловой системы без журналирования, монтирование временных каталогов в оперативную память, применяя специальные опции монтирования и т. д.). Как вы догадались речь в статье идет только о свободных, linux-based ОС.

• И второй - скопировать на флешку iso-образы и загружать ОСи прямо из них при помощи загрузчика grub2, который позволяет это делать.

Второй способ конечно предпочтительнее, аккуратнее и технически грамотнее, но нужно хорошо разбираться с конфигами груба. На тот момент мне показалось что создание какой-то там мультизагрузочной флешки не стоит тщательного изучения grub2, поэтому я решил пойти первым путем - установил archlinux на флешку как на обычный жесткий диск.

Мне такая флешка нужна была в первую очередь как спасательная, но еще и для демонстрационных целей (показывать возможности разных дистрибутивов с разными рабочими окружениями). Как спасательная она получилась на 100%: все загружается и работает, но как демонстрационная - не очень. Вернее она получилась демонстрационной, но только для одной системы. И то, нужно было постоянно обновлять ОС на ней, чтобы появлялись все новые "свистелки", что очень негативно отражается на "здоровье" флешки. А чтобы сделать для нескольких систем, под каждую нужно отделять кусочек от флешки, что неудобно, да и флешка будет выглядеть как очень фрагментированный ntfs-диск в виндовсе.

Поэтому было принято решение все-таки сделать флешку по второму способу. Тем более перед этим как раз вовремя на глаза попалась статья о Grub2 пользователя русскоязычного форума Archlinux, Natrio, за что ему огромное спасибо.

Для реализации этой задумки, я разбил свою 32 Гб флешку на 2 раздела: первый (22 Гб) - для файлов т. е. чтобы оставить возможность пользоваться такой флешкой как обычной, причем обязательно этот раздел должен быть первым, так как ОС Windows не может себе представить что флешки бывают с несколькими разделами и видит всегда только первый ее раздел. И второй (10 Гб) - для конфигов груба и iso-образов. Этот раздел в винде виден не будет (что может быть и к лучшему), то есть такая флешка в виндовсе внешне ничем не будет отличаться от обычной. Все разделы я сделал с родной для флешек файловой системой fat32 (тем более что она нежурналируемая).

Далее я примонтировал второй раздел (допустим это /dev/sdb2) в папку /boot и установил на флешку grub2 (все команды выполняются от рута):

mount /dev/sdb2 /boot
grub-install /dev/sdb


Обратите внимание, что во второй строке, при установке груба на флешку, номер раздела не указывается! После этих манипуляций во втором разделе флешки появилась папка grub. Рядом с ней я создал папку iso и закинул в нее скаченные заранее iso-образы нескольких дистрибутивов. В моем случае (для примера) это: Archlinux, Ubuntu, Linux Mint и Elementary OS.

Теперь осталось только создать правильный конфиг груба. У меня он такой:

set root_uuid=<здесь UUID второго раздела вашей флешки>
search -s root -u $root_uuid
dir=/iso
insmod regexp
insmod part_gpt
insmod part_msdos

# Графическое меню начало

theme_name=Archxion
dir_theme=$prefix/themes/$theme_name
set theme=$dir_theme/theme.txt
loadfont $dir_theme/*.pf2
insmod png
set gfxmode=1024x768
# set lang=ru
insmod gfxterm
if [ "$grub_platform" = "pc" ] ; then
insmod vbe # загружаем модуль для BIOS
else
insmod efi_gop # или для EFI
insmod efi_uga
fi
terminal_output gfxterm

# Графическое меню конец

# Загрузка официальных образов Arch Linux
# Формат имени образа: archlinux-YYYY.mm.dd-arch.iso

for iso in $dir/archlinux-*.iso ; do
if [ ! -f "$iso" ] ; then continue; fi
regexp -s 1:build -s 2:arch 'archlinux-(.+)-(.+)\.iso' $iso
menuentry "Arch Linux ISO $build $arch" --source="
loopback loop $iso
probe -s isolabel -l loop
linux (loop)/arch/boot/$arch/vmlinuz archisolabel=$isolabel img_dev=/dev/disk/by-uuid/$root_uuid img_loop=$iso earlymodules=loop
initrd (loop)/arch/boot/$arch/archiso.img"
done

# Загрузка образов Ubuntu Linux

for iso in $dir/*ubuntu-*.iso ; do
if [ ! -f "$iso" ] ; then continue; fi
regexp -s 1:uname -s 2:uver -s 3:uvar -s 4:uarch '/([^/]+buntu[^0-9]*)-([0-9.]+)-(.+)-(.+)\.iso' $iso
if [ "$uvar" = 'server' ] ; then continue ; fi
if [ "$uarch" = 'i386' ] ; then efi= ; else efi='.efi' ; fi
menuentry "ISO $uname $uvar $uver $uarch" --source="
loopback loop $iso
linux (loop)/casper/vmlinuz$efi boot=casper iso-scan/filename=$iso noeject --
initrd (loop)/casper/initrd.lz"
done

# Загрузка образов Elementary OS
# Формат имени образа: elementaryos-dd.mm.YYYY-arch.iso

for iso in $dir/elementaryos-*.iso ; do
if [ ! -f "$iso" ] ; then continue; fi
regexp -s 1:name -s 2:arch -s 3:date 'elementaryos-(.+)-(.+).(.+)\.iso' $iso
menuentry "Elementary OS $name $date $arch" --source="
loopback loop $iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso noeject --
initrd (loop)/casper/initrd.lz"
done

# Загрузка образов Linux Mint
# Формат имени образа: linuxmint-version-DE-arch.iso

for iso in $dir/linuxmint-*.iso ; do
if [ ! -f "$iso" ] ; then continue; fi
regexp -s 1:ver -s 2:DE -s 3:arch 'linuxmint-(.+)-(.+)-(.+)\.iso' $iso
menuentry "Linux Mint $ver $arch $DE" --source="
loopback loop $iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso noeject --
initrd (loop)/casper/initrd.lz"
done

menuentry "Reboot" {
reboot
}

menuentry "Poweroff" {
halt
}


Помимо загрузки различных дистрибутивов есть возможность перезагрузки и выключения компьютера.

Для обработки имен iso-образов в конфиге используются регулярные выражения (в этом помогает модуль regexp). Также можно добавить в список загрузки и свои созданные live-образы как описано в одной из предыдущих статей.

Для меню груб можно применять различные темы оформления или вручную изменять шрифты, фон и т. д. В приведенном конфиге я использую тему оформления Archxion. Для использования какой-либо темы оформления нужно скопировать в папку grub папку с темой офрмления (ее можно установить в свою обычную систему на компьютер, скопировать нужную папку с темой на флешку и затем удалить эту тему если вы борец за чистоту системы) и указать имя темы. Кроме этого загрузить необходимые модули, шрифты и запустить графический терминал:

# Графическое меню начало

theme_name=Archxion
dir_theme=$prefix/themes/$theme_name
set theme=$dir_theme/theme.txt
loadfont $dir_theme/*.pf2
insmod png
set gfxmode=1024x768
# set lang=ru
insmod gfxterm
if [ "$grub_platform" = "pc" ] ; then
insmod vbe # загружаем модуль для BIOS
else
insmod efi_gop # или для EFI
insmod efi_uga
fi
terminal_output gfxterm

# Графическое меню конец


Для борцов за минимализм - можно не пользоваться всеми этими "рюшечками" и оставить только обычное текстовое меню. Для этого достаточно закомментировать блок кода относящийся к графическому меню.

Вся прелесть такой флешки в том что меню создается динамически и вам остается только копировать новые образы в папку iso или удалять старые, меню будет выдаваться только для тех образов, которые существуют на данный момент в папке iso. Единственное условие, это непереименовывание этих образов или переименование по маске (где указано). Иначе придется изменять регулярные выражения для обработки имен образов. Но и это можно сделать (если нужно).

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

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий:




sL4yer, 20 Мая 2015 года в 16:06, писал(а):



Когда-то у меня была мечта: "создать флешку, с которой можно загрузить любой .iso образ". К сожалению, этой мечте не суждено было сбыться. Кстати регулярку(и): "linuxmint-(.+)-(.+)-(.+).iso" заменить на "linuxmint-(.+)-(.+)-(.+).iso"? Статья — понравилась, флешка — супер, как реаниматор. Для записи образов — предпочитаю использовать dd :-)
Admin, 25 Мая 2015 года в 8:58, писал(а):



sL4yer, спасибо за отзыв.
Но ведь сбылась же мечта!
По поводу регулярки не понял, у вас опечатка?
sL4yer, 13 Июня 2015 года в 20:00, писал(а):



[b]Admin[/b], с регуляркой нет, не опечатка :-) Видимо, система комментариев «съела» мой "" (backslash) перед точкой. В общем я о том, что точку перед iso нужно экранировать, т.к. в Вашем случае она принимает любой символ ;-)
oleg, 24 Мая 2016 года в 19:43, писал(а):



Не могу второй граб для UEFI поставить, выдает ошибку , что-то про target говорит .
Admin, 06 Июня 2016 года в 8:55, писал(а):



Oleg, чтобы установить груб для UEFI в общем случае используют такую команду: grub-install --target=x86_64-efi --removable --efi-directory=/mnt --boot-directory=/mnt /dev/sdb Здесь флешка в системе видна как /dev/sdb, efi-directory и boot-directory - раздел куда смонтирована папка с конфигами груб, в данном случае /mnt. И указан таргет: target=x86_64-efi, информирующий груб о том что нужно установить версию для UEFI.