Paramétrer GRUB2 avec Ubuntu
Introduction
Cela fait un long moment que GRUB, dans sa version 1, est le chargeur de démarrage le plus populaire du monde de GNU/Linux. GRUB2 a de quoi déconcerter vu que son paramétrage se passe d'une manière plus ou moins différente de son prédécesseur. Voici un bref tutorial pour en comprendre les bases et effectuer quelques opérations usuelles.
Le fichier grub.cfg
Le fichier /boot/grub/grub.cfg est le remplaçant de son ancêtre /boot/grub/menu.lst. À l'inverse de ce dernier, il ne doit pas être édité directement ! En effet, il sera généré à l'aide d'un utilitaire se basant sur des scripts bash et un fichier de configuration.
J'ai été étonné de voir que les documentations de certaines distributions (comme le wiki de ArchLinux par exemple) indiquent d'effectuer des modifications directement dans ce fichier. Je ne recommande absolument pas de le faire et on pourra noter que ce fichier est en lecture seule dans la distribution Ubuntu.
Le fichier /etc/default/grub
Le fichier /etc/default/grub permet de changer certains paramètres de GRUB2. Ces paramètres sont ceux que l'on pouvait trouver dans l'en-tête de l'ancien menu.lst, avant les différentes entrées du menu de démarrage. Voici ce que l'on peut paraméter (sur base de ma propre configuration) :
GRUB_DEFAULT=0Permet de définir l'entrée par défaut dans le menu de démarrage. La valeur peut-être un nombre naturel (définissant la position) ou saved. Ce dernier indique que l'entrée choisie au dernier démarrage sera la prochaine entrée par défaut. Lorsque cette ligne est commentée, la valeur par défaut est 0.
#GRUB_HIDDEN_TIMEOUT=0Permet de définir si le menu de démarrage doit être affiché. Si ce paramètre est commenté, il sera affiché. Sinon, sa valeur est un nombre naturel (secondes). Ce nombre définit le nombre de secondes à attendre avant de lancer le boot de l'entrée par défaut. Si cette valeur est supérieure à 0, pendant le nombre de secondes définies, vous aurez la possibilité de faire afficher le menu manuellement en appuyant sur Esc par exemple.
#GRUB_HIDDEN_TIMEOUT_QUIET=truePermet de définir si un chronomètre doit-être affiché durant les GRUB_HIDDEN_TIMEOUT secondes définies dans le paramètre précédent. Sa valeur est true ou false. Lorsque cette ligne est commentée, la valeur par défaut est false.
GRUB_TIMEOUT="5"Permet de définir combien de temps le menu de démarrage doit attendre avant de booter sur l'entrée par défaut. La valeur est soit un nombre naturel (secondes), soit -1. Ce dernier indiquera que le menu doit attendre indéfiniment. Précisons que si la valeur est 0, l'entrée par défaut sera bootée instantanément. Lorsque cette ligne est commentée, la valeur par défaut est 5.
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`Permet d'extraire (dans ce cas-ci) ou de définir le nom de la distribution pour les entrées du menu correspondantes au démarrage du système hôte. La valeur est donc une chaîne de caractères. Lorsque cette ligne est commentée, la valeur par défaut est GNU/Linux.
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"Permet d'ajouter au paramètre linux de l'entrée correspondante au système hôte les options définies dans la chaîne de caractères lui servant de valeur. En résumé, se sont les paramètres passés au noyau.
GRUB_CMDLINE_LINUX=""Ce paramètre a exactement le même rôle que la paramètre précédent à la seule différence que ses valeurs sont aussi ajoutées à l'entrée du recovery mode.
#GRUB_TERMINAL=consolePermet d'activer ou de désactiver le mode graphique si cette ligne est respectivement commentée ou non.
#GRUB_GFXMODE=640x480Permet de définir la résolution du menu de démarrage. Un deuxième x suivi de la profondeur peut-être ajouté (par exemple 1024x768x24). Lorsque cette ligne est commentée, la valeur par défaut est 640x480.
#GRUB_DISABLE_LINUX_UUID=truePermet de définir l'argument root avec l'UUID des disques durs. Si cette ligne est commentée, root devra être paramétré avec un support se trouvant dans /dev/. Sa valeur est true ou false.
#GRUB_DISABLE_LINUX_RECOVERY="true"Permet de générer ou non des entrées recovery si cette ligne est respectivement commentée ou non. Sa valeur est true ou false.
GRUB_DISABLE_OS_PROBER=truePermet de désactiver la recherche automatique de nouveaux systèmes lors de la génération du fichier grub.cfg. Sa valeur est true ou false. Lorsque cette ligne est commentée, la valeur par défaut est false.
Modifier les entrées du menu de démarrage
Maintenant que nous avons vu comment configurer les options correspondantes à l'en-tête de l'ancien menu.lst, il reste à voir comment configurer les entrées du menu de démarrage. J'ai personnellement été surpris par la qualité de ce nouveau système que j'ai trouvé très pratique et modulaire. La configuration poussée demandera des compétences en bash, mais je vais vous donner des indices pour pouvoir effectuer quelques opérations de base.
Tout d'abord, cela se passe dans le répertoire /etc/grub.d/, voilà ce qu'on y trouve :
benlaug@xps:/etc/grub.d$ ls -al
total 48
drwxr-xr-x 2 root root 4096 2009-11-02 14:32 .
drwxr-xr-x 147 root root 12288 2009-11-06 14:19 ..
-rwxr-xr-x 1 root root 3296 2009-10-24 02:43 00_header
-rwxr-xr-x 1 root root 1154 2009-10-24 02:31 05_debian_theme
-rwxr-xr-x 1 root root 3778 2009-10-24 02:43 10_linux
-rw-r--r-- 1 root root 772 2009-10-23 18:24 20_memtest86+
-rwxr-xr-x 1 root root 5467 2009-10-29 17:43 30_os-prober
-rw-r--r-- 1 root root 214 2009-10-24 02:43 40_custom
-rw-r--r-- 1 root root 483 2009-10-24 02:43 READMEEn dehors du fichier README, les autres fichiers sont des scripts bash. La génération du fichier grub.cfg va se passer tout simplement en exécutant l'ensemble de ces scripts dans un ordre croissant, l'ordre étant appliqué sur les numéros XX précédent le caractère _ dans le nom de ces scripts.
Voici les rôles de chacun de ces fichiers que l'on trouve à l'installation du système :
- 00_header : script permettant la génération de l'en-tête du fichier grub.cfg. Cet en-tête est généré principalement à l'aide des informations que vous avez paramétrées dans le fichier /etc/default/grub.
- 05_debian_theme : script permettant la génération des informations sur le thème graphique du menu de démarrage. À l'heure où j'écris ces lignes, sur Ubuntu 9.10, le thème est minimal : du texte blanc sur un fond noir.
- 10_linux : script permettant de générer les entrées correspondantes à votre système GNU/Linux hôte.
- 20_memtest86+ : script permettant de générer les entrées memtest.
- 30_os-prober : script permettant de détecter des nouveaux systèmes lors de la génération du fichier grub.cfg et de générer les entrées correspondantes. Il est normalement capable de détecter les systèmes avec un noyaux Linux, un noyau Hurd, les systèmes Windows et les systèmes Mac OS X.
- 40_custom : script permettant de générer des entrées introduites manuellement dans ce fichier.
N'ayant jamais été fan des entrées memtest dans le menu démarrage, j'ai décidé de les supprimer. Question : comment retirer du menu de démarrage les entrées correspondantes à un script du répertoire /etc/grub.d/ ? Comme précisé plus haut, les scripts doivent être exécutables pour qu'ils aient un effet lors de la génération du fichier grub.cfg. La réponse est donc tout simplement, en retirant le droit d'exécution du script en question. Dans l'exemple des entrées memtest, en exécutant :
$ sudo chmod -x 20_memtest86+Comme vous avez pu le constater, dans ma configuration du fichier /etc/default/grub, j'ai désactivé l'option os-prober. Il m'a donc semblé inutile que le script 30_os-prober soit exécuté :
$ sudo chmod -x 30_os-prober/!\ Attention /!\ : désactiver le script 30_os-prober entraînera l'affichage du menu de démarrage peu importe votre paramétrage dans le fichier /etc/default/grub. En effet, l'action des options GRUB_HIDDEN_TIMEOUT et GRUB_HIDDEN_TIMEOUT_QUIET est effectuée dans ce script. Si vous ne voulez pas que votre menu de démarrage s'affiche, contentez-vous de l'option GRUB_DISABLE_OS_PROBER=true dans le fichier /etc/default/grub.
Une autre question importante est : j'ai envie de rajouter une entrée manuellement dans le menu de démarrage, comment faire ? Il y a deux réponses à cette question ! La première est en utilisant le fichier 40_custom. Voici ce qu'il contient :
#!/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.Ce que nous dit le commentaire est d'ajouter nos entrées manuelles après ce commentaire. En effet, tout ce que vous marquerez après ce commentaire sera recopié tel quel dans le fichier grub.cfg lors de sa génération. Voici ce à quoi ressemble mon fichier après paramétrage de mon entrée Windows :
#!/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" {
set root=(hd0,1)
chainloader +1
}Pour plus d'informations sur le paramétrage des entrées de menu, je vous invite à consulter les sources citées tout en bas de l'article (et plus particulièrement les deux dernières). Pour bien vous faire comprendre le rôle de 40_custom, voilà ce qu'on trouve dans grub.cfg après sa génération :
### 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.
menuentry "Windows 7" {
set root=(hd0,1)
chainloader +1
}
### END /etc/grub.d/40_custom ###Un autre moyen de rajouter une entrée manuellement est de créer son propre script. Son emplacement dans le menu dépendra du préfixe numérique à deux chiffres que vous lui attribuerez. Notons que le préfixe minimum est 06.
Imaginons le scénario suivant : vous avez vos entrées memtest actives et vous voulez rajouter une entrée Windows entre les entrées de votre système GNU/Linux et les entrées memtest. Les premières sont dans un script portant le préfixe 10 et les deuxièmes 20. Vous pourriez donc créer un script ayant pour nom 11_windows, par exemple (le chiffre pouvant donc aller de 11 à 19 inclus). Maintenant il reste à régler la question du contenu. Vous voulez entrer la même chose que dans l'exemple avec le fichier 40_custom, seulement, il faut que votre fichier soit un script et non pas un simple texte. Pas de panique, il suffit de s'inspirer de ce fameux fichier 40_custom. Tout ce que vous avez à faire est de mettre dans l'en-tête de votre nouveau script les lignes suivantes :
#!/bin/sh
exec tail -n +3 $0Après quoi, vous avez juste à ajouter vos entrées manuelles, ce qui dans cet exemple donne :
#!/bin/sh
exec tail -n +3 $0
menuentry "Windows 7" {
set root=(hd0,1)
chainloader +1
}Ce qui génère dans le fichier grub.cfg :
### BEGIN /etc/grub.d/11_windows ###
menuentry "Windows 7" {
set root=(hd0,1)
chainloader +1
}
### END /etc/grub.d/11_windows ###Après avoir crée votre script, n'oubliez pas de lui donner la permission d'exécution avant de générer le fichier grub.cfg :
$ sudo chmod +x 11_windowsGarder le noyau le plus récent dans le menu de démarrage
Une chose embêtante est le fait que tous les noyaux depuis l'installation initiale sont listés dans le menu de démarrage. J'imagine que beaucoup de personnes sont seulement intéressées par la présence du noyau le plus récent.
Après avoir analysé le script 10_linux, je suis en mesure de vous donner une méthode pour le modifier afin de satisfaire ce désir. Le désavantage de GRUB2 par rapport à la première version est la nécessité de connaître le bash. Cependant, son avantage est l'automatisation des tâches à chaque mise à jour du noyau (donc cette modification sera définitive).
Voici un extrait du fichier 10_linux original :
list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
done`
while [ "x$list" != "x" ] ; do
linux=`version_find_latest $list`
echo "Found linux image: $linux" >&2
basename=`basename $linux`
dirname=`dirname $linux`
rel_dirname=`make_system_path_relative_to_its_root $dirname`
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
alt_version=`echo $version | sed -e "s,\.old$,,g"`
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
initrd=
for i in "initrd.img-${version}" "initrd-${version}.img" \
"initrd-${version}" "initrd.img-${alt_version}" \
"initrd-${alt_version}.img" "initrd-${alt_version}"; do
if test -e "${dirname}/${i}" ; then
initrd="$i"
break
fi
done
if test -n "${initrd}" ; then
echo "Found initrd image: ${dirname}/${initrd}" >&2
else
# "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here.
linux_root_device_thisversion=${GRUB_DEVICE}
fi
linux_entry "${OS}, Linux ${version}" \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \
quiet
if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}, Linux ${version} (recovery mode)" \
"single ${GRUB_CMDLINE_LINUX}"
fi
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
done
Ce morceau de code fait une liste des différents noyaux présents et fait une boucle sur cette liste. En fin de boucle, la variable contenant la liste des noyaux est mise à jour en supprimant le noyau venant d'être traité (les noyaux sont traités du plus récent au plus ancien).
Si nous supprimons la boucle et la mise à jour de la variable en fin de boucle (ce n'est pas spécialement nécessaire, mais pourquoi garder une instruction inutile ?), seul le noyau le plus récent sera traité !
Vous devez donc remplacer le morceau de code précédent par le morceau de code suivant :
list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
done`
linux=`version_find_latest $list`
echo "Found linux image: $linux" >&2
basename=`basename $linux`
dirname=`dirname $linux`
rel_dirname=`make_system_path_relative_to_its_root $dirname`
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
alt_version=`echo $version | sed -e "s,\.old$,,g"`
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
initrd=
for i in "initrd.img-${version}" "initrd-${version}.img" \
"initrd-${version}" "initrd.img-${alt_version}" \
"initrd-${alt_version}.img" "initrd-${alt_version}"; do
if test -e "${dirname}/${i}" ; then
initrd="$i"
break
fi
done
if test -n "${initrd}" ; then
echo "Found initrd image: ${dirname}/${initrd}" >&2
else
# "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here.
linux_root_device_thisversion=${GRUB_DEVICE}
fi
linux_entry "${OS}, Linux ${version}" \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \
quiet
if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}, Linux ${version} (recovery mode)" \
"single ${GRUB_CMDLINE_LINUX}"
fi
Après génération du fichier grub.cfg, seul le noyau le plus récent (et son recovery mode selon votre paramétrage) sera présent dans le menu de démarrage.
Génération du fichier /boot/grub/grub.cfg
La génération du fichier grub.cfg est sûrement l'étape la plus simple de ce paramétrage de GRUB2. Trois commandes sont à votre disposition :
$ sudo update-grub2
$ sudo update-grub
$ grub-mkconfig -o /boot/grub/grub.cfgLa première appelle la deuxième qui appelle la troisième. Comme la dernière est assez lourde à taper et que la première effectue un appel pour rien, je vous recommande d'utiliser :
$ sudo update-grubVoici un exemple d'exécution :
benlaug@xps:/etc/grub.d$ sudo update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
doneUne fois que done est affiché, vous pourrez savourer votre nouveau paramétrage au prochain redémarrage. Il se peut que les premières fois vous n'arriviez pas au résultat escompté. Je vous encourage vivement à effectuer plusieurs expérimentations avec les paramètres du fichier /etc/default/grub pour bien comprendre et exploiter leurs effets.

Commentaires
Xorauguynaxqxbv
swinnyDit xaikalitag Gevaunoneekek http://usillumaror.com - iziananatt utersesuire http://gussannghor.com cypenoiptioca
Xorauguynaxqxbv
swinnyDit xaikalitag Gevaunoneekek http://usillumaror.com - iziananatt utersesuire http://gussannghor.com cypenoiptioca
Helo http://foxfox.ifxworld.com/ you forex
Helo ! Forex - Travail à domicile d'une tasse de thé soit réussie devenue indépendante, se faire enregistrer forex forex
Helo http://foxfox.ifxworld.com/ you forex
Helo ! Forex - Travail à domicile d'une tasse de thé soit réussie devenue indépendante, se faire enregistrer forex forex
grub2 & uuid ?
Salut
je me permets de te solliciter pour un renseignement concernant grub2.
je m'apprête à modifier mon schéma de partitionnement, ce qui provoquera la modification des uuid de mes partitions home et racine.
Avant de procéder, je cherche ou reporter ces modifications, depuis un live cd, pour que grub2 s'y retrouve au premier reboot, vu que la modification du fichier grub.cfg ne semble pas une très bonne idée...
si tu as des pistes, merci d'avance
Re: grub2 & uuid ?
Bonjour et désolé pour cet énorme retard,
Je vois plusieurs solutions en cas de modifications d'UUID :
Bon courage,
Benjamin
SYNTAX_ERROR
grub ou pas selon plage horaires
Bonjour,
Notre association possede un parc de PAP (point d'accès public à Internet) et nous faisons également des initiations sur ces même postes. Pour les PAP, c'est ubuntu remix (il gère nos stats), et les initiations sont encore sous windows.
J'aimerai definir l'activation du choix de l'OS seulement lorsque nous avons des initiations, afin que les personnes allant sur le PAP ne choissisent Windows.
Auriez vous une idée afin de n'activer le GRUB que dans une plage horaires (hebdomadaire de preference).
Par avance, merci.
Philippe.
Bonsoir,j'ai besoin d'aide
Bonsoir,j'ai besoin d'aide svp;j avais win7 installé sur ma machine je viens d'installer en dualboot ubuntu 11.10 alors je c'est pas ce qui c passer exactement mais je n accède qu'a ubuntu j'ai dans le menu du boot win7 aussi mais qui ne marche pas ça me fait juste redémaré du début et relancé le boot.
que faire pour récupéré mon windows.
nb:j'ai un peu tatoné en modifiant le grub mais je n'y arrive pas merci de votre aide
Une proposition
Bonjour,
Si vous n'avez pas résolu votre problème le lien suivant décrit une solution rencontrée lors d'un dual boot avec windows :
http://michel-eudes.net/blog/index.php?2010/10/11/98-grub2-en-double-boo...
Cordialement
noninscrit;)
Une proposition
Bonjour,
Si vous n'avez pas résolu votre problème le lien suivant décrit une solution rencontrée lors d'un dual boot avec windows :
http://michel-eudes.net/blog/index.php?2010/10/11/98-grub2-en-double-boo...
Cordialement
noninscrit;)