Lors de mises à jour, il arrive que celles-ci recréent le chargeur de démarrage, avec boot par défaut sur la partition Linux, dans le cas d'un multiboot.
Mais peut-être avez vous envie de booter systématiquement par défaut sur une autre partition.

Le challenge est donc: Créer un script de mise à jour du GRUB, et exécuter celui-ci à l'arrêt de Fedora.

Dans cet exemple on considère une partition Windows.
- Les différentes partitions bootables sont marquées par "menuentry" dans /boot/grub2/grub.cfg (grub2 à partir de la Fedora 17).
On éliminera les occurrences des partitions 'Recovery'.

- le chargeur actuel est visible par la commande:

grub2-editenv list
- La modification s'effectue par la commande
grub2-set-default
- La construction du grub s'effectue par la commande
grub2-mkconfig

On aura donc un fichier de commande du type:

#!/bin/bash
entree=`cat /boot/grub2/grub.cfg | grep menuentry | grep 'Windows' | grep -v 'Recovery' | awk -F\' '{print $2}'`
echo "$entree"
echo Chargeur par défaut avant:
grub2-editenv list
grub2-set-default "$entree"
grub2-mkconfig -o /boot/grub2/grub.cfg
echo Chargeur par défaut après:
grub2-editenv list

Il faut ensuite exécuter ce script dans les phases d'arrêt de Linux, pour chaque runlevel

Rappel: exécution des scripts au démarrage et à l'arrêt du système:

Il existe 6 runlevels:
0: arrête l'ordinateur
1: mode simple utilisateur
2: mode multi-utilisateur sans réseau
3: mode multi-utilisateur avec réseau
4: réservé pour la personnalisation, sinon identique à 3
5: identique à 4, il est habituellement utilisé pour la connexion GUI (comme xdm de X ou kdm de KDE). C'est le niveau par défaut.
6: redémarre l'ordinateur

Le démarrage et l'arrêt des daemons s'effectue en ajoutant des liens symboliques dans /etc/rc.d/rc0.d, /etc/rc.d/rc1.d, /etc/rc.d/rc2.d, /etc/rc.d/rc3.d, /etc/rc.d/rc4.d, /etc/rc.d/rc5.d,/etc/rc.d/rc6.d
Ces liens sont de la forme S[xx][Nom du script] et K[yy][Nom du script]
S pour "start", K pour "kill", ce qui aura pour effet de lancer le script avec le paramètre "start" ou "stop"
[xx] étant le numéro de séquence d'exécution.
Dans notre cas, on ne fera rien au démarrage du système, seulement à l'arrêt. Donc nous sélectionnerons uniquement les runlevel 0 et 6.
Notre script ressemblera donc à ceci:
/etc/rc.d/init.d/maj_GRUB
#!/bin/bash
# chkconfig: 12345 99 01
# description: Reconfiguration de GRUB
# (pour explication des deux lignes ci-dessus, voir plus bas)
echo >> /var/log/maj_GRUB.log
echo `date`: niveau précédent: `runlevel | awk -F' '  '{print $1}'` - niveau actuel: `runlevel | awk -F' '  '{print $2}'` >> /var/log/maj_GRUB.log
case "$1" in
start)
echo start, on ne fait rien >> /var/log/maj_GRUB.log
;;
stop)
entree=`cat /boot/grub2/grub.cfg | grep menuentry | grep 'Windows' | grep -v 'Recovery' | awk -F\' '{print $2}'`
echo Avant: `grub2-editenv list` >> /var/log/maj_GRUB.log
grub2-set-default "$entree" >> /var/log/maj_GRUB.log
grub2-mkconfig -o /boot/grub2/grub.cfg >> /var/log/maj_GRUB.log
echo Après: `grub2-editenv list` >> /var/log/maj_GRUB.log
;;
esac
exit 0


Il faut maintenant faire les liens symboliques dans chaque répertoire de runlevel avec ce fichier (exemple: /etc/rc2.d/S55maj_GRUB)

Fedora permet de simplifier cette procédure en indiquant en début du script les différents runlevels d'exécution.
# chkconfig: 12345 99 01
# description: Reconfiguration de GRUB

la première séquence represente les niveaux ou l'on exécutera le script, le second le numéro de séquence du start, le troisième celui du kill.

on fait prendre en compte ces instructions par:
chkconfig --add maj_GRUB


ce qui crée les liens symboliques au bon endroit.
(faire pour vérifier:
find /etc/rc.d -name *GRUB | sort)

On a bien notre script, ainsi que des démarrages (vides) pour les niveaux 1 à 5, et des arrêts pour les niveaux 0 et 6.
./init.d/maj_GRUB
./rc0.d/K01maj_GRUB
./rc1.d/S99maj_GRUB
./rc2.d/S99maj_GRUB
./rc3.d/S99maj_GRUB
./rc4.d/S99maj_GRUB
./rc5.d/S99maj_GRUB
./rc6.d/K01maj_GRUB

Note complémentaire: on utilise "runlevel" car la commande "who -r" ne renvoie rien si l'utilisateur n'est pas en session.

Voilà c'est tout; il n'y a plus qu'à tester un reboot !