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

4

Eu tenho dois discos rígidos, com dois Grubs correspondentes. Uma é do Arch Linux e a outra é do Ubuntu. Usando o grub de Arch, posso inicializar em qualquer distribuição. No entanto, usando o Ubuntu, posso ver tanto o Arch quanto 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.

Eu comparei grub.cfg para ambas as 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 grub.cfg do Arch:

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

Agora eu posso inicializar no Arch a partir do grub do Ubuntu. Parece que o Ubuntu não está anexando esta opção requerida por padrão. Como posso fazer o Ubuntu criar automaticamente a entrada correta?

Editar

Estou atualizando o grub do Arch com grub-mkconfig -o /boot/grub/grub.cfg . No Ubuntu, eu tentei tanto o update-grub quanto o comando raw acima (que é usado para 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=""
    
por Sparhawk 26.05.2015 / 01:12

2 respostas

1

EDITED: Eu testei no meu sistema rodando o Ubuntu 15.04, mas eu tenho no processador Intel neste. Mas o que fiz, para o arquivo 30_os-prober , que é o arquivo de configuração para o grub que detecta os sistemas operacionais linux, na pasta /etc/grub.d , adicionei algumas linhas a ele. O que ele faz é verificar o CPU type e configura a linha initrd apropriadamente.

Aqui está o patch mais recente abaixo:

Primeiro, faça o backup do arquivo /etc/grub.d/30_os-prober em outro local.

mkdir ~/backup_init
sudo cp /etc/grub.d/30_os-prober ~/backup_init

copie e cole o seguinte aqui-script em uma janela de terminal para criar o arquivo de correção.

TAB=$'\t'
cat &gt ~/backup_init/patch30.do &lt&lt 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 }'\'
+ 
  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 &lt&lt EOF
  ${TAB}initrd ${LINITRD}
  EOF
EOM

depois, corrija os arquivos juntos

sudo patch /etc/grub.d/30_os-prober ~/backup_init/patch30.do

então você deve poder atualizar o grub como normal

sudo update-grub

Espero que isso ajude.

    
por Terrance 26.05.2015 / 05:10
1

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

No Ubuntu:

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

a) remova a atribuição

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

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 corrigir a atribuição de LINITRD:

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

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

    
por Just out of interest 28.10.2016 / 14:50