Вопрос или проблема
Я создал загрузочную 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 остаются прежними. Ядро и init.d еще не были загружены. Я пытаюсь указать сам 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-бит" --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-бит (совместимый режим)" {
#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 "Установка Linux Mint OEM (для производителей)" {
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 Firmware' {
fwsetup
}
menuentry 'Тест памяти' {
linux /boot/memtest.efi
}
menuentry 'Выключение системы' --class shutdown --class poweroff {
echo 'Система отключается...'
halt
}
menuentry 'Перезагрузка системы' --class reboot --class restart {
echo 'Система перезагружается...'
reboot
}
fi
Я предполагаю, что переменные $[archiso_img_dev_UUID] и $[iso_path] могут иметь к этому отношение, но я не знаю, как их редактировать, не потревожив мою работающую живую сессию Linux Mint, которая находится на разделе 2. Только ядро Arch и RAM-диск, которые находятся на разделе 3, не загружаются.
Ответ или решение
Для того чтобы отредактировать файл grub.cfg для загрузки двух разных дистрибутивов Linux (Linux Mint 22 и Arch Linux) с двух разных разделов одного USB-накопителя, необходимо учитывать несколько нюансов. Ваша задача заключается в правильной настройке меню загрузки GRUB 2, чтобы он мог обнаружить и корректно загрузить оба дистрибутива с использованием их UUID.
Шаг 1: Определение UUID разделов
Первый этап включает в себя получение UUID для каждого из ваших разделов. Используйте следующую команду в вашей среде Linux (выполняйте это в терминале):
sudo blkid
Это выведет список всех подключенных накопителей с их UUID. Определите UUID для sdb2 (Linux Mint) и sdb3 (Arch Linux). Например:
- Linux Mint (sdb2):
3b5d4e95-771e-48bd-ae0d-4b61c80a8fa0
- Arch Linux (sdb3):
e7151878-33fd-4d21-a0f2-c3cba821620d
Шаг 2: Редактирование grub.cfg
Теперь, когда у вас есть все необходимые UUID, откройте ваш grub.cfg
файл, который находится на EFI-разделе вашего USB-накопителя. Вам нужно будет внести изменения в секцию меню GRUB для Arch Linux, чтобы указать правильные пути к ядру и образу initrd.
Пример редактирования grub.cfg
Вот как может выглядеть обновленный файл grub.cfg
с правильными путями:
menuentry "Start Linux Mint 22 Cinnamon 64-bit" --class linuxmint {
set gfxpayload=keep
linux /casper/vmlinuz boot=casper username=mint hostname=mint iso-scan/filename=${iso_path} quiet splash --
initrd /casper/initrd.lz
}
menuentry "Arch Linux install medium (x86_64)" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
set gfxpayload=keep
set archiso_img_dev_uuid="e7151878-33fd-4d21-a0f2-c3cba821620d"
linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch img_dev=UUID=${archiso_img_dev_uuid}
initrd /arch/boot/x86_64/initramfs-linux.img
}
Шаг 3: Проверка путей к файлам
Убедитесь, что пути к ядру (/arch/boot/x86_64/vmlinuz-linux
) и образу initrd (/arch/boot/x86_64/initramfs-linux.img
) корректные. Измените эти пути, если ваше размещение файлов отличается.
Шаг 4: Препятствие загрузки ядра
Ошибка "missing file, must load kernel first" часто вызвана тем, что GRUB не может найти указанные файлы ядра или initrd. Это может быть следствием неправильных путей или отсутствия необходимых файлов в заданном местоположении. Убедитесь, что все необходимые файлы доступны по указанным путям.
Шаг 5: Тестирование конфигурации
После внесения всех изменений на USB-накопителе, подключите его к компьютеру и выберите загрузку с USB в BIOS/UEFI. Параметры загрузки должны отобразить оба дистрибутива в меню GRUB. Выберите Arch Linux, чтобы подтвердить работоспособность конфигурации.
Заключение
Следуя этим шагам и рекомендациям, вы сможете настроить GRUB для загрузки двух различных дистрибутивов с одного USB-накопителя без использования Ventoy. Важно аккуратно проверять пути к файлам и делать резервные копии grub.cfg перед редактированием. Если у вас сохраняются ошибки, уделите внимание сообщениям GRUB и проверяйте правильность указанных параметров.