Como posso inicializar o Arch Linux usando o initramfs, no grub do Ubuntu?

Como posso inicializar o Arch Linux usando o initramfs, no grub do Ubuntu?

Eu tenho dois discos rígidos, com dois Grubs correspondentes. Um é do Arch Linux e o outro é do Ubuntu. Usando o grub do Arch, posso inicializar em qualquer distribuição. No entanto, usando o grub do Ubuntu, posso ver o Arch e o Ubuntu, mas não consigo inicializar no Arch. Eu recebo o erro:

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

Comparei grub.cfgas duas distribuições. No grub do Ubuntu, posso ver uma entrada para Arch, com a seguinte linha.

initrd /boot/intel-ucode.img

Eu mudei para seguir o Arch grub.cfg:

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

Agora posso inicializar o Arch a partir do grub do Ubuntu. Parece que o Ubuntu não está anexando esta opção obrigatória por padrão. Como posso fazer com que o Ubuntu crie automaticamente a entrada correta?

Editar

Estou atualizando o grub do Arch com grub-mkconfig -o /boot/grub/grub.cfg. No Ubuntu, tentei ambos update-grube o comando bruto acima (ao qual é alias).

Editar 2

As linhas não 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=""

Responder1

Na verdade, existem dois arquivos que precisam ser modificados para resolver este problema. Eu testei isso no meu Lubuntu 16.04.1 e no Manjaro Linux.

No Ubuntu:

1) Arquivo/usr/lib/linux-boot-probes/mounted/40grub2 existe uma função parse_grub_menu que não lida com todos os parâmetros do initrd. Você precisa modificar 'caso "$1" em ... initrd)':

a) remover atribuição

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

b) adicione duas linhas no lugar da removida:

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

2) Arquivo/etc/grub.d/30_os-prober dentro de um loop for corrija a atribuição de LINITRD:

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

A primeira correção leva em consideração todas as informações de initrd disponíveis para Manjaro. A segunda correção limpa a linha initrd gerada alterando alguns caracteres '^' para espaços.

Responder2

Estou executando o Manjaro e o Arch, mas, ironicamente, o Manjaro cometerá um erro semelhante ao do Ubuntu. Então talvez o seguinte patch em 30_os_prober ainda possa ajudar alguém.

Depois:

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

Adicionar:

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

Responder3

Funcionou depois de editar o grub.cfgarquivo e executar:

sudo update-grub
sudo grub.mkconfig

informação relacionada