24.5. Personnalisation du fichier de configuration GRUB 2

Les scripts GRUB 2 effectuent des recherches dans l'ordinateur de l'utilisateur et créent un menu de démarrage basé sur les systèmes d'exploitation trouvés par les scripts. Pour refléter les options de démarrage système les plus récentes, le menu de démarrage est automatiquement régénéré lorsque le noyau est mis à jour ou lorsqu'un nouveau noyau est ajouté.
Cependant, les utilisateurs pourraient souhaiter générer un menu contenant des entrées spécifiques ou pour que les entrées se trouvent dans un ordre particulier. GRUB 2 permet d'effectuer une personnalisation de base du menu de démarrage afin de donner aux utilisateurs contrôle de ce qui s'affiche à l'écran.
GRUB 2 utilise une série de scripts pour générer le menu ; ces scripts se trouvent dans le répertoire /etc/grub.d/. Les fichiers suivants sont inclus :
  • 00_header, qui charge les paramètres GRUB 2 du fichier /etc/default/grub.
  • 01_users, qui lit le mot de passe du superutilisateur dans le fichier user.cfg. Dans Red Hat Enterprise Linux 7.0 et 7.1, ce fichier n'a été créé que lorsque le mot de passe boot a été défini dans le fichier kickstart au moment de l'installation, et il inclut le mot de passe défini en texte brut.
  • 10_linux, qui localise les noyaux dans la partition par défaut de Red Hat Enterprise Linux.
  • 30_os-prober, qui génère des entrées pour les systèmes d'exploitations trouvés sur d'autres partitions.
  • 40_custom, un modèle pouvant être utilisé pour créer des entrées de menu supplémentaires.
Les scripts du répertoire /etc/grub.d/ sont lus en ordre alphabétique et peuvent ainsi être renommés pour modifier l'ordre de démarrage d'entrées spécifiques du menu.

Important

Avec la clé GRUB_TIMEOUT définie sur 0 dans le fichier /etc/default/grub, GRUB 2 n'affiche pas la liste des noyaux démarrables lorsque le système est démarré. Pour afficher cette liste pendant le démarrage, appuyez continuellement sur n'importe quelle touche alphanumérique lorsque les informations BIOS sont affichées, GRUB 2 vous présentera le menu GRUB.

24.5.1. Changer l'entrée de démarrage par défaut

Par défaut, la clé de la directive GRUB_DEFAULT dans le fichier /etc/default/grub est le mot « saved ». Cela ordonne à GRUB 2 de charger le noyau spécifié par la directive « saved_entry » dans le fichier d'environnement GRUB 2, qui se trouve dans /boot/grub2/grubenv. Vous pouvez également définir un autre enregistrement GRUB par défaut en utilisant la commande grub2-set-default, qui met à jour le fichier d'environnement GRUB 2.
Par défaut, la valeur saved_entry est définie avec le nom du noyau installé le plus récent du type de paquet kernel. Ceci est défini dans /etc/sysconfig/kernel par les directives UPDATEDEFAULT et DEFAULTKERNEL. Le fichier peut être affiché par l'utilisateur root comme suit :
~]# cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel
La directive DEFAULTKERNEL spécifie quel type de paquet sera utilisé par défaut. Installer un paquet de type kernel-debug ne changera pas le noyau par défaut tant que DEFAULTKERNEL est défini sur les paquets de type kernel.
GRUB 2 prend en charge une valeur numérique comme clé pour que la directive saved_entry change l'ordre par défaut dans lequel les systèmes d'exploitation sont chargés. Pour spécifier quel système d'exploitation doit être chargé en premier, veuillez inclure son numéro dans la commande grub2-set-default. Exemple :
~]# grub2-set-default 2
Remarquez que la position d'une entrée de menu dans la liste est dénotée par un nombre commençant par zéro. Ainsi, dans l'exemple ci-dessus, la troisième entrée sera chargée. Cette valeur sera remplacée par le nom du prochain noyau devant être installé.
Pour forcer un système à toujours utiliser une entrée de menu particulière, veuillez utiliser le nom de l'entrée du menu comme clé de la directive GRUB_DEFAULT dans le fichier /etc/default/grub. Pour répertorier les entrées du menu disponibles, veuillez exécuter la commande suivante en tant qu'utilisateur root :
~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
Le nom de fichier /etc/grub2.cfg est un lien symbolic qui mène au fichier grub.cfg, dont l'emplacement dépendra de l'architecture. Pour des raisons de fiabilité, le lien symbolic n'est pas utilisé dans d'autres exemples dans ce chapitre. Il vaut mieux utiliser des chemins absolus quand on écrit dans un fichier, surtout quand on le répare.
Les changements apportés à /etc/default/grub requièrent de régénérer le fichier grub.cfg comme suit :
  • Sur les machines basées BIOS, exécutez la commande suivante en tant qu'utilisateur root :
    ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
  • Sur les machines basées UEFI, veuillez exécuter la commande suivante en tant qu'utilisateur root :
    ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

