Как загрузить Arch Linux с помощью initramfs в grub Ubuntu?

Как загрузить Arch Linux с помощью initramfs в grub Ubuntu?

У меня два жестких диска с двумя соответствующими Grub. Один из Arch Linux, а другой из Ubuntu. Используя grub Arch, я могу загрузиться в любой из дистрибутивов. Однако, используя grub Ubuntu, я вижу и Arch, и Ubuntu, но не могу загрузить Arch. Я получаю ошибку:

Kernel offset
End kernel panic. Not syncing: VFS.
Unable to mount root fs on unknown-block.

Я сравнил grub.cfgоба дистрибутива. В grub Ubuntu я вижу запись для Arch со следующей строкой.

initrd /boot/intel-ucode.img

Я изменил его, чтобы он соответствовал Arch grub.cfg:

initrd /boot/intel-ucode.img /boot/initramfs-linux.img

Теперь я могу загрузить Arch из Ubuntu grub. Похоже, Ubuntu не добавляет эту требуемую опцию по умолчанию. Как мне заставить Ubuntu автоматически создать правильную запись?

Редактировать

Я обновляю grub Arch с помощью grub-mkconfig -o /boot/grub/grub.cfg. В Ubuntu я пробовал и то, и другое update-grub, и сырую команду выше (которой она соответствует).

Редактировать 2

Незакомментированные строки/etc/default/grub

GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="3"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

решение1

На самом деле, есть два файла, которые нужно изменить, чтобы решить эту проблему. Я проверил это на моем Lubuntu 16.04.1 и Manjaro Linux.

В Убунту:

1) Файл/usr/lib/linux-boot-probes/mounted/40grub2 есть функция parse_grub_menu, которая не обрабатывает все параметры initrd. Вам нужно изменить 'случай "$1" в ... initrd)':

а) удалить назначение

initrd="$(echo "$2" ...)"

б) добавить две строки вместо удаленной:

shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"

2) Файл/etc/grub.d/30_os-prober внутри цикла for исправьте назначение LINITRD:

for LINUX in ${LINUXPROBED}; do
...
    LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

Первое исправление учитывает всю доступную информацию initrd для Manjaro. Второе исправление очищает сгенерированную строку initrd, заменяя некоторые символы '^' на пробелы.

решение2

Я использую Manjaro и Arch, но, по иронии судьбы, Manjaro сделает ту же ошибку, что и Ubuntu. Так что, возможно, следующий патч в 30_os_prober все еще может кому-то помочь.

После:

LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

Добавлять:

if [ "${OS}" = "Arch Linux" ] ; then
  LINITRD="/boot/intel-ucode.img ${LINITRD}"
fi

решение3

Это сработало после редактирования grub.cfgфайла и запуска:

sudo update-grub
sudo grub.mkconfig

Связанный контент