¿Cómo puedo iniciar Arch Linux usando initramfs, en el grub de Ubuntu?

¿Cómo puedo iniciar Arch Linux usando initramfs, en el grub de Ubuntu?

Tengo dos discos duros, con dos Grubs correspondientes. Uno es de Arch Linux y el otro es de Ubuntu. Usando el grub de Arch, puedo iniciar cualquier distribución. Sin embargo, al usar grub de Ubuntu, puedo ver tanto Arch como Ubuntu, pero no puedo iniciar Arch. Recibo el error:

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

Comparé grub.cfgambas distribuciones. En el grub de Ubuntu, puedo ver una entrada para Arch, con la siguiente línea.

initrd /boot/intel-ucode.img

Lo cambié para seguir el de Arch grub.cfg:

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

Ahora puedo iniciar Arch desde el grub de Ubuntu. Parece que Ubuntu no agrega esta opción requerida de forma predeterminada. ¿Cómo puedo hacer que Ubuntu cree automáticamente la entrada correcta?

Editar

Estoy actualizando el grub de Arch con grub-mkconfig -o /boot/grub/grub.cfg. En Ubuntu, probé ambos update-gruby el comando sin formato anterior (al que tiene un alias).

Editar 2

Las líneas no comentadas de/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=""

Respuesta1

En realidad, hay dos archivos que deben modificarse para solucionar este problema. Probé esto en mi Lubuntu 16.04.1 y Manjaro Linux.

En Ubuntu:

1) Archivo/usr/lib/linux-boot-probes/montado/40grub2 hay una función parse_grub_menu que no maneja todos los parámetros initrd. Necesitas modificar 'caso "$1" en ... initrd)':

a) eliminar la asignación

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

b) agregar dos líneas en lugar de la eliminada:

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

2) Archivo/etc/grub.d/30_os-prober dentro de un bucle for corrige la asignación de LINITRD:

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

La primera solución tiene en cuenta toda la información inicial disponible para Manjaro. La segunda solución limpia la línea initrd generada cambiando algunos caracteres '^' a espacios.

Respuesta2

Estoy ejecutando Manjaro y Arch pero, irónicamente, Manjaro cometerá un error similar al de Ubuntu. Entonces, quizás el siguiente parche en 30_os_prober aún pueda ayudar a alguien.

Después:

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

Agregar:

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

Respuesta3

Funcionó después de editar el grub.cfgarchivo y ejecutar:

sudo update-grub
sudo grub.mkconfig

información relacionada