Как редактировать grub.cfg, чтобы установить двойную загрузку двух живых дистрибутивов Linux на двух разных разделах?

Вопрос или проблема

Я создал загрузочный USB-накопитель с Linux Mint 22 и Arch Linux 12-01-2024 на двух отдельных разделах и пытаюсь использовать GRUB 2 для загрузки с этого загрузочного USB-накопителя. У меня определены следующие разделы, и образы прошиты на sdb2 (mint) и sdb3 (arch):

sdb1 – EFI раздел (1 ГБ)
sdb2 – Раздел Linux Mint ext4 (15 ГБ)
sdb3 – Раздел Arch Linux ext4/ (15 ГБ)

Я знаю, что не могу указать имена устройств (sdb1, sdb2, sdb3) в файле grub.cfg, потому что они меняются после перезагрузки, а UUID не меняются. Я пытаюсь указать сам UUID в файле grub.cfg, но у меня не получается. Я могу заставить все пункты меню работать, и я могу загрузить Linux Mint в живую среду без проблем, но когда я пытаюсь выбрать любой из пунктов Arch Linux, я получаю ошибку от GRUB, сообщающую “файл отсутствует, сначала нужно загрузить ядро”. Я знаю, что GRUB ищет ядро Arch в разделе GPT2 в директории casper, где находится ядро Linux Mint, но не знаю, как указать GRUB, где найти ядро Arch, которое находится в разделе GPT3 в директории arch.

Я пытаюсь сделать “двойную загрузку” USB без использования Ventoy, потому что знаю, что это возможно с GRUB, и помните, что поскольку это загрузочный USB-накопитель, “sudo install-grub” и “sudo update-grub” ничего не делают для файла grub.cfg, и нет файла fstab для редактирования.

Вот список моего текущего grub.cfg, который находится на EFI-разделе USB, я закомментировал UUID, указывающие на разделы, которые мне нужно загрузить, просто для справки, пока не знаю, куда в конфигурационном файле их разместить:

loadfont unicode

set color_normal=white/black
set color_highlight=black/light-gray

insmod play
play 960 440 1 0 4 440 1 0 4 440 1

# https://www.supergrubdisk.org/wiki/Loopback.cfg"

# Поиск ISO-образа
search --no-floppy --set=archiso_img_dev --file "${iso_path}"
probe --set archiso_img_dev_uuid --fs-uuid "${archiso_img_dev}"

# Получить читаемый человеком идентификатор платформы
if [ "${grub_platform}" == 'efi' ]; then
    archiso_platform='UEFI'
    if [ "${grub_cpu}" == 'x86_64' ]; then
        archiso_platform="x64 ${archiso_platform}"
    elif [ "${grub_cpu}" == 'i386' ]; then
        archiso_platform="IA32 ${archiso_platform}"
    else
        archiso_platform="${grub_cpu} ${archiso_platform}"
    fi
elif [ "${grub_platform}" == 'pc' ]; then
    archiso_platform='BIOS'
else
    archiso_platform="${grub_cpu} ${grub_platform}"
fi

#menuentries 
menuentry "Запуск Linux Mint 22 Cinnamon 64-bit" --class linuxmint {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash --
    initrd  /casper/initrd.lz
}
menuentry "Запуск Linux Mint 22 Cinnamon 64-bit (совместимый режим)" {
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} noapic noacpi nosplash irqpoll nomodeset --
    initrd  /casper/initrd.lz
}
menuentry "OEM установка Linux Mint (для производителей)" {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  oem-config/enable=true only-ubiquity boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash --
    initrd  /casper/initrd.lz
}
menuentry "Установочный носитель Arch Linux (x86_64, ${archiso_platform})" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=e7151878-33fd-4d21-a0f2-c3cba821620d
    linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}"
    initrd /arch/boot/x86_64/initramfs-linux.img
}
menuentry "Установочный носитель Arch Linux с экранным диктоном Speakup (x86_64, ${archiso_platform})" --hotkey s --class arch --class gnu-linux --class gnu --class os --id 'archlinux-accessibility' {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=e7151878-33fd-4d21-a0f2-c3cba821620d
    linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}" accessibility=on
    initrd /arch/boot/x86_64/initramfs-linux.img
}
grub_platform
if [ "$grub_platform" = "efi" ]; then
menuentry 'Загрузка с следующего устройства' {
    exit 1
}
menuentry 'Настройки прошивки UEFI' {
    fwsetup
}
menuentry 'Тест памяти' {
    linux   /boot/memtest.efi
}
menuentry 'Выключение системы' --class shutdown --class poweroff {
    echo 'Система выключается...'
    halt
}
menuentry 'Перезагрузка системы' --class reboot --class restart {
    echo 'Система перезагружается...'
    reboot
}
fi
loadfont unicode

set color_normal=white/black
set color_highlight=black/light-gray

insmod play
play 960 440 1 0 4 440 1 0 4 440 1

# https://www.supergrubdisk.org/wiki/Loopback.cfg"

# Поиск ISO-образа
search --no-floppy --set=archiso_img_dev --file "${iso_path}"
probe --set archiso_img_dev_uuid --fs-uuid "${archiso_img_dev}"

# Получить читаемый человеком идентификатор платформы
if [ "${grub_platform}" == 'efi' ]; then
    archiso_platform='UEFI'
    if [ "${grub_cpu}" == 'x86_64' ]; then
        archiso_platform="x64 ${archiso_platform}"
    elif [ "${grub_cpu}" == 'i386' ]; then
        archiso_platform="IA32 ${archiso_platform}"
    else
        archiso_platform="${grub_cpu} ${archiso_platform}"
    fi
