Por que o GRUB 2 é inicializado tão lentamente?

6

Eu tenho uma pequena distribuição Linux customizada (criada com o OpenEmbedded), que inicializa com o GRUB 1.99. O objetivo é que ele seja iniciado rapidamente.

Atualmente, diz:

GRUB loading.

por ~ 2 + segundos (isso provavelmente é inevitável). Então:

Welcome to GRUB!

sob ele por uma fração de segundo quando terminar de carregar.

(Não há menu ou tempo limite de menu.) Limpa a tela, então:

Booting 'Disk'

por ~ 8 segundos. Esse atraso parece ser evitável. Eu gostaria muito de saber como não atrasar aqui.

Em seguida, continua para:

Decompressing Linux... Parsing ELF... done.
Booting the kernel.

E, em seguida, muitos textos de rolagem rápida quando o kernel é inicializado.

O arquivo de imagem do kernel tem 1,8MB e o arquivo de imagem do disco tem 16MB.

O arquivo grub.cfg se parece com:

set default="0"
set timeout=0

menuentry "Disk" {
    set root=(hd0,1)
    linux /boot/Disk.kernel parport=0x378,7,3 ramdisk_size=16384 root=/dev/ram rw
    initrd /boot/Disk.ext2
}

Em outro disco de boot que tenho (em uma placa Compact Flash), eu tenho exatamente o mesmo kernel, e um arquivo de imagem de disco diferente, com 20MB. O arquivo de configuração também é idêntico, exceto que ramdisk_size = 20480. Este tem um atraso extremamente longo de 69 segundos no mesmo ponto. Por que é muito mais longo? Felizmente, não preciso usar esse disco de inicialização com frequência. Mas seria bom consertar isso também, já que presumivelmente o atraso é causado pela mesma coisa.

Como corrijo esse atraso? O que está acontecendo? Como se faz para depurar um gerenciador de inicialização? Vale a pena olhar para um gerenciador de inicialização mais leve como o SYSLINUX? A exclusão de alguns dos módulos GRUB 2 não utilizados melhorá-lo? (Como alguém descobre quais módulos não são usados?)

Resumo

Todos os itens a seguir possuem exatamente o mesmo kernel do Linux 3.2:
Disco flash A no computador X: imagem de 16 MB, GRUB 1.99, atraso de inicialização é ~ 8s ; velocidade de leitura do disco A é 20MB / s.
Disco flash B no computador X: 20MB imagem, GRUB 1.99, atraso de inicialização é 69s ; velocidade de leitura do disco B é de 20MB / s.

Disco flash C no computador Y: imagem de 16 MB, GRUB 0,97, atraso de inicialização é extremamente rápido ; velocidade de leitura do disco C é 16MB / s.
Observe que o computador Y é semelhante ao computador X, mas um pouco mais lento.
(O monitor não é rápido o suficiente para mostrar qualquer tela do GRUB. Do ponto da tela da BIOS desaparecendo para a tela de carregamento do kernel do Linux aparecendo pela primeira vez, ele mostra 4.76s de tela em branco - mas o kernel Linux já está carregando pelo menos 1,5s, então é mais ou menos 3,2s no máximo para o GRUB fazer isso. Isso inclui o carregamento do próprio GRUB e a decisão do BIOS de qual drive inicializar, etc.)
Infelizmente, o GRUB 0.97, como esse exemplo, não pode ser compilado de forma repetitiva, portanto, não parece ser uma opção viável (embora seja interessante).

Como faço o GRUB 2 rápido?

    
por Jetski S-type 16.07.2012 / 09:57

2 respostas

2

Não encontrei a causa da inicialização lenta com o GRUB 2.

Acabei usando o EXTLINUX, que é compacto e rápido, e mais adequado se você não precisa de todas as coisas legais do GRUB 2.

link

    
por 09.07.2014 / 03:46
3

EDIT: Parece que o GRUB2 é o problema neste caso, afinal. Estou mantendo minha resposta original abaixo apenas como referência e como explicação para problemas semelhantes que as pessoas possam ter.

O atraso de inicialização ao qual você está se referindo é o tempo necessário para que o kernel e a imagem initramfs sejam carregados na RAM. A culpa não está no bootloader, é no tamanho do seu kernel / initramfs e taxa de armazenamento (cartão CF).

Você pode testar facilmente a velocidade do seu armazenamento usando dd (se você o instalou no sistema incorporado) ou cat . Apenas substitua /dev/sda1 abaixo pelo nome do dispositivo de bloco que representa a partição de inicialização nesse sistema (geralmente é possível verificar isso usando o comando mount ).

  • usando dd : dd if=/dev/sda1 of=/dev/null
  • usando cat + time : time cat /dev/sda1 > /dev/null

(No segundo caso, você precisaria calcular a taxa manualmente.)

Se a sua partição raiz for muito grande para aguardar o término dos comandos, pressione Ctrl + C após algum tempo (mas não menos que um minuto, para tornar o teste confiável).

    
por 16.07.2012 / 12:36