Давненько пользуюсь мультизагрузочным внешним жестким диском, набитым различными дистрибутивами Linux. В свете последних событий и очередной волны импортозамещения понадобилось дополнить его и «отечественными» дистрибутивами. Решил сделать для себя небольшое HOWTO, заодно поделиться с сообществом.
Не буду тянуть резину за хвост в долгий ящик а сразу изложу коротенько суть — на внешнем usb-диске размещаются файлы установочных образов дистрибутивов в формате .iso , а для загрузчика grub2 формируется меню с специфичными параметрами для каждого дистрибутива, которые позволяют произвести загрузку и установку с необходимого образа. Кому стало неинтересно — расходимся. Никаких сакральных знаний тут не будет.
Для остальных поясняю зачем именно так, ведь есть на свете всяческие мультизагрузочные решения вроде ventoy и т.д.? Ну во-первых хочется получить всё самое свежее и не факт, что эти системы будут оперативно добавлять отечественные дистрибутивы при задёргивании железных штор. Во-вторых интересно в этом немного поразбираться самому. В остальных - это удобно использовать, удобно добавлять новые дистрибутивы, легко зачищать устаревшие, на внешнем диске имеется много свободного пространства, доступного системе в процессе установки — можно к примеру брать оттуда специфические драйвера, пакеты или складывать логи.
Приступаем. Приборы и материалы:
Внешний usb-диск без всяких требований к производителю/скорости/формфактору/объёму – флэшка или hdd, как у меня.
Компьютер с операционной системой linux.
Установочные образы дистрибутивов linux в формате iso – скачиваем у производителей. Для лабораторной работы заготовлены вот эти файлики:
alt-workstation-10.0-x86_64.iso;
CentOS-8.4.2105-x86_64-dvd1.iso;
orel-current.iso;
redos-MUROM-7.3-20210412-Everything-x86_64-DVD1.iso;
REL-Desktop-DVD-x86_64-7.3.iso;
ubuntu-21.10-desktop-amd64.iso.
Как видно, четыре из них “отечественные”, а два – самые распространённые коммерческие.
Первый шаг.
Мой диск размером 250 Гб был абсолютно пустой, поэтому буду размечать и форматировать без сохранения данных. Более того, по моим прикидкам, для мультибута с данным набором дистрибутивов и планируемым развитием, будет более чем достаточно 60 Гб, а остальному пространству я найду другое применение. Подключаем диск (если система его успела автоматически смонтировать — отмонтируем), далее под рутом или через sudo производим разметку. Сделал скриншот, но вы наверное сами всё знаете и умеете. Пусть будет.
Пояснение что тут сделано:
запускаю fdisk с указанием блочного устройства диска/флэшки для разметки;
вывожу на экран текущую таблицу разделов (p – print) и убеждаюсь что она пустая;
создаю новый раздел ( n – new);
выбираю тип раздела (p – primary), в данном случае просто соглашаюсь нажатием enter;
fdisk предлагает использовать первый раздел, согласен – enter;
первый сектор не вижу смысла менять. Enter;
запрашивает последний сектор раздела, можно указать смещение относительно первого сектора в секторах или единицах измерения дискового пространства. Указал 60 Гб;
смотрим планируемую таблицу разделов (p – print) и проверяем корректность;
записываю таблицу разделов на диск (w – write).
Следующим этапом формируем файловую систему. В нашем случае требования к файловой системе тоже минимальные — достаточно будет и ext2
Записываем загрузчик и копируем наши образы в каталог iso, который предварительно создадим на нашем мультизагрузочном диске(флэшке). Скриншот прилагается.
Далее самое интересное - формирование меню загрузчика и настройка инсталляторов.
Конфигурационный файл загрузчика называется grub.cfg и предсталяет собой простой текстовый файл, который должен находиться в каталоге /boot/grub2 (/mnt/USB/boot/grub2 в нашем случае). Т.к. его ещё нет, то создадим в любом текстовом редакторе. Полный формат файл рассматривать не буду, если надо, то источников в сети достаточно, здесь же будет только самый минимум необходимый для запуска инсталлятора конкретного дистрибутива.
RedHat-based дистрибутивы. Здесь их целых 3 варианта — CentOS, ROSA, REDos, но принцип формирования одинаковый т.к. используется штатный инсталлятор RedHat anaconda. Вот пример для CentOS:
menuentry "CentOS-Stream-8-x86_64-20210204" {
isofile="/iso/CentOS-Stream-8-x86_64-20210204-dvd1.iso"
loopback loop "${isofile}"
linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" inst.stage2=hd:LABEL=CentOS-Stream-8-x86_64-dvd
initrd (loop)/isolinux/initrd.img
}
Пояснения как вписать параметры для остальных RedHat-based дистрибутивов:
menuentry – название пункта меню. Придумывайте самостоятельно.
isofile — имя образа с полным путём относительно корня нашего мультизагрузочного диска/флэшки.
Параметр LABEL это метка диска и её мы считываем утилитой blkid, предварительно смонтировав образ iso через loop-device. Если в метке встречаются пробелы, то их следует заменить на \x20.
Дополнительные параметры ядра и инсталлятора я намеренно убрал. В случае необходимости добавить их не составит труда, тем более что документация у RedHat очень качественная и даже переведена на русский язык. Таким же образом вносим пункты меню для RedOS и Rosa Linux (в конце статьи будет полный конфиг)
немного о параметрах ядра
многие новички спрашивают что можно, а что нельзя писать в параметрах к строчке с ядром - боязно что-нибудь сломать и получить большой кирпич. Ничего страшного - прежде всего, grub позволяет при загрузке вручную откорректировать все необходимые строчки (нажмите «e» на нужном пункте меню) и загрузиться с новыми параметрами (после правки – «Ctrl-x»). Ну и дополнительно — ядро при загрузке будет смотреть на параметры которые оно понимает (https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html), всё остальное будет просто пропущено. Полную строчку с параметрами ядро сохранит в /proc/cmdline и она будет доступна остальным процессам — например systemd. Ну и соответственно из этой строчки выбирает знакомые слова инсталлятор системы и корректирует своё поведение. А чтобы вообще хорошо погрузиться - читайте man kernel-command-line.
Debian-based дистрибутивы. Здесь также их 2 вида, но есть небольшие «подводные грабли».
Сначала конфигурация Ubuntu:
menuentry "Ubuntu 21.10 Impish Indri Release amd64 (20211012)" {
isofile="/iso/ubuntu-21.10-desktop-amd64.iso"
loopback loop "${isofile}"
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename="${isofile}" noprompt noeject debug file=/cdrom/preseed/ubuntu.seed maybe-ubiquity splash ---
initrd (loop)/casper/initrd
Вроде не сильно отличается от ранее рассмотренных вариантов и это хорошо. Сразу скажу, что практически всю свою профессиональную деятельность имел дело с RH-based дистрибутивами (ещё Solaris, HP-UX) и особо инсталляторы других систем не изучал. Посему строчка запуска ядра взята с образа и не корректировалась — добавлены только опции debug и iso-scan/filename.
Следующий дистрибутив Astra Linux — тоже дебиан в чистом виде. Конфигурацию привожу:
menuentry "Astra linux common edition (v2.12 OREL)" {
isofile="/iso/orel-current.iso"
loopback loop "${isofile}"
linux (loop)/hd-media/vmlinuz modprobe.blacklist=evbug
initrd (loop)/hd-media/initrd.gz
}
Обращаю внимание, что ядро и рамдиск для загрузки образа находятся в каталоге /hd-media . Далее явный «косяк» (рука не поднимается написать фича) - это поиск файла образа. По документации (также и в скрипте iso-scan — я смотрел, но вникать в логику и править не стал т.к. должны использоваться оригинальные образы) можно указать через iso-scan/filename где находится файл с образом. Однако, что-то там поломано - в процессе инсталляции наблюдаем логи и видим, что и инсталлятор прошарился по всем подкаталогам, iso-scan/filename не приняв во внимание. Ну и самое неприятное в моём случае, это то, что он первым нашёл образ ubuntu и смонтировал его как родного в каталог /hd-media, проигнорировав лежащий рядом orel-current.iso! Как уже написал выше, не стал разбираться как расставить приоритеты (документация дебиана/астры мне тоже не понравилась), сделал образу orel-current.iso хардлинк в корень установочного диска и он теперь всегда находится первым. Несомненно, это костыль.
Очередной пациент — ALT Linux. Инсталлятор собственный и даже немного документирован:
menuentry "ALT Workstation 10.0 x86_64 build 2021-12-10" {
isofile="/alt-workstation-10.0-x86_64.iso"
loopback loop "${isofile}"
linux (loop)/boot/vmlinuz fastboot automatic=method:disk,disk:sdb,partition:sdb1,directory:"${isofile}" stagename=altinst ramdisk_size=475545 vga=normal splash lowmem
initrd (loop)/boot/full.cz
}
Ключевая опция - automatic. В нашем случае мы указываем метод установки — с жесткого диска (установка с образа возможна только с диска или по nfs), с диска sdb, с партиции sdb1, directory указывает на полное имя образа. Режет глаз жесткое указание диска и партиции. Если у вас в системе более одного жесткого диска, то сразу понятно что наша конфигурация уже не сработает. Тут только можно сделать «пробную» установку, провалиться в консоль и посмотреть реальные названия/пути дисков. Далее запустить повторную установку и в меню grub по нажатию «e» отредактировать параметры установки, следом грузиться по «Ctrl-x». Решение рабочее, но это неправильно и неудобно. Также полагаю что можно поиграться с командой search. Данный метод не пробовал, если кто напишет — поправлю.
Для других дистрибутивов алгоритм действий аналогичный: скачиваем установочный iso-образ и копируем его на наш диск, далее добавляем пункт меню в файл конфигурации загрузчика. Основная задача - выяснить какие опции необходимо передать установщику дистрибутива для его корректной загрузки из образа.
полный текст grub.cfg
menuentry "CentOS-Stream-8-x86_64-20210204" {
isofile="/iso/CentOS-Stream-8-x86_64-20210204-dvd1.iso"
loopback loop "${isofile}"
linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" inst.stage2=hd:LABEL=CentOS-8-4-2105-x86_64-dvd
initrd (loop)/isolinux/initrd.img
}
menuentry REL-Desktop-DVD-x86_64-7.3 {
isofile="/iso/REL-Desktop-DVD-x86_64-7.3.iso"
loopback loop "${isofile}"
linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" inst.stage2=hd:LABEL=ROSA\x20Linux-7.3-x86_64
initrd (loop)/isolinux/initrd.img
}
menuentry "RED OS MUROM-7.3" {
isofile="/iso/redos-MUROM-7.3-20210412-Everything-x86_64-DVD1.iso"
loopback loop "${isofile}"
linux (loop)/isolinux/vmlinuz iso-scan/filename="${isofile}" inst.stage2=hd:LABEL=redos-MUROM-7.3\x20x86_64
initrd (loop)/isolinux/initrd.img
}
menuentry "Astra linux common edition (v2.12 OREL)" {
set gfxpayload=keep
isofile="/iso/orel-current.iso"
loopback loop "${isofile}"
linux (loop)/hd-media/vmlinuz modprobe.blacklist=evbug
initrd (loop)/hd-media/initrd.gz
}
menuentry "ALT Workstation 10.0 x86_64 build 2021-12-10" {
isofile="/iso/alt-workstation-10.0-x86_64.iso"
loopback loop "${isofile}"
linux (loop)/boot/vmlinuz fastboot automatic=method:disk,disk:sdb,partition:sdb1,directory:"${isofile}" stagename=altinst ramdisk_size=475545 vga=normal splash lowmem
initrd (loop)/boot/full.cz
}
menuentry "Ubuntu 21.10 Impish Indri Release amd64 (20211012)" {
isofile="/iso/ubuntu-21.10-desktop-amd64.iso"
loopback loop "${isofile}"
linux (loop)/casper/vmlinuz iso-scan/filename="${isofile}" boot=casper noprompt noeject debug file=/cdrom/preseed/ubuntu.seed maybe-ubiquity splash ---
initrd (loop)/casper/initrd
}
menuentry "Hard drive" {
set root=(hd0,1)
chainloader (hd0,1)+1
}
Если что упустил, в виду нехватки знаний, или круто заблуждаюсь – пишите, буду втихаря корректировать статью, надеюсь, никто не заметит.
Комментарии (37)
ohno1052
06.06.2022 21:29+11Всё, что описано в статье отлично выполняется тем же самым ventoy(который является удобной оберткой для установки и управления грубом на флешке). Но не суть, изобретать велосипед — личное дело каждого.
alef13 Автор
07.06.2022 06:56исходники Ventoy на гитхабе посмотрел и сразу закрыл. Пусть остаётся чёрным ящиком :)
AlexGluck
06.06.2022 22:01+3А что с виндовыми образами? А утилиты мемтест, Виктория, мэдс, сброс паролей винды, прошивка компонентов компьютера?
13werwolf13
07.06.2022 07:07+1всё кроме виктории есть в образе systemrecuecd
меня больше интересует зачем в 2022 году legacy загрузчик и как в 2022 году без uefi загрузчика?!
лично для себя даже ventoy выкинул на помойку когда узнал про существование netboot.xyz
OptimumOption
07.06.2022 08:57поковырял .xyz, в виртуалке ни один дистр не прогрузился. спасибо, я лучше на ventoy посижу :)
13werwolf13
07.06.2022 09:04о как интересно, меня он подвёл лишь однажды, на гавноноуте не разпознал сетёвку, в виртуалках вообще ни разу проблем не встречал.
gumanzoy
07.06.2022 10:09netboot.xyz
А если ноутбук без Ethernet порта ?
13werwolf13
07.06.2022 10:14вроде бы как с wi-fi тоже работает (естественно с ручным вбиванием настроек подключения), но я не пробовал честно говоря, вообще не фанат устройств из которых повырезали всё полезное. у меня из устройств без ethernet только телефон и pinebook pro, во втором я это решил при помощи type-c докстанции, и зарядка и ethernet и второй моник одним шнурочком, удобненько.
gumanzoy
07.06.2022 12:46+1Бинарник memtest86+ запускается напрямую (не из .iso). А любые floppy образы с DOS программами через memdisk
В Debian он лежит в /usr/lib/syslinux/memdisk из пакета syslinux-common
menuentry "memtest86+" { linux16 /boot/bootdisk/memtest } menuentry "FreeDOS" { linux16 /boot/memdisk initrd16 /boot/bootdisk/balder10.imz } menuentry "MHDD" { linux16 /boot/memdisk initrd16 /boot/bootdisk/mhdd.imz }
Albert2009ru
06.06.2022 22:23А старый добрый TFTP через реализацию ipxe с их клёвыми менюшками??? До сих пор делаю и из сети и с образов грузится просто отлично... Ну и как выше писали мемтест и т.п. тоже неплохо, через то же меню реализованы...
yarkovoy
07.06.2022 05:18+1Подскажите а под UEFI у вас работает загрузка посети?
Albert2009ru
07.06.2022 05:28+1Можете дать модельку платы или чипсета? С UEFI на старых гигабайтовских платах вроде всё ок было, но надо перепроверить.
зы По моему посту выше, может сложится впечатление, что я этот tftp прямо в день по нескольку раз под разные системы настраиваю. Конечно же это не так... Сейчас в этом вопросе я ближе к состоянию - сделал и забыл, не обессудьте... И железо на работе у нас довольно таки старое...
yarkovoy
07.06.2022 05:49+1Сейчас уже модель не подскажу. У меня иногда возникает желание поднять сервер с образами. Но как дело доходит до UEFI все стопорится и некорректно работает. То подвисает загрузка, то вообще не видит сервер.
13werwolf13
07.06.2022 07:08uefi pxe и legacy pxe я делал, проблем не возникло. а вот uefi+legacy pxe у меня ещё ни разу не получилось..
UPD: оп сабжу вашей проблемы, у меня решилось нечто подобное включением portfast на порту комутатора куда был воткнут проблемный сервер
gumanzoy
07.06.2022 12:36+1Вот так у меня настроено в /etc/dnsmasq.conf. За legacy загрузку отвечает pxelinux, а UEFI - syslinux.efi Оба используют конфиг pxelinux.cfg/default
dhcp-match=set:efi-x86_64,option:client-arch,7 dhcp-match=set:efi-x86_64,option:client-arch,9 dhcp-match=set:bios,option:client-arch,0 dhcp-boot=tag:efi-x86_64,"syslinux.efi" dhcp-boot=tag:bios,"pxelinux.0"
alef13 Автор
07.06.2022 06:52+1где есть инфраструктура -- да, применимо. Где нет её, приходится грузиться с локального носителя. Для "энтерпрайза" хороший вариант задать в параметрах ядра свой ip-адрес и указать откуда стащить kickstart файл. А вот уже в самом kickstart-е вытворять чудеса :)
edo1h
07.06.2022 01:17Извините, но 100500 ручных действий в стиле «смотрим какой дистрибутив» и «смотрим какая метка диска» иначе как костылём я назвать не могу.
alef13 Автор
07.06.2022 07:34+1а иначе никак. Делается это один раз (вру конечно - не один :)) на этапе компоновки диска, а потом пользуемся.
storoj
07.06.2022 03:40На всякий случай напомню про IODD/Zalman VE-200, но хотел ещё поделиться тем, что недавно наткнулся на проекты типа https://github.com/tjmnmk/gadget_cdrom и https://www.reddit.com/r/RASPBERRY_PI_PROJECTS/comments/itefrt/raspi_virtual_odd_optical_disk_drive/, позволяющие собрать совсем миниатюрный эмулятор cdrom с образами на microsd вместо 2.5" hdd (хотя есть IODD Mini, но он всё равно выглядит громоздким из-за клавиатуры).
13werwolf13
07.06.2022 07:10+1проекты интересные, но использовать малину как эмулятор сидирома это какой-то лютый оверинженеринг ИМХО.
storoj
07.06.2022 13:17Наверное да, я просто всегда хотел, чтобы у меня была замена моего VE-200 размером с его экранчик (т.е. избавиться от HDD). Вот бы кто-нибудь тоже вдохновился этой идеей и сделал.
Жаль сам не умею, и даже не знаю с чего начинать.
user012
07.06.2022 10:09По моему лучшее решение это ioddMINI, есть поддержка ISO, VHD, защита от записи и т.д.
Можно создать виртуальные флешки на основе VHD, загружать ISO, 100% совместимость.
3ap
07.06.2022 10:24https://github.com/hackerncoder/multibootusb
Та же самая идея с хранением .iso на флешке и использованием GRUB, только менюшки "автоматически" (имеется в виду, что для большинства популярных дистрибутивов написаны конфиги, аналогичные конфигам автора статьи) подхватывают все .iso
MABPs
07.06.2022 22:21Ну и до кучи - есть еще замечательный (по моему личному мнению) проект www.easy2boot.com (сайт сейчас почему то не доступен), все умеет из коробки, все так же - закидывай ISO файлы и специальные (подготовленные) VHD файлы и грузись себе с радостью, причем хочу отметить что вариант спасал меня загрузиться даже в самых "безнадежных" ситуациях.
P.S.
В новой версии www.easy2boot.com - графическое меню, которое лично мне не нравиться, но его можно отключить и работать в "красивом" терминальном меню (по типу Hirens BootCD)
5exi
Ventoy?
nochkin
С этим уже статью не напишешь.
alef13 Автор
Вполне можно. Тут в комментах накидали - ventoy, netboot.xyz, multibootusb, easy2boot и если поискать то найдется ещё. Бери, да сравнивай по различным показателям/критериям - скриншотики всякие, таблички и т.д. Как раньше в бумажных журналах. В конце экспертное мнение :)
только я такой фигнёй не занимаюсь
edo1h
а почему фигнёй? толковое сравнение я бы с удовольствием почитал.
alef13 Автор
Парни, ну что вы в самом деле? я уже и метку [tutor] поставил, и про ventoy упомянул в первых абзацах. Нифига не поняли основную мысль: эта статья как лабораторка на курсах - простая чтобы быстро повторить и достаточная чтобы показать принципы и некоторые тонкости. Можно конечно переписать сюда полностью документацию по grub2, kernel parameters, fdisk, anakonda, debian-installer и т.д. и с примерами. только никто не осилит. Еще раз -- учебная статья, только чтобы принцип был понятен. и да, то что на выходе весьма работоспособно. Без красивых менюшек только