elif [ "${grub_platform}" == 'pc' ]; then
    archiso_platform='BIOS'
else
    archiso_platform="${grub_cpu} ${grub_platform}"
fi

#menuentries 
menuentry "Запуск Linux Mint 22 Cinnamon 64-bit" --class linuxmint {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash --
    initrd  /casper/initrd.lz
}
menuentry "Запуск Linux Mint 22 Cinnamon 64-bit (совместимый режим)" {
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} noapic noacpi nosplash irqpoll nomodeset --
    initrd  /casper/initrd.lz
}
menuentry "OEM установка Linux Mint (для производителей)" {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
    linux   /casper/vmlinuz  oem-config/enable=true only-ubiquity boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash --
    initrd  /casper/initrd.lz
}
menuentry "Установочный носитель Arch Linux (x86_64, ${archiso_platform})" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=e7151878-33fd-4d21-a0f2-c3cba821620d
    linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}"
    initrd /arch/boot/x86_64/initramfs-linux.img
}
menuentry "Установочный носитель Arch Linux с экранным диктоном Speakup (x86_64, ${archiso_platform})" --hotkey s --class arch --class gnu-linux --class gnu --class os --id 'archlinux-accessibility' {
    set gfxpayload=keep
    #GRUB_DEVICE_UUID=e7151878-33fd-4d21-a0f2-c3cba821620d
    linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}" accessibility=on
    initrd /arch/boot/x86_64/initramfs-linux.img
}
grub_platform
if [ "$grub_platform" = "efi" ]; then
menuentry 'Загрузка с следующего устройства' {
    exit 1
}
menuentry 'Настройки прошивки UEFI' {
    fwsetup
}
menuentry 'Тест памяти' {
    linux   /boot/memtest.efi
}
menuentry 'Выключение системы' --class shutdown --class poweroff {
    echo 'Система выключается...'
    halt
}
menuentry 'Перезагрузка системы' --class reboot --class restart {
    echo 'Система перезагружается...'
    reboot
}
fi

Ответ или решение

Для настройки загрузчика GRUB 2 и организации двойной загрузки двух дистрибутивов Linux (Linux Mint и Arch Linux) с флешки, необходимо правильно отредактировать файл grub.cfg. В данном ответе будет рассмотрен процесс настройки с учётом использования UUID для идентификации разделов, а также правильного указания путей к файлам кернела и initrd для Arch Linux.

Шаг 1: Получение UUID разделов

Поскольку устройство записи флешки может изменять свои имена (например, sdb1, sdb2, и sdb3), лучше всего использовать UUID. Для получения UUID всех разделов можно воспользоваться командой:

blkid

Запишите UUID для sdb2 (Linux Mint) и sdb3 (Arch Linux), так как они понадобятся для настройки grub.cfg.

Шаг 2: Редактирование grub.cfg

Общая структура файла grub.cfg:

Обратите внимание на меню загрузки в вашем файла grub.cfg. Вам нужно изменить или добавить секции для Arch Linux так, чтобы они указывали на корректные файлы с учетом полученного UUID.

Вот пример изменений, которые могут быть внесены:

# Установка необходимых переменных
set mint_uuid=3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
set arch_uuid=e7151878-33fd-4d21-a0f2-c3cba821620d

# Начало
loadfont unicode
set color_normal=white/black
set color_highlight=black/light-gray

# Меню загрузки
menuentry "Start Linux Mint 22 Cinnamon 64-bit" --class linuxmint {
    set gfxpayload=keep
    linux   (hd0,gpt2)/casper/vmlinuz boot=casper username=mint hostname=mint quiet splash --
    initrd  (hd0,gpt2)/casper/initrd.lz
}

menuentry "Arch Linux install medium (x86_64)" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
    set gfxpayload=keep
    linux /arch/boot/x86_64/vmlinuz-linux img_dev=UUID=${arch_uuid} img_loop=/arch/archiso.img
    initrd /arch/boot/x86_64/initramfs-linux.img
}

menuentry "Arch Linux install medium with speakup screen reader (x86_64)" --class arch --class gnu-linux --class gnu --class os --id 'archlinux-accessibility' {
    set gfxpayload=keep
    linux /arch/boot/x86_64/vmlinuz-linux img_dev=UUID=${arch_uuid} img_loop=/arch/archiso.img accessibility=on
    initrd /arch/boot/x86_64/initramfs-linux.img
}

Обращение к ядру Arch Linux

В menuentry для Arch Linux вам нужно убедиться, что пути к файлам ядра и initramfs правильные. Убедитесь, что файлы находятся в следующих каталогах:

  • Ядро: /arch/boot/x86_64/vmlinuz-linux
  • Initramfs: /arch/boot/x86_64/initramfs-linux.img

Шаг 3: Проверка и тестирование

После внесения всех изменений, сохраните файл grub.cfg. Затем перезагрузите компьютер и выберите свой USB-накопитель в качестве устройства загрузки. Это должно вывести меню GRUB, где вы сможете выбрать нужный дистрибутив.

Использование UUID в конфигурации GRUB обеспечивает стабильность и отсутствие ошибок при загрузке, так как устройство может изменять свои имена в зависимости от среды.

Заключение

Ручное редактирование grub.cfg может показаться сложным, однако оно даёт вам полный контроль над процессом загрузки. При правильной настройке GRUB 2 сможет успешно загружать как Linux Mint, так и Arch Linux с одного USB-накопителя. Убедитесь в корректности всех указателей и наличии необходимых файлов в соответствующих директориях, что обеспечит успешную загрузку выбранной системы.

Оцените материал
Добавить комментарий

Капча загружается...