У меня два жестких диска с двумя соответствующими Grubs. Один из Arch Linux, а другой из Ubuntu. Используя 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
Я изменил его, чтобы следовать за Арком grub.cfg
:
initrd /boot/intel-ucode.img /boot/initramfs-linux.img
Теперь я могу загрузиться в Arch из личинки Ubuntu. Похоже, что Ubuntu не добавляет эту обязательную опцию по умолчанию. Как я могу заставить Ubuntu автоматически создавать правильную запись?
Я обновляю grub Arch с grub-mkconfig -o /boot/grub/grub.cfg
. В Ubuntu я пробовал update-grub
и необработанную команду выше (к которой она имеет псевдоним).
Некомментированные строки /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=""
ОТРЕДАКТИРОВАННЫЙ: я протестировал его в своей системе рабочий Ubuntu 15.04, но я имею в Intel Processor на этом. Но что я сделал, для 30_os-prober
файл, который является конфигурационным файлом для личинки, обнаруживающей операционные системы Linux, в /etc/grub.d
папка, я добавил некоторые строки к нему. То, что это делает, является проверками CPU type
и настраивает initrd строку соответственно.
Вот последний патч ниже:
Первый, создайте резервную копию Вашего /etc/grub.d/30_os-prober
файл к другому местоположению.
mkdir ~/backup_init sudo cp /etc/grub.d/30_os-prober ~/backup_init
тогда копия и вставка следующий здесь-сценарий к окну терминала для создания файла исправления.
TAB=тогда исправляют файлы вместе
sudo patch /etc/grub.d/30_os-prober ~/backup_init/patch30.do
тогда, необходимо быть в состоянии обновить личинку как нормальную
sudo update-grub
Hope, которой это помогает.
\t' cat > ~/backup_init/patch30.do << EOM *** backup_init/30_os-prober${TAB}2015-05-27 10:52:18.237381123 -0700$ --- /etc/grub.d/30_os-prober${TAB}2015-05-27 11:29:45.149420380 -0700$ *************** *** 22,27 **** --- 22,29 ---- datarootdir="/usr/share" quick_boot="1" + CPU=\`cat /proc/cpuinfo | grep -i vendor_id | head -1 | awk '{print $3}'\` + export TEXTDOMAIN=grub export TEXTDOMAINDIR="\${datarootdir}/locale" *************** *** 276,281 **** --- 278,286 ---- ${TAB}linux \${LKERNEL} \${LPARAMS} EOF if [ -n "\${LINITRD}" ] ; then + if [ "\${OS}" = "Arch" ] ; then + ${TAB}${TAB}LINITRD="/boot/intel-ucode.img \${LINITRD}" + fi cat << EOF ${TAB}initrd \${LINITRD} EOF EOM
тогда исправляют файлы вместе
sudo patch /etc/grub.d/30_os-prober ~/backup_init/patch30.do
тогда, необходимо быть в состоянии обновить личинку как нормальную
sudo update-grub
Hope, которой это помогает.
На самом деле существует два файла, которые должны быть изменены для решения этой проблемы. Я протестировал это на своем Lubuntu 16.04.1 и Linux Manjaro.
В Ubuntu:
1) Файл /usr/lib/linux-boot-probes/mounted/40grub2 существует функция parse_grub_menu, который не обрабатывает все initrd параметры. Необходимо изменить' случай "1$" в... initrd) ':
a) удаляют присвоение
initrd="$(echo "$2" ...)"
, b) добавляют две строки вместо удаленной:
shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"
2) Файл /etc/grub.d/30_os-prober в для цикла фиксируют присвоение LINITRD:
for LINUX in ${LINUXPROBED}; do
...
LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"
первая фиксация берет всю доступную initrd информацию для Manjaro во внимание. Вторая фиксация очищает сгенерированную initrd строку путем изменения некоторого '^' символы на пробелы.
Я выполняю 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