Main menu:

Site search

Categories

novembre 2009
L M M J V S D
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Archive

Grub2

Grub2 est le chargeur de boot par défaut dans Ubuntu 9.10. Il est chargé de lancer l’OS et permet le choix quand plusieurs OS sont installés sur une même machine. En ce sens, il n’est pas différent de Grub1 renommé pour l’occasion Grub legacy.

Les avantages de Grub2 sont entre autres:

  • Support de scripts incluant des fonctions et des tests
  • Un mode de réparation (mode rescue)
  • Le support des thèmes
  • Le support de menus personnalisés
  • le boot depuis un CD directement depuis le disque dur sans reboot

La version 9.10 d’Ubuntu est une version de transition en ce qui concerne Grub. Un nouvelle installation d’Ubuntu 9.10 installera Grub2 tandis qu’une mise à jour depuis 9.04 gardera l’ancien Grub legacy. Pas toujours simple de s’y retrouver et les questions et problèmes soulevés dans les forums sont nombreux.

Installation de Grub2

Les paquets nécessaires à l’installation de Grub2 sont grub-pc et grub-common

$ sudo aptitude install grub-pc

Un script vous prendra en main pour mener à bien cette installation et importer dans Grub2 les infos recueillies dans le menu de boot de Grub legacy. Au redémarrage, un choix supplémentaire apparaîtra dans le menu de Grub legacy qui permet de chaîner ce menu avec celui de Grub2 de façon à tester le système.
A ce stade, testez les différents choix du menu et vérifiez que tout se passe bien. Si c’est le cas, vous pouvez opter définitivement pour Grub2 de cette manière:

$ sudo upgrade-from-grub-legacy

Répondez aux question une fois encore et vous aurez migré de Grub legacy vers Grub2.

Configuration de Grub2

Le fichier /boot/grub/menu.lst de Grub legacy n’existe plus. Il est, en gros, remplacé par le fichier /boot/grub/grub.cfg qui contient ce qui ressemble le plus à l’ancien menu.lst, c’est à dire, les informations sur les différents OS et comment les booter. Ce fichier ne doit pas être édité par l’utilisateur. Son contenu dépend du résultat d’une série de scripts lancés lorsqu’on fait un:

$ sudo update-grub

Le fichier /etc/default/grub, qui peut être édité, contient des infos comme l’OS à lancer par défaut ou le nombre de secondes avant le lancement de l’OS par défaut.
Le dossier /etc/grub.d qui contient les différents scripts qui vont construire le fichier /boot/grub/grub.cfg lorsque la commande update-grub est lancée. Dans ces scripts, il faut noter la présence du script 05_debian_theme qui permet d’insérer une image de fond (splash image), le script 30_os-prober qui est chargé de détecter les OS sur les disques et 40_custom qui est le script qui permet d’insérer des entrées personnalisées.

Voici à quoi ressemble le fichier /etc/default/grub:

$ cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"

Et le fichier /boot/grub/grub.cfg. Il s’agit de mon fichier de configuration et vous pouvez voir qu’en plus d’Ubuntu, j’ai une Debian Squeeze qui est installée sur l’autre disque de mon PC.

$ cat /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s /boot/grub/grubenv ]; then
  have_grubenv=true
  load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
  saved_entry=${prev_saved_entry}
  save_env saved_entry
  prev_saved_entry=
  save_env prev_saved_entry
fi
insmod ext2
set root=(hd1,1)
search --no-floppy --fs-uuid --set b298d612-cb12-478a-8109-4cee1a0226f2
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=640x480
  insmod gfxterm
  insmod vbe
  if terminal_output gfxterm ; then true ; else
    # For backward compatibility with versions of terminal.mod that don't
    # understand terminal_output
    terminal gfxterm
  fi
fi
if [ ${recordfail} = 1 ]; then
  set timeout=-1
