Как создать мультизагрузочную Linux флешку используя скрипт MultiCD
В предыдущей статье был сделан обзор популярных и мощных Live-дистрибутивов на основе Linux, также было предложено решение как можно записать образ дистрибутива на Flash-накопитель. А как сделать так чтобы несколько дистрибутивов в живом режиме можно было загружать с одного диска или флешки, при старте выбрав из списка нужный для загрузки? - попробую ответить и показать на практике что такое решение есть и оно достаточно эффективное. Все операции будем проводить под ОС Linux.
Побродив по просторам интернета были найдены несколько решений для постройки мультизагрузочного CD-DVD-Flash накопителя под ОС Линукс. Для Windows подобных решений хватает, а вот если у вас основная рабочая система Linux то ради решения подобной задачи ставить Windows - не самое рациональное решение.
К тому же под Линукс есть все инструменты для решения подобных и даже более сложных задач, было бы только желание разбираться, учиться и читать документацию.
Перечислю два наиболее подходящих готовых решения с которыми у меня возникли проблемы, а также приведу готовое решение со своими заметками и дополнениями. Все программы и операции будем производить под Linux - Debian Jessie 8.1-amd64.
Содержание:
Yumi
YUMI – Multiboot USB Creator, программа для создания мультизагрузочных USB-накопителей с множеством дистрибутивов на основе Линукс на борту.
Официальный ресурс: http://www.pendrivelinux.com/yumi-multiboot-usb-creator/
Для установки Yumi из пакета *.deb нужно сначала установить gambas3, делается это командой:
apt-get install gambas3
С программой YUMI сразу не заладилось дело, образ писался на флешку но загрузчика syslinux не было в корне, странно то что программа не выдавала никаких сообщений. После запуска GUI данной программы из консоли ситуация начала проясняться исходя из логово происходящего в консоли - нужно установить в систему пакет syslinux, поскольку в самой программе его нет и он не предусмотрен в пакете Yumi как встроенный. Ставим весь пакет syslinux с дополнительными батарейками:
apt-get install syslinux syslinux-utils syslinux-efi
А вот теперь можно установить из пакета сам Yumi:
dpkg -i yumi_0.0.1-1_all.deb
Если напишет что есть проблемы с зависимостями то это можно исправить командой:
apt-get install -f
Запустить программу можно отыскав ее ярлык со значком в меню установленных программ или же просто введя в лаунчер "yumi".
Перед запуском программы нужно создать чистую флешку с файловой системой FAT16 или FAT32 (NTFS - не желательно). Вот и все, можно пробовать записать какой-то образ на флешку и попробовать загрузиться с нее на каком-то компьютере что поддерживает загрузку со сменных USB-носителей.
После экспериментов я так и не добился нормальной работы загрузочной флешки, как потом уже выяснил - в новом пакете syslinux образ загрузочного сектора хранится по пути /usr/lib/syslinux/mbr/mbr.bin, а в бинарном файле Юми он вшит как /usr/lib/syslinux/mbr.bin - возможно что поэтому не работала утилита, в любом случае остается ждать свежего релиза или же пробовать все операции на более старых релизах Linux. Также можно попробовать скопировать mbr.bin и другие ресурсы по путях как в старых версиях syslinux - не могу утверждать что это поможет, но может и получиться.
Не будем останавливаться на ковырянии Юми и попытках исправить бинарный файл программы. Дальше мы продолжим искать решение где сможем держать все под своим полным контролем и в случае чего будем иметь возможность все исправить подручными средствами.
MultiSystem
MultiSystem – Create a MultiBoot USB from Linux. Из названия понятно для чего эта программа, предназначение то же самое что и у Yumi.
Официальный ресурс: http://www.pendrivelinux.com/multiboot-create-a-multiboot-usb-from-linux/
Первый раз встретил этот дистрибутив в виде загрузочного iso-образа, запустил его под VirtualBox, поклацал немного и отложил в хранилище к другим полезным образам. Сейчас же решил не использовать образ для загрузки, а установить саму программу MultiSystem под рабочей системой Debian Linux для эксперимента.
Перед установкой нужно поставить пакет zenity(поддержка графических диалоговых окон для использования в консольных скриптах), делается это командой:
apt-get install zenity
Полезно знать! Если вы знаете имя пакета но не знаете зачем он нужен, то краткое описание можно посмотреть в кеше пакетов, используя следующую команду, приведу пример для того же пакета "zenity":
apt-cache search zenity
В выводе команды получим что-то наподобие этого текста:
python-vsgui - Very Simple Graphical library for Python shell script
ssft - Shell Scripts Frontend Tool
zenity - Display graphical dialog boxes from shell scripts
zenity-common - Display graphical dialog boxes from shell scripts (common files)
Если не знаете английского или с трудом понимаете что происходит, то пользуйтесь GoogleTranslate!
Продолжим установку MultiSystem - качаем архив с установочными скриптами для программы:
wget http://liveusb.info/multisystem/install-depot-multisystem.sh.tar.bz2
Распаковываем инсталяционный скрипт при помощи архиватора tar :
tar -xf install-depot-multisystem.sh.tar.bz2
Запускаем скрипт от обычного пользователя, не от root - это важно (в случае запуска от суперпользователя скрипт выведет предупреждение):
install-depot-multisystem.sh
Скрипт запросит пароль пользователя для получения привилегий на установку пакетов и через несколько секунд все будет установлено и готово к использованию.
Ярлык для запуска MultiSystem появится в списке установленных программ, можем пробовать запускать.
Программа запустилась, быстро разобравшись с инетрфейсом - добавил несколько небольших iso-файлов для теста. К примеру можно использовать легковесные образы CloneZilla и Puppy Linux - каждый примерно по 160 МБ.
Запустил запись на флешку, все прошло успешно, извлек ее и попробовал загрузиться с другого компьютера. В результате загрузки черный экран и тишина. MBR(Master Boot record, основная загрузочная запись) на флешке была на месте, хотя не уверен что именно та которая должна была прописать системой Multisystem. MBR расположен в первых 512-ти байтах диска, его можно считать в файл вот такой командой:
dd if=/dev/sdc of=sdc_mbr.bin bs=512 count=1
Где sdc - имя файла-устройства в папке dev, который присвоен нашему подопытному флеш-накопителю.
Смотрим содержимое файла:
cat sdc_mbr.bin
В выводе увидим много разных символов среди которых можем наблюдать фрагменты читаемого текста:
...isolinux.bin missing or corrupt....Operating system load error....
Это говорит что в MBR диска записан загрузчик isolinux. Несмотря на это что-то не подгружается так как нам нужно. Возможно что проблема как и в Юми лежит в новой версии пакета syslinux. Можно конечно покопаться в пакете Multisystem, искать поломки, переустановить Линукс на более старую версию и попробовать как все работает - но это не даст гарантии что все дистрибутивы запустятся и будут работать так как нужно, и позже вы поймете о чем я говорю...
В любом случае можно загрузиться с загрузочного CD на который залит проверенный и рабочий образ MultiSystem, сбросить на жесткий диск компьютера нужные для записи iso-образы, воткнуть подопытную флешку и произвести все необходимые операции.
MultiCD
Итак, после опыта с Yumi и MiltiSystem, которые в свою очередь базируются на пакете syslinux, я уже набрался решительности разобраться с syslinux и написать свой набор скриптов для генерации мультизагрузочного образа с несколькими ОС. Поиски документации привели меня на один интересный сайт:
MultiCD - Combine several boot CDs into one (http://multicd.us/).
Подумал про себя: вот и удача подоспела, теперь еще и нашел готовые мануалы как запилить свои скрипты, но оказалось не совсем так...
Бегло оглянув содержимое сайта стало понятно что вся работа, которую я планировал проделать с syslinux уже сделана и в готовом вмде лежит на этом сайте, к тому же к многим образам операционных систем уже написаны готовые скрипты. Первые тесты показали что все работает и запись сгенерированного образа с несколькими тестовыми ОС дала свой рабочий результат.
Перейдем к установке и использованию скрипта. Для начала нам нужно установить GIT (распределённая система управления версиями), с помощью его мы скачаем репозиторий со всеми скриптами от MultiCD, выполняем установку командой:
apt-get install git
Ок, теперь перейдем к скачиванию репозитория, по ссылке с сайта. Переходим в удобную для нас директорию, где будет распакованы скрипты и выполняем команду:
git clone git://github.com/IsaacSchemm/MultiCD.git
Скачется достаточно быстро, вес репозитория - порядка 1,5МБ. Вот как выглядит директория со скриптами после скачивания:
Запускать здесь ничего не стоит, все операции будем производить в консоли - это даст нам максимум информации о том что происходит и в случае возникновения ошибок поможет разобраться в чем причина. Что еще можно посмотреть здесь, так это содержимое папки plugins - это скрипты-плагины, которые написаны под конкретные дистрибутивы Линукс. Список не малый - их более 100 штук!
Открываем новое окно Терминала и переходим в папку со скриптом, пробуем запустить главный скрипт:
/bin/bash ./multicd.sh
Скрипт проверит наличие iso-файлов в директории вместе с ним, которые и будут слиты в один мультизагрузочный образ, а потом скачает необходимые ей для работы компоненты - это то же syslinux и в дополнение еще memtest86+. После скачивания порядка 11МБ скрипт завершит свою работу. Скачиваться пакет ssylinux будет только один раз, архив с ним будет лежать в папке со скриптом и будет использоваться по ходу его работы.
Теперь все готово для работы, пробуем создать мультизагрузочный образ из нескольких нужных нам дистрибутивов. Список всех поддерживаемых дистрибутивов и правила переименования файлов-образов вы можете найти на странице: http://multicd.us/supported.html
Скрипт умеет распознавать название дистрибутива по имени файла, к примеру если положить в папку со скриптом ISO-файл под названием clonezilla-live-20150608-vivid-amd64.iso то скрипт узнает что это clonezilla для архитектуры AMD64 и будет использовать для обработки этого файла-образа одноименный скрипт-плагин в директории plugins (скриншот выше) - clonezillaamd64.sh .
Не все образы скрипт сможет распознать так как необходимо, тому желательно все же перед запуском скрипта переименовать все образы дистрибутивов по правилам для плагинов. Как называть файлы дистрибутивов вы можете найти на сайте на странице поддерживаемых дистрибутивов.
Допустим что мы скачали Puppy Linux (Lucid), Clonezilla AMD64 и Finnix Linux. Переименовываем образы исходя из приведенных выше рекомендаций:
clonezilla-live-20150608-vivid-amd64.iso --> clonezilla.iso
finnix-111.iso --> finnix.iso
lupu-528.005.iso --> puppy.iso
Общий размер трех файлов примерно 500МБ. Теперь кладем файлы-образы clonezilla.iso, finnix.iso и puppy.iso в папку со скриптом и запускаем процесс сборки:
/bin/bash ./multicd.sh
В начале будет выведен список обнаруженных дистрибутивов и потом начнется распаковка каждого из них используя плагины, потом все подготовленные данные соберутся в одну временную папку и скомпилируются в один файл - multicd.iso:
Cleaning up - removing symlinks to files in current directory
multicd.sh 20150517
Extracting ISO images with 7z; will build multicd.iso; UID 1000.
Clonezilla
Finnix
Memtest86+
Continuing in 2 seconds - press Ctrl+C to cancel
Copying files for each plugin...
Copying Clonezilla ..
..........................................
94.22% done, estimate finish Fri Jun 26 15:02:13 2015
97.16% done, estimate finish Fri Jun 26 15:02:13 2015
Total translation table size: 2048
Total rockridge attributes bytes: 4297
Total directory bytes: 14806
Path table size(bytes): 108
Max brk space used 23000
169826 extents written (331 MB)
Running isohybrid...
Cleaning current directory...
Cleaning up - removing symlinks to files in current directory
Как видим все собралось но не был обнаружен и обработан образ дистрибутива Puppy Linux, размер результирующего файла-образа получился 331 МБ.
Не порядок, пробуем разобраться - открываем в удобном вам редакторе файл-плагин в папке plugins - puppy.sh, осматриваем его. В каждом плагине присутствует секция в которой имя файла-дистрибутива ищется по определенному шаблону, здесь этот блок кода выглядит вот так:
if [ = links ];then
echo "lupu-*.iso lupu.puppy.iso none"
echo "racy-*.iso racy.puppy.iso none"
Здесь мы видим что плагин ищет файл-образ по шаблону lupu-*.iso или racy-*.iso. Теперь становится понятно что имя файла puppy.iso не под какой из выше приведенных шаблонов не подходит. Переименовываем файл puppy.iso в lupu.puppy.iso .
Помните оригинальное название с которого мы переименовывали файл - lupu-528.005.iso, в таком виде плагин бы сам обнаружил по шаблону этот дистрибутив, а puppy.iso - как указано в списке поддерживаемых дистрибутивов плагин просто игнорирует. Видать что автор не успевает вовремя следить и обновлять документацию, но мы то во всем разобрались - все исходные коды скриптов открыты для изучения и правки.
После переименования снова запускаем скрипт и видим следующий результат:
multicd.sh 20150517
Extracting ISO images with 7z; will build multicd.iso; UID 1000.
Clonezilla
Finnix
Puppy Linux
Memtest86+
..........................................
Total translation table size: 2048
Total rockridge attributes bytes: 4541
Total directory bytes: 15180
Path table size(bytes): 108
Max brk space used 23000
237492 extents written (463 MB)
Running isohybrid...
Cleaning current directory...
Cleaning up - removing symlinks to files in current directory
Вот это уже то что нужно, размер образа примерно сопоставим с размером трех дистрибутивов которые мы подготовили скрипту. Теперь можем приступать к тестированию образа в VirtualBox или в QEMU, а также записать образ на флеш-накопитель о проверить его работу на реальном компьютере. В предыдущей статье я подробно рассказал как записать образ на флешку.
Из данного опыта можем сделать вывод: имена файлов для переименования образов лучше всего смотреть в исходных кодах плагинов, в блоке (if [ = links ];then) и дальше по скрипту, а не на странице со списком поддерживаемых дистрибутивов!
Вот так будет выглядеть меню выбора загрузки с нашими тремя системами и memtest86 в дополнение:
Все должно грузиться и работать как в виртуальной машине, так и на компьютере.
Бывает иногда что на новых компьютерах некоторые образы не работают - причиной может быть использование порта USB версии 3.0, попробуйте подключить флеш-накопитель в порт версии USB 2.0 и повторить попытку. Есть ли у вас в компьютере USB и каких они стандартов - найдете в спецификации по материнской плате компьютера или же в описании характеристик ноутбука.
Если же проблема не в USB то причиной может быть то что в свежей версии дистрибутива файлы в папках разложены не в такой структуре как предусмотрено в плагине для этого дистрибутива - придется править плагин или же написать свой.
Важно заметить что не обязательно копировать все образы в папку со скриптом (образы могут быть большими), можно просто создать для каждого образа файл-символическую ссылку (Symbolik Link), это делается командой (для примера):
ln -s /путь-где-лежит-файл/filezilla-amd-64.iso /путь-где-распакован-MultiCD/filezilla.iso
В любом случае можно попробовать переименовать образ, к примеру ipfire-2.17.i586-full-core91.iso, в ipfire.generic.iso - это даст команду скрипту не распаковывать образ, а просто скопировать его в наш мультиобраз в таком виде как есть и при загрузке будет выгружать этот ISO-файл полностью в память, а уже оттуда пробовать загрузить из него операционную систему.
Для некоторых нужных мне дистрибутивов я все же написал свои плагины, ничего сложного в этом нет. Системы развиваются, структура обновляется, а автор скрипта и плагинов для MultiCD может не успеть за всеми 100+ дистрибутивами и это есть нормальное явление.
Плагины что я заменил и дополнил от себя:
- Debian Live
- IPFire
- Kali Linux (только live режим)
- Tails (только live режим)
Еще в процессе тестов был написан простой скрипт на Питоне для создания симлинков к образам разных дистрибутивов. Скрипт содержит в себе настройки папок где лежат iso-образы и список образов для которых нужно создать определенную символическую ссылку, по завершению работы он также выводит размер каждого дистрибутива и общий размер в сумме - удобно для того чтобы прикинуть размер необходимой флешки на которую вместится мультизагрузочный образ.
Скрипт на Питоне + мои плагины + сборка MultiCD на момент написания статьи = multicd_ph0en1x.net_26_06_2015.zip (1.1МБ)
Давайте выразим свое признание автору скрипта - Isaac Schemm за столь большую проделанную работу и за то что поделился своими наработками!
В завершение
В статье я описал свой удачный и не очень опыты с программами, которые есть в свободном доступе.
Возможно кто-то из читателей скажет: столько заморачиваться на Линуксе, можно же было установить Windows и использовать проверенные и готовые решения? - Да, но один раз разобравшись с Линукс мы получаем свободный и надежный инструмент + полезные дополнительные знания + возможность поделиться своими исследованиями и наработками с другими людьми - что я собственно и сделал в этой статье ). Надеюсь мой опыт и знания будут полезны тем кто решит собрать мультизагрузочный накопитель под Linux.
ну создал я iso, с вин7 даже. ну заупстился он в виртуалке. а на флешку то как его записать, чтобы винда довольна была??
я про multiCD
Скрипт multiCD предназначен для работы с ISO-образами дистрибутивов, которые построены на основе свободной операционной системы GNU/Linux.
Для создания загрузочных носителей с MS Windows 7-8-10 ищите и используйте другие программы. Также можно выполнить установку MS Windows на флешку, USB HDD или SSD используя программу под названием "WinNTsetup".
astra linux не поддерживает? Её вообще можно в мультизагрузочный диск запихать?
Astra Linux построена на основе Debian GNU/Linux. Официального плагина для multiCD к этой ОС нет.
Попробуйте создать такой плагин самостоятельно. На сайте разработчика скрипта есть небольшой мануал по разработке плагинов (на англ.). Как основу можете использовать какой-либо имеющийся плагин для ОС на основе Debian или Ubuntu. Придется разобраться в структуре ISO-образа Astar Linux и поэкспериментировать.
Не работал с данной ОС, но может быть и такое что она не позволит себя загружать с такого вот собранного мультизагрузочного носителя.