Para entender melhor como funciona este processo de geração, o primeiro passo é dar uma olhada no conteúdo da pasta /etc/grub.d:
Como pode ver, esta pasta é populada por vários scripts, numerados sequencialmente. Sempre que o update-grub é executado, estes scripts são executados na ordem em que são numerados, fazendo com que um novo arquivo /boot/grub/grub.cfg seja gerado e a configuração atualizada. Este é mais um motivo para que você não perca tempo tentando editar este arquivo diretamente, já que além de muito complexo, qualquer configuração feita nele será perdida ao atualizar a configuração do Grub. A ideia é exatamente que a configuração seja gerada e atualizada automaticamente, aplicando as suas configurações, definidas no /etc/default/grub.
O primeiro script, o “00_header” lê as variáveis de ambiente e ajusta vários parâmetros e configurações, preparando o terreno para a execução dos outros scripts. O seguinte é o “05_debian_theme”, que aplica o tema visual, carregando a imagem de background, definindo as cores do menu e assim por diante.
Os demais scripts são dedicados à detecção e inserção dos diferentes sistemas operacionais, gerando a lista que permite escolher qual usar durante o boot. O “10_linux” adiciona as entradas do sistema principal, incluindo as diferentes versões do kernel que estejam instaladas. O “10_linux_xen” faz o mesmo com versões do kernel com suporte ao Xen (caso alguma esteja instalada). O “20_memtest86+” adiciona a entrada do Memtest, enquanto o “30_os-prober” detecta e adiciona entradas para outros sistemas operacionais instalados, incluindo o Windows. Os dois últimos, “40_custom” e “41_custom” são dedicados à inserção de scripts personalizados com outras funções que você queira executar.
A ordem com que as diferentes entradas aparecem na tela de boot é definida pela ordem com a qual estes scripts são executados. Ao rodar o “sudo update-grub ” neste PC, por exemplo, obtenho:
$ sudo update-grub
Generating grub.cfg …
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-3.2.0-21-generic
Found initrd image: /boot/initrd.img-3.2.0-21-generic
Found linux image: /boot/vmlinuz-3.2.0-19-generic
Found initrd image: /boot/initrd.img-3.2.0-19-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda2
done
Veja que ele inclui um total de 4 entradas: duas para o sistema principal (incluindo uma versão antiga do kernel que ainda está instalada), uma para o Memtest e outra para uma cópia do Windows 7 esquecida em uma partição no início do HD.
Se retiro a permissão de execução do script do Memtest (chmod -x /etc/grub.d/20_memtest86+), fazendo com que ele deixe de ser executado, as outras entradas continuarão sendo adicionadas, mas o Memtest será deixado de fora:
$ sudo chmod -x /etc/grub.d/20_memtest86+
$ sudo update-grub
Generating grub.cfg …
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-3.2.0-21-generic
Found initrd image: /boot/initrd.img-3.2.0-21-generic
Found linux image: /boot/vmlinuz-3.2.0-19-generic
Found initrd image: /boot/initrd.img-3.2.0-19-generic
Found Windows 7 (loader) on /dev/sda2
done
Caso renomeie o script “30_os-prober”, para “09_os-prober” (fazendo com que ele seja executado antes do “10_linux” que adiciona as entradas referentes ao Linux) faço com que o Windows apareça no topo da lista:
$ sudo mv 30_os-prober 09_os-prober
$ sudo update-grub
[sudo] password for gdh:
Generating grub.cfg …
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found Windows 7 (loader) on /dev/sda2
Found linux image: /boot/vmlinuz-3.2.0-21-generic
Found initrd image: /boot/initrd.img-3.2.0-21-generic
Found linux image: /boot/vmlinuz-3.2.0-19-generic
Found initrd image: /boot/initrd.img-3.2.0-19-generic
done
Da mesma forma, é possível editar o conteúdo dos scripts ou adicionar outros que executem funções adicionais. Esta acaba sendo a principal vantagem do Grub 2 e o grande motivo da mudança.
Como pode imaginar, a melhor forma de adicionar entradas personalizadas no menu do grub, sem depender da detecção automática é adicionar as instruções desejadas no final do arquivo “/etc/grub.d/40_custom”, o que faz com que a sua entrada personalizada apareça no final da lista.
Basta adicionar as entradas da forma como quer que elas sejam incluídas no arquivo, após a linha “exec tail -n +3 $0” dentro do arquivo. Para adicionar uma entrada que carrega o Windows em chainload (como a que vimos no capítulo sobre o Mandriva), por exemplo, você adicionaria as seguintes linhas ao arquivo “40_custom”:
menuentry "Windows 7 em chainload" {
set root=(hd0,1)
chainloader +1
}
A linha “set root=(hd0,1) ” especifica qual é a partição. Uma diferença entre o Grub 2 e o Grub antigo é que no Grub 2 as partições são numeradas a partir do 1 (e não mais a partir do zero), de forma que “set root=(hd0,1) ” especifica que o Windows está instalado na primeira partição do HD.
Para que seja adicionada uma entrada para o boot de uma imagem ISO localizada em uma partição do HD (que é uma das possibilidades interessantes do novo grub), você adicionaria as linhas a seguir no “40_custom”
menuentry "ISO do Ubuntu" {
loopback loop (hd0,1)/home/gdh/ubuntu.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=home/gdh/ubuntu.iso noprompt noeject quiet splash
initrd (loop)/casper/initrd.lz
}
Veja que esta entrada já é mais complicada, especificando a partição do HD onde está o ISO, como em “(hd0,1)”, que se refere à primeira partição do primeiro HD e o caminho para o arquivo dentro da partição (/home/gdh/ubuntu.iso). A linha “linux…” inclui opções diversas para que o sistema inicialize através do CD; veja que ela inclui novamente a localização do arquivo dentro da partição.
Incluindo as duas entradas, seu arquivo “/etc/grub.d/40_custom” ficaria como o a seguir e depois de executar o “sudo update-grub” você veria as duas novas entradas no final da lista.
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry "Windows 7 em chainload" {
set root=(hd0,1)
chainloader +1
}
menuentry "ISO do Ubuntu" {
loopback loop (hd0,1)/home/gdh/ubuntu.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=home/gdh/ubuntu.iso noprompt noeject quiet splash
initrd (loop)/casper/initrd.lz
}
É importante enfatizar que o boot de imagens ISO só funciona em distribuições Linux que suportem a inicialização a partir do ISO (o que inclui a grande maioria dos live-CDs atuais). Devido a esta dependência de suporte por parte do hóspede, esta função não funciona para dar boot em ISOs com outros sistemas operacionais, incluindo imagens de instalação do Windows.
Deixe seu comentário