Мультизагрузочный Usb-Накопитель. Своими Руками

Я уже давно пользуюсь мультизагрузочным внешним жёстким диском, наполненным различными дистрибутивами Linux. В свете последних событий и очередной волны импортозамещения возникла необходимость дополнить его «отечественными» дистрибутивами.

Я решил сделать для себя небольшой HOWTO и поделиться им с сообществом.

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

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

Если кому-то не интересно, то расстанемся.

Никаких сакральных знаний здесь не будет. Для остальных объясню почему так, ведь есть всякие мультизагрузочные решения типа вентой и т.п.

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

Во-вторых, интересно в этом немного разобраться самому.

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



Давайте начнем.

Приборы и материалы:

Внешний USB накопитель без каких-либо требований к производителю/скорости/форм-фактору/объему - флешка или hdd, как у меня.

Компьютер с операционной системой Linux. Установочные образы дистрибутивов Linux в формате iso — скачать у производителей.

Эти файлы были подготовлены для лабораторной работы:

  • альтернативная рабочая станция-10.0-x86_64.iso;
  • CentOS-8.4.2105-x86_64-dvd1.iso;
  • орел-current.iso;
  • redos-MUROM-7.3-20210412-Everything-x86_64-DVD1.iso;
  • REL-Desktop-DVD-x86_64-7.3.iso;
  • Ubuntu-21.10-рабочий стол-amd64.iso.
Как видите, четыре из них — «отечественные», а два — наиболее распространенные коммерческие.



Первый шаг.

Мой диск на 250 ГБ оказался совершенно пуст, поэтому я его размечу и отформатирую без сохранения данных.

Более того, по моим прикидкам, для мультизагрузки с данным набором дистрибутивов и планируемой разработкой 60 ГБ будет более чем достаточно, а остальному пространству я найду другое применение.

Подключаем диск (если система успела его смонтировать автоматически, размонтируем), затем под рутом или через sudo выполняем разметку.

Я сделал скриншот, но вы наверняка знаете и можете все сделать сами.

Будь как будет.

мультизагрузочный USB-накопитель.
</p><p>
 своими руками

разметка диска Объяснение того, что было сделано здесь:

  1. Запускаю fdisk с указанием блочного устройства диска/флешки для разметки;
  2. Я показываю текущую таблицу разделов (p – print) и проверяю, что она пуста;
  3. создать новый раздел (n – новый);
  4. Выбираю тип раздела (p – основной), в этом случае просто соглашаюсь, нажимая Enter;
  5. fdisk предлагает использовать первый раздел, согласен — входим;
  6. Я не вижу смысла менять первый сектор.

    Входить;

  7. запрашивает последний сектор раздела, вы можете указать смещение относительно первого сектора в секторах или единицах дискового пространства.

    Указано 60 ГБ;

  8. посмотрите запланированную таблицу разделов (p – распечатать) и проверьте ее правильность;
  9. Таблицу разделов записываю на диск (w – запись).

Следующий шаг — создание файловой системы.

В нашем случае требования к файловой системе также минимальны — ext2 будет достаточно.



мультизагрузочный USB-накопитель.
</p><p>
 своими руками

формирование файловой системы Записываем загрузчик и копируем наши образы в каталог iso, который предварительно создадим на нашем мультизагрузочном диске (флешке).

Скриншот прилагается.



мультизагрузочный USB-накопитель.
</p><p>
 своими руками

написание загрузчика grub2 и копирование образов на диск Дальше самое интересное - создание меню загрузчика и настройка установщиков.

Файл конфигурации загрузчика называется grub.cfg и представляет собой простой текстовый файл, который должен находиться в каталоге /boot/grub2 (в нашем случае /mnt/USB/boot/grub2).

Поскольку его пока не существует, создадим его в любом текстовом редакторе.

Полный формат файла рассматривать не буду; при необходимости исходников в сети достаточно, но здесь будет только тот минимум, необходимый для запуска установщика для конкретного дистрибутива.

Дистрибутивы на базе RedHat. Здесь 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:
  • вход в меню – название пункта меню.

    Придумайте свои собственные идеи.

  • изофайл — имя образа с полным путем относительно корня нашего мультизагрузочного диска/флешки.

Параметр ЭТИКЕТКА Это метка диска и читаем ее утилитой blkid, предварительно смонтировав iso-образ через шлейф-устройство.

Если в метке есть пробелы, их следует заменить на \x20.

мультизагрузочный USB-накопитель.
</p><p>
 своими руками

получить информацию о метке диска на изображении Я намеренно удалил дополнительные параметры ядра и установщика.

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

Таким же образом добавляем пункты меню для RedOS и Rosa Linux (полный конфиг будет в конце статьи) немного о параметрах ядра Многие новички спрашивают, что можно и что нельзя писать в параметрах строки с ядром — боятся что-нибудь сломать и получить большой кирпич.

Ничего страшного — во-первых, grub позволяет вручную исправить все нужные строки при загрузке (нажать «е» на нужном пункте меню) и загрузиться с новыми параметрами (после редактирования — «Ctrl-x»).

Ну и кроме того - при загрузке ядро будет смотреть те параметры, которые оно понимает( https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html ), все остальное будет просто пропущено.

Ядро сохранит полную строку с параметрами в /proc/cmdline и она будет доступна другим процессам — например systemd. Ну и соответственно установщик системы выбирает из этой строки знакомые слова и корректирует свое поведение.

Чтобы лучше понять это, прочтите man kernel-command-line. Дистрибутивы на основе Debian. Их тоже есть 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 (также Solaris, HP-UX) и особо не изучал инсталляторы для других систем.

Поэтому строка запуска ядра была взята из образа и не корректировалась — были добавлены только опции debug и iso-scan/filename. Следующий дистрибутив Astra Linux — это тоже Debian в чистом виде.

Вот конфигурация:

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! Как я писал выше, я не стал разбираться, как расставлять приоритеты (документация Debian/Astra мне тоже не понравилась), поэтому сделал образ 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 }

Ключевой вариант – автоматический.

В нашем случае указываем способ установки - с жесткого диска (установка из образа возможна только с диска или через nfs), с sdb-диска, из раздела sdb1, в каталоге указывается полное имя образа.

Жёсткая индикация диска и раздела режет глаз.

Если у вас в системе более одного жесткого диска, то сразу понятно, что наша конфигурация больше не подойдет. Здесь можно сделать только «тестовую» установку, зайти в консоль и посмотреть настоящие имена/пути дисков.

Далее запустите переустановку и в меню grub нажмите «e», чтобы отредактировать параметры установки, затем загрузитесь с помощью «Ctrl-x».

Решение рабочее, но оно неверное и неудобное.

Я также думаю, что вы можете поиграть с командой поиска.

Этот способ не пробовал, если кто напишет, поправлю.

Для других дистрибутивов алгоритм действий аналогичен: скачиваем установочный 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 }

Если я что-то упустил по незнанию или совсем ошибаюсь, пишите, потихоньку подправлю статью, надеюсь никто не заметит. Теги: #*nix #Системное программирование #мультизагрузка #grub2

Вместе с данным постом часто просматривают: