Давненько пользуюсь мультизагрузочным внешним жестким диском, набитым различными дистрибутивами 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 производим разметку. Сделал скриншот, но вы наверное сами всё знаете и умеете. Пусть будет.

разметка диска
разметка диска

Пояснение что тут сделано:

  1. запускаю fdisk с указанием блочного устройства диска/флэшки для разметки;

  2. вывожу на экран текущую таблицу разделов (p – print) и убеждаюсь что она пустая;

  3. создаю новый раздел ( n – new);

  4. выбираю тип раздела (p – primary), в данном случае просто соглашаюсь нажатием enter;

  5. fdisk предлагает использовать первый раздел, согласен – enter;

  6. первый сектор не вижу смысла менять. Enter;

  7. запрашивает последний сектор раздела, можно указать смещение относительно первого сектора в секторах или единицах измерения дискового пространства. Указал 60 Гб;

  8. смотрим планируемую таблицу разделов (p – print) и проверяем корректность;

  9. записываю таблицу разделов на диск (w – write).

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

формирование файловой системы
формирование файловой системы

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

запись загрузчика grub2 и копирование образов на диск
запись загрузчика grub2 и копирование образов на диск

Далее самое интересное - формирование меню загрузчика и настройка инсталляторов.

 Конфигурационный файл загрузчика называется 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)


  1. 5exi
    06.06.2022 21:28
    +21

    Ventoy?


    1. nochkin
      07.06.2022 03:24
      +5

      С этим уже статью не напишешь.


      1. alef13 Автор
        07.06.2022 22:32

        Вполне можно. Тут в комментах накидали - ventoy, netboot.xyz, multibootusb, easy2boot и если поискать то найдется ещё. Бери, да сравнивай по различным показателям/критериям - скриншотики всякие, таблички и т.д. Как раньше в бумажных журналах. В конце экспертное мнение :)

        только я такой фигнёй не занимаюсь


        1. edo1h
          07.06.2022 23:44

          а почему фигнёй? толковое сравнение я бы с удовольствием почитал.


    1. alef13 Автор
      07.06.2022 22:27

      Парни, ну что вы в самом деле? я уже и метку [tutor] поставил, и про ventoy упомянул в первых абзацах. Нифига не поняли основную мысль: эта статья как лабораторка на курсах - простая чтобы быстро повторить и достаточная чтобы показать принципы и некоторые тонкости. Можно конечно переписать сюда полностью документацию по grub2, kernel parameters, fdisk, anakonda, debian-installer и т.д. и с примерами. только никто не осилит. Еще раз -- учебная статья, только чтобы принцип был понятен. и да, то что на выходе весьма работоспособно. Без красивых менюшек только


  1. ohno1052
    06.06.2022 21:29
    +11

    Всё, что описано в статье отлично выполняется тем же самым ventoy(который является удобной оберткой для установки и управления грубом на флешке). Но не суть, изобретать велосипед — личное дело каждого.


    1. alef13 Автор
      07.06.2022 06:56

      исходники Ventoy на гитхабе посмотрел и сразу закрыл. Пусть остаётся чёрным ящиком :)


  1. Naves
    06.06.2022 21:41
    +2

    1) Не заметил в статье, а как загрузчик grub появляется на вашем диске?

    2) Как насчет боли UEFI?


    1. alef13 Автор
      07.06.2022 06:44
      +1

      grub2-install

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


  1. AlexGluck
    06.06.2022 22:01
    +3

    А что с виндовыми образами? А утилиты мемтест, Виктория, мэдс, сброс паролей винды, прошивка компонентов компьютера?


    1. alef13 Автор
      07.06.2022 06:59

      не пользуюсь, потому и нет


    1. 13werwolf13
      07.06.2022 07:07
      +1

      всё кроме виктории есть в образе systemrecuecd

      меня больше интересует зачем в 2022 году legacy загрузчик и как в 2022 году без uefi загрузчика?!

      лично для себя даже ventoy выкинул на помойку когда узнал про существование netboot.xyz


      1. OptimumOption
        07.06.2022 08:57

        поковырял .xyz, в виртуалке ни один дистр не прогрузился. спасибо, я лучше на ventoy посижу :)


        1. 13werwolf13
          07.06.2022 09:04

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


      1. gumanzoy
        07.06.2022 10:09

        netboot.xyz

        А если ноутбук без Ethernet порта ?


        1. 13werwolf13
          07.06.2022 10:14

          вроде бы как с wi-fi тоже работает (естественно с ручным вбиванием настроек подключения), но я не пробовал честно говоря, вообще не фанат устройств из которых повырезали всё полезное. у меня из устройств без ethernet только телефон и pinebook pro, во втором я это решил при помощи type-c докстанции, и зарядка и ethernet и второй моник одним шнурочком, удобненько.


    1. 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
      }


  1. Albert2009ru
    06.06.2022 22:23

    А старый добрый TFTP через реализацию ipxe с их клёвыми менюшками??? До сих пор делаю и из сети и с образов грузится просто отлично... Ну и как выше писали мемтест и т.п. тоже неплохо, через то же меню реализованы...


    1. yarkovoy
      07.06.2022 05:18
      +1

      Подскажите а под UEFI у вас работает загрузка посети?


      1. Albert2009ru
        07.06.2022 05:28
        +1

        Можете дать модельку платы или чипсета? С UEFI на старых гигабайтовских платах вроде всё ок было, но надо перепроверить.

        зы По моему посту выше, может сложится впечатление, что я этот tftp прямо в день по нескольку раз под разные системы настраиваю. Конечно же это не так... Сейчас в этом вопросе я ближе к состоянию - сделал и забыл, не обессудьте... И железо на работе у нас довольно таки старое...


        1. yarkovoy
          07.06.2022 05:49
          +1

          Сейчас уже модель не подскажу. У меня иногда возникает желание поднять сервер с образами. Но как дело доходит до UEFI все стопорится и некорректно работает. То подвисает загрузка, то вообще не видит сервер.


          1. 13werwolf13
            07.06.2022 07:08

            uefi pxe и legacy pxe я делал, проблем не возникло. а вот uefi+legacy pxe у меня ещё ни разу не получилось..

            UPD: оп сабжу вашей проблемы, у меня решилось нечто подобное включением portfast на порту комутатора куда был воткнут проблемный сервер


            1. AlexGluck
              07.06.2022 10:53

              Я cobbler делал для legacy+uefi, умвр.


              1. 13werwolf13
                07.06.2022 11:50

                спасибо за наводку, потыкаю как нибудь обязательно.


            1. 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"


    1. alef13 Автор
      07.06.2022 06:52
      +1

      где есть инфраструктура -- да, применимо. Где нет её, приходится грузиться с локального носителя. Для "энтерпрайза" хороший вариант задать в параметрах ядра свой ip-адрес и указать откуда стащить kickstart файл. А вот уже в самом kickstart-е вытворять чудеса :)


  1. select26
    06.06.2022 22:43

    Вот что за фашизм со скриншотами?

    Ещё и заботливо подчеркнутыми?

    И тема мне интересна, и глаза болят - не могу читать.


    1. alef13 Автор
      07.06.2022 07:35
      +1

      сорри. не нашёл подходящего варианта. есть свои идеи по оформлению?


  1. edo1h
    07.06.2022 01:17

    Извините, но 100500 ручных действий в стиле «смотрим какой дистрибутив» и «смотрим какая метка диска» иначе как костылём я назвать не могу.


    1. alef13 Автор
      07.06.2022 07:34
      +1

      а иначе никак. Делается это один раз (вру конечно - не один :)) на этапе компоновки диска, а потом пользуемся.


  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, но он всё равно выглядит громоздким из-за клавиатуры).


    1. 13werwolf13
      07.06.2022 07:10
      +1

      проекты интересные, но использовать малину как эмулятор сидирома это какой-то лютый оверинженеринг ИМХО.


      1. storoj
        07.06.2022 13:17

        Наверное да, я просто всегда хотел, чтобы у меня была замена моего VE-200 размером с его экранчик (т.е. избавиться от HDD). Вот бы кто-нибудь тоже вдохновился этой идеей и сделал.

        Жаль сам не умею, и даже не знаю с чего начинать.


  1. user012
    07.06.2022 10:09

    По моему лучшее решение это ioddMINI, есть поддержка ISO, VHD, защита от записи и т.д.

    Можно создать виртуальные флешки на основе VHD, загружать ISO, 100% совместимость.


  1. 3ap
    07.06.2022 10:24

    https://github.com/hackerncoder/multibootusb

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


  1. MABPs
    07.06.2022 22:21

    Ну и до кучи - есть еще замечательный (по моему личному мнению) проект www.easy2boot.com (сайт сейчас почему то не доступен), все умеет из коробки, все так же - закидывай ISO файлы и специальные (подготовленные) VHD файлы и грузись себе с радостью, причем хочу отметить что вариант спасал меня загрузиться даже в самых "безнадежных" ситуациях.

    P.S.
    В новой версии www.easy2boot.com - графическое меню, которое лично мне не нравиться, но его можно отключить и работать в "красивом" терминальном меню (по типу Hirens BootCD)


  1. LeshaRB
    07.06.2022 23:24

    AioBoot?