unix
September 16, 2023

Пять систем на машине: делаем multiboot

Как вы наверное успели заметить, я использую кучу разных операционных систем, которые надо как-то загружать. Рассказываю как такое настраивается на примере машины с пятью ОС: Ubuntu, Mageia, FreeBSD, Windows11 и OpenIndiana.

Основы

В компьютере есть такая штука как жесткий диск, на диске есть разделы. Схема разбивки диска на разделы называется partition table, их много разных но для обычного пользователя PC актуальны два: GPT и MBR.

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

На машине которую я использовал для примера используется MBR и отключена UEFI загрузка ради OpenIndiana, которая пока не поддерживает GPT.

В принципе проблема поддержки GPT + UEFI существует во всех редких либо устаревших ОС, поэтому если возникнет необходимость таковую развернуть — вам придется форматировать диск с таблицей разделов под MBR.

На описываемой машине стоит два диска, вот так выглядит разбивка на втором:

MBR, Windows 11 и OpenIndiana

Для того чтобы загрузиться с конкретного раздела диска, на нем должен стоять специальный флаг «boot» (см. картинку выше).

Загрузка и загрузчики

У каждой ОС есть свой собственный загрузчик, в случае самой любимой операционной системы это выглядит вот так:

Да, существуют способы запихать и сюда другие ОС чтобы прямо из этого меню запускались всякие линуксы и FreeBSD.

Но они уж слишком неудобны.

Поэтому я использовал и использую Grub2 в качестве основного загрузчика, о нем и его настройке и пойдет речь.

В случае MBR загрузчик прописывается в первый раздел диска и запускается первым, до операционной системы.

Он запускается при выборе диска в качестве загрузочного в BIOS вашего компьютера:

Вот такой командой можно установить загрузчик Grub на второй диск в системе:

grub-install /dev/sdb

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

Несмотря на то что grub есть практически во всех линуксах, BSD и юниксах, степень его поддержки и набор модулей - отличаются.

Поэтому я крайне рекомендую осуществлять настройку главного загрузчика из какого-то популярного линукса (например Ubuntu), что я и делаю ниже.

Linux

На взятой для примере машине их два: Ubuntu и Mageia. Настройка и установка grub мало чем отличается в этих дистрибьютивах, но для отчетности напишу что все операции производились из-под Ubuntu.

Главный конфигурационный файл grub находится в /boot/grub/grub.cfg , в каталоге /etc/grub.d находятся отдельные его части, которые собираются в единое целое командой:

update-grub2

Проще говоря, после отработки команды выше после перезагрузки вы увидите меню с выбором ОС:

Добавление самих линуксов происходит автоматически, но для проформы приведу пример сгенеренного элемента меню для Mageia 9:

menuentry 'Mageia 9 (9) (on /dev/sda7)' --class mageia --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-a75595a4-4de4-4d56-a8ad-a729466b0cc3' {
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt7'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a75595a4-4de4-4d56-a8ad-a729466b0cc3
	else
	  search --no-floppy --fs-uuid --set=root a75595a4-4de4-4d56-a8ad-a729466b0cc3
	fi
	linux /boot/vmlinuz-6.4.9-desktop-4.mga9 root=UUID=a75595a4-4de4-4d56-a8ad-a729466b0cc3 ro splash quiet noiswmd resume=UUID=b5c0fab6-8e46-4747-8119-4ca205c24238 audit=0 nopti vga=791
	initrd /boot/initrd-6.4.9-desktop-4.mga9.img
}

Windows

Прежде чем ставить современную Windows в multiboot, надо знать несколько вещей:

  1. Windows помимо своего раздела создает еще два скрытых, что в случае MBR означает попадание на лимит в 4 primary partition. Причем разделы Windows должны быть в начале диска. На практике это значит что Windows на диск нужно ставить первой, до всех остальных ОС.
  2. Загрузочная флешка должна быть создана специально для MBR, стандартная GPT + UEFI не заработает. Windows установленную на MBR раздел, будет невозможно загрузить с включенным UEFI.

Вообще современные версии Windows ставятся на GPT и запускаются через UEFI, имейте это ввиду.

Создание пункта меню Grub для запуска Windows происходит автоматически, при запуске os-prober, который запускается как часть процесса update-grub2.

Итоговая настройка выглядит примерно так:

menuentry 'Windows 11 (on /dev/sdb1)' --class windows --class os $menuentry_id_option 'osprober-chain-5ED2C518D2C4F4F5' {
	insmod part_msdos
	insmod ntfs
	set root='hd1,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  5ED2C518D2C4F4F5
	else
	  search --no-floppy --fs-uuid --set=root 5ED2C518D2C4F4F5
	fi
	parttool ${root} hidden-
	drivemap -s (hd0) ${root}
	chainloader +1
}

Технически тут происходит передача флага второму загрузчику, установленному не в начале диска а в начале раздела.

За это отвечает команда:

chainloader +1

Указание на конкретный раздел вот тут:

set root='hd1,msdos1'

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

Теперь переходим к более экзотическим ОС.

FreeBSD

Конечно же возможно по аналогии с Windows поставить загрузчик на раздел и запускать его через все тот же chainloader +1.

Но есть способ лучше:

menuentry "FreeBSD 13" {
    insmod ufs2
    set root='(hd0,2)'
    search --no-floppy --fs-uuid --set 65032f27c2652c99
    kfreebsd /boot/loader
    }

Такой настройкой осуществляется запуск загрузчика FreeBSD непосредственно из Grub2:

 kfreebsd /boot/loader

То есть тут подключается модуль файловой системы UFS2:

insmod ufs2

затем чтение файла загрузчика с раздела и его запуск.

Ну и напоследок - король дичи, настоящий Солярис на ноутбуке.

OpenIndiana

Эта ОС — открытый форк, выложенных в открытый доступ исходников Solaris. ОС очень сложная и необычная, по ней точно будет отдельная детальная статья, а тут ограничимся лишь настройкой ее запуска.

К сожалению OpenIndiana хоть и поддерживает UEFI и установку на GPT, но без разделов, только при условии «занять диск целиком».

Что очевидно не подходит для варианта использования на ноутбуке, поэтому ради нее одной пришлось перенести все на MBR разметку диска.

У раздела с OpenIndiana свой собственный формат, который называется Solaris2, внутри которого уже свои разделы на ZFS.

Grub ничего не знает о Солярисе, его форматах разделов и файловых систем, поэтому единственным вариантом загрузки является chainloader +1

Выглядит это вот так:

menuentry "OpenIndiana" {       
        set root='(hd0,4)'
        chainloader +1
        }

Не забудьте только поставить флаг «boot» на этот раздел (см. скриншот выше). Запустится загрузчик OpenIndiana: