
У меня два жестких диска с двумя соответствующими 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