else
  set timeout=10
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
menuentry "Ubuntu, Linux 2.6.31-14-generic-pae" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
	set quiet=1
	insmod ext2
	set root=(hd1,1)
	search --no-floppy --fs-uuid --set b298d612-cb12-478a-8109-4cee1a0226f2
	linux	/boot/vmlinuz-2.6.31-14-generic-pae root=UUID=b298d612-cb12-478a-8109-4cee1a0226f2 ro   quiet splash
	initrd	/boot/initrd.img-2.6.31-14-generic-pae
}
menuentry "Ubuntu, Linux 2.6.31-14-generic-pae (recovery mode)" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
	insmod ext2
	set root=(hd1,1)
	search --no-floppy --fs-uuid --set b298d612-cb12-478a-8109-4cee1a0226f2
	linux	/boot/vmlinuz-2.6.31-14-generic-pae root=UUID=b298d612-cb12-478a-8109-4cee1a0226f2 ro single 
	initrd	/boot/initrd.img-2.6.31-14-generic-pae
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
	linux16	/boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
	linux16	/boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry "Debian GNU/Linux, kernel 2.6.26-2-686 (on /dev/sda1)" {
	insmod ext2
	set root=(hd0,1)
	search --no-floppy --fs-uuid --set 436e7961-5c40-412f-b27e-0f8ce60b19e4
	linux /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro quiet
	initrd /boot/initrd.img-2.6.26-2-686
}
menuentry "Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode) (on /dev/sda1)" {
	insmod ext2
	set root=(hd0,1)
	search --no-floppy --fs-uuid --set 436e7961-5c40-412f-b27e-0f8ce60b19e4
	linux /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro single
	initrd /boot/initrd.img-2.6.26-2-686
}
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###

Mode rescue

Si Grub2 ne peut booter l’OS demandé, il vous donnera accès au mode rescue qui permet d’entrer des commandes et essayer de lever le problème. Pour cela, vous devez connaitre la partition sur laquelle est installé le noyau c’est à dire où se trouve le répertoire /boot. Si vous ne connaissez pas ces informations, utilisez un LiveCD ou directement les commandes de grub rescue comme la commande ls ou ls /boot qui permet d’inspecter les partitions à la recherche de celle contenant le noyau:

grub rescue> set root=sdxy                        # sdxy est la partition où se trouve /boot
grub rescue> insmod /boot/grub/linux.mod          # Charge le module linux
grub rescue> linux /vmlinuz root=/dev/sdxy ro     # Charge le noyau
grub rescue> initrd /initrd.img                   # Charge l'image initrd
grub rescue> boot                                 # boot sur cette image initrd

N’oubliez pas, évidemment, de remplacer dans sdxy le x et le y par la bonne valeur.
Je vous renvoie vers la documentation pour plus de détails (voir à la fin de l’article).

Restaurer Grub

Si vous avez installé un autre OS qui a écrasé Grub2 ou pour toute autre raison nécessitant de réinstaller Grub2 dans le MBR, lancez un LiveCD et ouvrez un terminal. Tapez-y la commande suivante:

$ sudo fdisk -l

Ceci affichera les disques et les partitions sur chaque disque. Repérez-y la partition où se trouve le système racine de Linux parce que cela va servir dans les commandes suivantes:

$ sudo mount /dev/sdxy /mnt
$ sudo grub-install --root-directory=/mnt /dev/sdx

Remplacez le x et y ci dessus par la valeur qui correspond chez vous. sdxy est la partitions où se trouve le répertoire /boot par exemple sda1 et sdx est le disque dans le MBR duquel vous voulez installer Grub par exemple sda.

Un OS manque dans les choix du menu Grub

Si un OS a été mal détecté, relancez la configuration de Grub:

$ sudo update-grub

Changer l’OS lancé par défaut

Pour changer l’OS booté par défaut, il suffit d’éditer le fichier /etc/default/grub pour y changer la valeur de:

GRUB_DEFAULT=0

Ensuite, il faut mettre à jour le fichier /boot/grub/grub.cfg en lançant la commande:

$ sudo update-grub

Mais il y a plus simple. Une commande lancée depuis le terminal et qui effectue le changement pour vous:

$ sudo grub-set-default x

Remplacez x par l’index de l’OS à lancer par défaut. Cet index commançant à 0 est donnépar la position de l’OS dans le menu grub.

Edit: Pour que la commande grub-set-default soit active, il faut que GRUB_DEFAULT=saved. C’est-à-dire que, dans ce cas, Grub lance l’OS qui a été lancé la fois précédente. Cet OS peut être modifié au moyen de la commande grub-set-default.

Supprimer Grub2 pour réinstaller Grub legacy

Si pour une raison ou une autre, vous voulez réinstaller Grub legacy à la place de Grub2, voici comment procéder.
Commencez par faire le backup des fichiers de grub2, on ne sait jamais:

$ sudo cp /boot/grub /boot/grub.old
$ sudo rm -R /boot/grub/*

Ensuite on supprime Grub2 via aptitude et on réinstalle Grub legacy:

$ sudo aptitude purge grub-pc grub-common
$ sudo aptitude install grub
$ sudo update-grub

La dernière commande va créer le fichier /boot/grub/menu.lst.
A ce stade, il faut encore installer grub dans le MBR ce qui se fait par la commande:

$ sudo grub-install /dev/sda

Remplacez éventuellement /dev/sda par le disque que vous voulez si vous ne voulez pas installer grub dans le MBR de sda.
Ensuite lancez grub en tapant:

$ sudo grub

Lorsque vous avez le prompt de grub, entrez la commande:

grub> find /boot/grub/stage1

Notez la réponse de grub car celle-ci devra être introduite dans la ligne suivante:

grub> root (hd0,0)
grub> setup (hd0)
grub> quit

Remplacez évidemment (hd0,0) par la valeur donnée par la commande find. Dans la commande setup, remplacez le zéro (hd0) par la valeur donnée par le premier chiffre de la commande find. Voir http://linux.leunen.com/?p=43

Voilà, Grub legacy est réinstallé et opérationnel. Rebootez pour voir apparaître le menu Grub et tester ces différents choix.

Note: Avec Grub1 (grub legacy), il fallait appuyer sur la touche Esc pour faire apparaître le menu de Grub quand on n’avait qu’un seul OS. Avec Grub2, c’est sur la touche Shift qu’il faut appuyer.

Sources

https://help.ubuntu.com/community/Grub2
http://doc.ubuntu-fr.org/grub-pc
http://ubuntuforums.org/showthread.php?t=1298932
http://ubuntuforums.org/showthread.php?t=1195275
http://ubuntuforums.org/showthread.php?t=1285897

Comments

Comment from Lucky
Time: 14 novembre 2009, 22 h 45 min

Merci pour ces explications très claires et utiles !

Comment from Dehorter
Time: 22 novembre 2009, 15 h 51 min

Excusez moi, je fais figure d’intrus. J’essaies de comprendre Linux mais il semblerait que les nons lunisiens doivent rester ignorants.
Mon DD est partitionné en 3 : XP – Vista – Ubuntu 9.10. Je désirerais qu’a l’allumage de mon ordinateur, grub2 me fasse demarrer automatiquement sur Vista avec bien sur, toujours la possibilité manuelle de démarrer sur Ubuntu. Je crois que vous fournissez le moyen d’y arriver mais je ne comprend rien aux manoeuvres. Y aurait il un « Grub2 pour les nuls » car je suis perdu

Comment from admin
Time: 22 novembre 2009, 16 h 55 min

Dehorter:
Effectivement Grub2 n’est pas facile à appréhender. Dans ton cas, si tu connais la position de Vista dans le menu Grub, il te suffit de modifier GRUB_DEFAULT dans /etc/default/grub puis de faire un update-grub:
gksudo gedit /etc/default/grub
sudo update-grub
Je te conseille de rejoindre la mailing-list Ubuntu ou les forums si tu as des questions plus spécifiques ou si tu rencontres des problèmes pour effectuer ces commandes.

Comment from febcrash
Time: 12 mai 2010, 16 h 34 min

Salut, au début de ton tuto tu mets :
$ sudo aptitude install grup-pc

il y a une coquille : il faut entrer grub au lieu de grup

Merci pour ce superbe article sinon 😉

Comment from admin
Time: 12 mai 2010, 16 h 38 min

@febcrash
Merci ! Je vais corriger cela tout de suite.

Comment from tisc0
Time: 24 octobre 2010, 12 h 39 min

Net et précis, remise sur pied immédiate de mon grub après réinstall d’un win7 malotru 🙂
Thanks for clear tuto