24.5.2. Modifier une entrée de menu

Si vous devez préparer un nouveau fichier GRUB 2 avec des paramètres différents, modifier les valeurs de la clé GRUB_CMDLINE_LINUX dans le fichier /etc/default/grub. Remarquez que vous pouvez spécifier plusieurs paramètres pour la clé GRUB_CMDLINE_LINUX, similairement à l'ajout de paramètres dans le menu de démarrage GRUB 2. Exemple :
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,9600n8"
, où console=tty0 est le premier terminal virtuel et console=ttyS0 est le terminal série à utiliser.
Les changements apportés à /etc/default/grub requièrent de régénérer le fichier grub.cfg comme suit :
  • Sur les machines basées BIOS, exécutez la commande suivante en tant qu'utilisateur root :
    ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
  • Sur les machines basées UEFI, veuillez exécuter la commande suivante en tant qu'utilisateur root :
    ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

24.5.3. Ajouter une nouvelle entrée

Lors de l'exécution de la commande grub2-mkconfig, GRUB 2 recherche des noyaux Linux et d'autres systèmes d'exploitation basés sur les fichiers situés dans le répertoire /etc/grub.d/. Le script /etc/grub.d/10_linux recherche les noyaux Linux installés sur la même partition. Le script /etc/grub.d/30_os-prober recherche d'autres systèmes d'exploitation. Des entrées du menu sont également automatiquement ajoutées au menu de démarrage lors de la mise à jour du noyau.
Le fichier 40_custom situé dans le répertoire /etc/grub.d/ est un modèle pour les entrées personnalisées et ressemble à ce qui suit :
#!/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 fichier peut être modifié ou copié. Remarquez qu'une entrée du menu valide doit inclure au minimum :
menuentry "<Title>"{
<Data>
}

24.5.4. Créer un menu personnalisé

Si vous ne souhaitez pas que les entrées du menu soient mises à jour automatiquement, vous pouvez créer un menu personnalisé.

Important

Avant de continuer, effectuez une copie de sauvegarde du contenu du répertoire /etc/grub.d/ au cas où vous devriez annuler les changement ultérieurement.

Note

Remarquez que la modification du fichier /etc/default/grub n'a aucun effet sur la création de menus personnalisés.
  1. Sur les machines basées BIOS, copiez le contenu de /boot/grub2/grub.cfg, ou le contenu de /boot/efi/EFI/redhat/grub.cfg sur les machines UEFI. Ajoutez le contenu de grub.cfg dans le fichier /etc/grub.d/40_custom sous les lignes d'en-tête. La partie exécutable du script 40_custom doit être préservée.
  2. Dans le contenu intégré au fichier /etc/grub.d/40_custom, seuls les blocs menuentry sont nécessaires à la création d'un menu personnalisé. Les fichiers /boot/grub2/grub.cfg et /boot/efi/EFI/redhat/grub.cfg peuvent contenir des spécifications de fonctions ainsi que d'autres contenus au-dessus et au-dessous des blocs menuentry. Si vous avez inclus ces lignes non nécessaires dans le fichier 40_custom dans l'étape précédente, veuillez les supprimer.
    Voici un exemple de script 40_custom personnalisé :
    #!/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 'First custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.10.0-67.el7.x86_64-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' {
            load_video
            set gfxpayload=keep
            insmod gzio
            insmod part_msdos
            insmod xfs
            set root='hd0,msdos1'
            if [ x$feature_platform_search_hint = xy ]; then
              search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1'  7885bba1-8aa7-4e5d-a7ad-821f4f52170a
            else
              search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
            fi
            linux16 /vmlinuz-3.10.0-67.el7.x86_64 root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet LANG=en_US.UTF-8
            initrd16 /initramfs-3.10.0-67.el7.x86_64.img
    }
    menuentry 'Second custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' {
            load_video
            insmod gzio
            insmod part_msdos
            insmod xfs
            set root='hd0,msdos1'
            if [ x$feature_platform_search_hint = xy ]; then
              search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1'  7885bba1-8aa7-4e5d-a7ad-821f4f52170a
            else
              search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a
            fi
            linux16 /vmlinuz-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet
            initrd16 /initramfs-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c.img
    }
  3. Supprimez tous les fichier du répertoire /etc/grub.d/ sauf les fichiers suivants :
    • 00_header,
    • 40_custom,
    • 01_users (s'il existe),
    • et README.
    Alternativement, si vous souhaitez conserver les fichiers dans le répertoire /etc/grub2.d/, rendez-les non exécutables par la commande chmod a-x <file_name>.
  4. Modifiez, ajoutez, ou supprimez des entrées de menu dans le fichier 40_custom comme vous le souhaitez.
  5. Créez à nouveau le fichier grub.cfg en exécutant la commande grub2-mkconfig -o :
    • Sur les machines basées BIOS, exécutez la commande suivante en tant qu'utilisateur root :
      ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
    • Sur les machines basées UEFI, veuillez exécuter la commande suivante en tant qu'utilisateur root :
      ~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg