01 06 | 2012

Ubuntu 12.04 et Grub2: configurer le démarrage par défaut

Rédigé par Sorrodje

Classé dans : Informatique, Mémos techniques

Ubuntu 12.04 utilise le bootloader GRUB2. Par défaut, ce dernier va toujours démarrer sur une entrée donnée (Sur installation par défaut, la dernière version du kernel) . Pour autant, on peut souhaiter modifier ça pour démarrer par défaut sur un noyau donné: par exemple un noyau Xen ou openVZ pour mettre en oeuvre une virtualisation de ce type ou un noyau personnalisé ou que sais-je. On a d'autant plus besoin de ce paramétrage par défaut sur un home-server sur lequel on travaille  généralement à distance en ssh sans pouvoir aller choisir l'entrée de démarrage à chaque reboot...

Or Grub2 peut utiliser dans ses dernières versions des sous-menus pour ranger proprement toutes ces entrées. Comment qu'on fait donc du coup pour lui demander de booter sur une entrée donnée d'un sous-menu ? 

J'ai cherché un moment avant de comprendre donc comme d'hab j'en fais un mémo pour moi-même ou pour qui buterait sur la même question. Et ça permet de faire un petit tour curieux dans le fonctionnement de la configuration de Grub ;)


Grub 1.99, menus et sous-menus


On va partir ici d'un exemple d'une machine sur laquelle on a installé un Hyperviseur Xen.

Du coup on a un grub qui a cette tête là:




Avec un sous menu Xen .. si on clique sur notre sous menu, on obtient ça :





Configuration de l'entrée par défaut pour le démarrage: les fichiers concernés.


Le fichier de config de grub est /boot/grub/grub.cfg, qui commence par ces lignes :

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


Ce fichier est donc auto généré et nos options passées à la main doivent l'être directement dans d'autres fichiers dont surtout /etc/default/grub.

Dans /boot/grub/grub.cfg, on a un paragraphe dédié à la structuration du menu de démarrage. Voici donc en toute lettre ce qui permet à grub de proposer les écrans ci-dessus.

menuentry 'Ubuntu, avec Linux 3.2.0-23-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
linux /vmlinuz-3.2.0-23-generic root=/dev/mapper/ubuntu-root ro
initrd /initrd.img-3.2.0-23-generic
}
menuentry 'Ubuntu, avec Linux 3.2.0-23-generic (mode de dépannage)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
echo 'Chargement de Linux 3.2.0-23-generic ...'
linux /vmlinuz-3.2.0-23-generic root=/dev/mapper/ubuntu-root ro recovery nomodeset
echo 'Chargement du disque mémoire initial ...'
initrd /initrd.img-3.2.0-23-generic
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
submenu "Xen 4.1-amd64" {
menuentry 'Ubuntu GNU/Linux, avec Xen 4.1-amd64 et Linux 3.2.0-23-generic' --class ubuntu --class gnu-linux --class gnu --class os --class xen {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
echo 'Chargement de Xen 4.1-amd64 ...'
multiboot /xen-4.1-amd64.gz placeholder
echo 'Chargement de Linux 3.2.0-23-generic ...'
module /vmlinuz-3.2.0-23-generic placeholder root=/dev/mapper/ubuntu-root ro
echo 'Chargement du disque mémoire initial ...'
module /initrd.img-3.2.0-23-generic
}
menuentry 'Ubuntu GNU/Linux, avec Xen 4.1-amd64 et Linux 3.2.0-23-generic (mode de dépannage)' --class ubuntu --class gnu-linux --class gnu --class os --class xen {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
echo 'Chargement de Xen 4.1-amd64 ...'
multiboot /xen-4.1-amd64.gz placeholder
echo 'Chargement de Linux 3.2.0-23-generic ...'
module /vmlinuz-3.2.0-23-generic placeholder root=/dev/mapper/ubuntu-root ro single
echo 'Chargement du disque mémoire initial ...'
module /initrd.img-3.2.0-23-generic
}
}
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
linux16 /memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 0724cebf-f30c-4fd6-a673-3b33b727b90b
linux16 /memtest86+.bin console=ttyS0,115200n8

On y voit clairement les "menuentry" et le "submenu" Xen.

Jetons un oeil à notre /etc/default/grub qui nous permet de passer à la main des options pour grub:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'

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

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# 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 entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"



La ligne qui nous intéresse ici est GRUB_DEFAULT=0 qui indique à grub sur quoi il démarrer par défaut.

En l'occurence ici, 0 signifie la première ligne (amusant non ?) et faute de précision, la première ligne du menu principal. Ainsi (là c'est moi qui extrapole), dans la mesure où cette première ligne est toujours la dernière version du noyau, ça permet à notre OS de toujours bien démarrer sur un noyau à jour et non sur une version précédente.


Paramétrage spécifique du démarrage par défaut.


Maintenant, toujours dans  notre exemple Xen, ce qu'on voudrait obtenir c'est que Grub démarre par défaut sur le dernière version du noyau Xen à aller chercher dans notre sous-menu. Après avoir cherché un moment, Google m'a amené ce lien : http://www.gnu.org/software/grub/manual/html_node/default.html  qui nous explique qu'on doit spécifier le chemin complet de l'entrée sur laquelle on veut démarrer avec notre directive.

En bref, si j'ai tout bien compris, avec un menu de Grub structuré comme ça:

Entrée 1     0
Entrée 2     1
Sous menu 1
         Entrée 1     0
         Entrée 2    1
Sous menu 2
         Entrée 1     0
         Entrée 2    1
         Entrée 3    2

Entrée 3            2


Donc,

Si on veut démarrer sur la première entrée du menu principal on laisse la config par défaut : GRUB_DEFAULT=0

Si on veut démarrer sur la troisième entrée directe ( genre un Windows en Dual boot) : GRUB_DEFAULT=2

Si on veut démarrer sur l'entrée 3 du Sous-menu 2, il faut spécifier un truc du genre GRUB_DEFAULT="Sous menu 2 > Entrée 3"  en utilisant soit les noms exacts des sous-menus tels qu'il apparaissent dans /boot/grub/grub.cfg (voir ci dessus) soit l'ordre de l'entrée dans le menu ou sous-menu. Or, la première entrée doit être signifiée à GRUB avec 0 et pas 1 , la deuxième par 2 , etc... ( chiffre en rouge)...

A ce stade, vous prendrez peut-être une aspirine ?


Concrètement pour démarrer dans une entrée d'un sous-menu...


Sur la base de mon exemple Xen et après quelques essais infructueux (...), j'en suis arrivé aux méthodes suivantes: Pour le sous menu, j'utilise l'appellation complète issue de /boot/grub/grub.cfg et pour l'entrée j'utilise soit le nom complet, soit l'ordre d'arrivée dans le menu.

Dans notre exemple si on veut démarrer sur le noyau Xen et pas le mode de récupération ça donne soit ça:

GRUB_DEFAULT="Xen 4.1-amd64>Ubuntu GNU/Linux, avec Xen 4.1-amd64 et Linux 3.2.0-23-generic" 

soit ça:

GRUB_DEFAULT="Xen 4.1-amd64>0" 


L'avantage de la deuxième méthode à mes yeux c'est qu'au fur et à mesure des MAJ du Noyau Xen, Grub va à priori toujours démarrer sur la première entrée par défaut et donc normalement toujours sur la version la plus à jour. En utilisant l'appellation précise, on resterait toujours à démarrer sur la version du noyau stipulée.

Attention, c'est à vérifier dans le temps et à amender/préciser au cas où. Surtout que je n'ai pas tou testé (je n'ai pas de Dual boot sous la main) .
Merci de me faire part de vos expériences et surtout signaler par un commentaire si je suis dans l'erreur afin que je puisse corriger ce mémo!!


La documentation GRUB

8 commentaires

dimanche 24 juin 2012 à 00:34 H2L29 a dit : #1

salut, il y a aussi la possibilité d'éditer le choix du démarrage ainsi que d'autres subtilités graphiquement avec startupmanager (dans les dépôts)

sinon pour les sous menus je n'utilise pas mais de ce que je lis il vaut mieux créer les fichiers dans /etc/grub.d/ plutôt que d'éditer /boot/grub/grub.cfg

une petite faute s'es glissée
Entrée 3 2 et pas 3 ;)

lundi 25 juin 2012 à 11:55 Sorrodje a dit : #2

Ah oui vu pour l'erreur , je modifie ;).

Sinon l'idée ici était plutot de voir comment effectuer cette manip avec la manipulation du fichier de cong principal (/etc/default/grub) à la main dans un contexte "serveur". Pas de GUI donc ;)

Sinon en effet, on n'édite jamais directement /boot/grub/grub.cfg qui s'alimente avec les fichiers de conf "amont".

samedi 29 décembre 2012 à 18:34 tatayé a dit : #3

Pas mal comme description mais elle ne fonctionne pas si on ne sais pas qu'il faut faire update-grub update !
donc je resume je modifie le fichier par :
- sudo gedit /etc/default/grub
-> j'utilise ici gedit pour peu remplacer gedit par vi
- a la ligne GRUB_DEFAULT=0
-> il faut remplacer 0 par le numero de la ligne comme expliqué dans le blog

- et surtout je fais pour valider la commande update-grub sinon ca ne marche pas

Vu avec le site :http://forum.ubuntu-fr.org/viewtopic.php?id=389665

mercredi 13 février 2013 à 22:24 padodo a dit : #4

Dans le cas de dual boot (windows vista et ubuntu 11.10) , comment modifier le menu de démarrage d'une façon simple?

jeudi 14 février 2013 à 09:15 Sorrodje a dit : #5

@padodo : Eh ben, comme indiqué ci dessus, tu repères l'entrée de l'OS sur lequel tu veux démarrer par défaut et tu modifie /etc/default/grub en conséquence. sinon tu peux aussi chercher des solutions en "tout-graphique" genre http://doc.ubuntu-fr.org/grub-customizer ...

Je ne conseille jamais d'outils graphique pour bricoler le booloader grub mais si c'est ta préférence, tu es grand, majeur et vacciné non ? ;-)

dimanche 26 mai 2013 à 10:45 Legrand a dit : #6

Bonjour, j’essaie de réparer l'ordinateur d'un ami avec Linux Ubuntu 12.04. J'ai réussi l'installation d'Ubuntu, et là il ne trouvait pas d'OS installé. Il a cependant bien trouvé la partition d'installation d'origine que ne n'arrivais pas à activer ! J'ai donc pu grâce au menu installer à nouveau ce Windows en pensant le faire fonctionner en double avec Linux... Là je lis votre article et me demande si je vais réussir à créer une ligne de démarrage du Windows car la ligne existante me ramène systématiquement au menu de réinstallation...
Je ne sais même pas comment tester la ligne de commande ni quel fichier choisir !
Merci de m'apporter vos éclairages.

dimanche 26 mai 2013 à 22:32 Sorrodje a dit : #7

@Legrand : Je vais avoir du mal à vous apporter de l'aide depuis ce blog. Le meilleur conseil que je puisse vous donner c'est de vous rendre sur le forum ubuntu-fr.org et exposer votre problème en essayant d'être le plus précis possible dans l'exposé des soucis rencontrés. là , il faudrait avoir une vision claire de l'état des partitions et du programme de démarrage grub.

dimanche 28 septembre 2014 à 15:52 hub61000 a dit : #8

Super mémo, merci !
J'avais exactement me même souci d'ordre de démarrage que toi.
J'ai fais pas mal de recherches sur le net et ton mémo répond exactement à la question que je me posais.

Écrire un commentaire

Quelle est la deuxième lettre du mot kvedqv ? : 

Archives

Contrat Creative Commons
Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Partage à l'Identique 2.0 France
.