[LINUX] Grub2-reboot, qui vous permet de changer temporairement le noyau, est pratique. Après tout, j'ai recherché diverses choses sur GRUB2.

1.Tout d'abord

Avez-vous déjà utilisé Linux et expérimenté "J'ai installé un nouveau module de noyau et il n'a pas démarré" ou "J'ai changé les options de démarrage que j'ai passées au noyau et il n'a pas démarré"?

La commande ** grub2-reboot **, qui ne change le noyau qu'au prochain démarrage, est utile dans cette situation. C'est particulièrement utile dans le cloud, où l'accès à la console est restreint, car un redémarrage ultérieur reviendra au noyau d'origine. Il est également utile lors de la commutation entre plusieurs noyaux à des fins de test.

C'était une commande qui était inconnue de façon inattendue, alors je pensais l'introduire, mais en l'enquêtant, j'ai fini par écrire ce qui suit.

1-1. Environnement cible

2. Quand est-ce pratique?

Je l'ai expliqué au début, mais je vais l'expliquer un peu plus en détail. Lorsqu'un serveur qui a été normalement démarré jusqu'à présent cesse soudainement de démarrer, les causes / déclencheurs suivants sont possibles.

Lorsqu'un tel problème survient, il est nécessaire de dépanner la procédure suivante.

** Comment dépanner lorsque vous ne démarrez pas **

  1. Redémarrez le serveur pour afficher l'écran de la console
  2. Dans le menu de démarrage, sélectionnez un noyau qui a été démarré
  3. Après un démarrage réussi, modifiez le noyau par défaut

Il n'y a pas de problème lorsque le serveur lui-même est à portée de main, mais lorsqu'il se trouve dans un emplacement distant tel que le cloud ou le centre de données, l'écran de la console ne peut pas être affiché et l'ancien noyau peut ne pas être sélectionné.

** Public Cloud: ** Certains fournisseurs n'offrent pas de fonctionnalité de connexion à la console ** Centre de données: ** Pour les serveurs qui n'ont pas de carte BMC / IPMI ou de périphérique KVM (commutateur PC), vous devez vous rendre au centre de données.

La commande grub2-reboot ne modifie que temporairement le noyau de démarrage, donc la récupération est possible tant que vous pouvez redémarrer. Cependant, sachez que le noyau par défaut sera également mis à jour lors de l'installation avec Yum / DNF.

  1. GRUB2

Le fichier de configuration GRUB est essentiellement / etc / grub.conf ou / boot / grub / grub.conf pour GRUB jusqu'à 6 séries, et / etc / grub2.cfg pour GRUB2 après 7 séries. Il est. Cependant, il est différent entre le mode BIOS et le mode UEFI. Surtout dans le cas des serveurs physiques, la plupart d'entre eux sont utilisés par UEFI. Je vais expliquer à ce sujet.

3-1. Fichier de paramétrage GRUB2

Il existe de nombreux fichiers dans GRUB2, et les fichiers suivants sont typiques.

Parmi ceux-ci, / etc / grub2.cfg est référencé lors du changement du noyau par défaut. La procédure générale pour changer le noyau par défaut dans la série 7 est la suivante. La série 8 utilise des saletés.

  1. Affichez la liste des noyaux.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
  1. Définissez le numéro d'entrée du noyau par défaut.
grub2-set-numéro d'entrée par défaut

3. / boot / grub2.cfg est un lien symbolique, donc pour assurer la fiabilité, spécifiez le véritable / boot / grub2 / grub.cfg et reconstruisez.

grub2-mkconfig -o /boot/grub2/grub.cfg

** Conseils </ font> ** 8 series nécessite un fonctionnement avec sale, mais 7 series peut également utiliser sale. Cependant, les anciennes versions peuvent ne pas être disponibles. </ font>

** Attention </ font> ** Pour GRUB jusqu'à 6 séries, modification /boot/grub/grub.conf avec un éditeur pour changer le noyau par défaut. Cependant, dans GRUB2, ne modifiez pas /boot/grub2/grub.cfg à la main. Assurez-vous de le changer en utilisant des commandes telles que grub2-mkconfig et grubby.

3-2. Attention au mode UEFI

En mode BIOS, l'explication jusqu'à présent est bonne, mais en mode UEFI, c'est différent. Généralement, cela est expliqué comme suit, mais le lien symbolique est différent en plus de la substance. expliquer en détail.

** Démarrage du BIOS **: /boot/grub2/grub.cfg ** Démarrage UEFI **: /boot/efi/EFI/*/grub.cfg

3-2-1. Déterminer le mode UEFI

Vous pouvez déterminer si le serveur ou la machine virtuelle que vous utilisez actuellement est en mode UEFI avec la commande suivante. Lorsque j'ai examiné le cloud, AWS et Azure étaient en mode BIOS et Oracle Cloud était en mode UEFI. Je n'ai pas vérifié tous les types d'instances, donc c'est juste pour référence.

En mode UEFI


$ ls -l /sys/firmware/efi
total 0
-r--r--r--.  1 root root 4096 Aug 13 10:00 config_table
drwxr-xr-x.  2 root root    0 Aug 13 09:06 efivars
-r--r--r--.  1 root root 4096 Aug 13 10:00 fw_platform_size
-r--r--r--.  1 root root 4096 Aug 13 10:00 fw_vendor
-r--r--r--.  1 root root 4096 Aug 13 10:00 runtime
drwxr-xr-x.  9 root root    0 Aug 13 10:00 runtime-map
-r--------.  1 root root 4096 Aug 13 10:00 systab
drwxr-xr-x. 29 root root    0 Aug 13 10:00 vars

En mode BIOS


$ ls -l /sys/firmware/efi
ls: cannot access /sys/firmware/efi: No such file or directory

3-2-2. Fichier réel du mode UEFI

Le fichier de configuration en mode UEFI a été introduit sous le nom / boot / efi / EFI / * / grub.cfg. La partie astérisque dépend de la distribution.

Distribution nom de fichier
RHEL /boot/efi/EFI/redhat/grub.cfg
CentOS /boot/efi/EFI/centos/grub.cfg
Oracle Linux /boot/efi/EFI/redhat/grub.cfg
Amazon Linux /boot/efi/EFI/amzn/grub.cfg
Ubuntu /boot/grub/grub.cfg(UEFI/Commun au BIOS)

3-2-3. Relation entre les liens symboliques et les entités

Peut-être que celui qui se confond est le lien symbolique. En mode UEFI, / etc / grub2-efi.cfg a été ajouté.

Mode BIOS


$ ls -l /etc/grub2*
lrwxrwxrwx. 1 root root 22 Sep  3 13:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg

Mode UEFI


$ ls -l /etc/grub2*
lrwxrwxrwx. 1 root root 22 Sep  3 13:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
lrwxrwxrwx. 1 root root 31 Sep  3 13:31 /etc/grub2-efi.cfg -> ../boot/efi/EFI/
centos/grub.cfg

Si vous utilisez un lien symbolique, vous êtes susceptible de le faire. Cependant, / etc / grub2.cfg fait référence à / boot / grub2 / grub.cfg, mais la substance n'existe pas.

$ ls -l /boot/efi/EFI/centos/grub.cfg
-rwx------. 1 root root 10223 Sep  3 13:35 /boot/efi/EFI/centos/grub.cfg
$ ls -l /boot/grub2/grub.cfg ★ n'existe pas
ls: cannot access /boot/grub2/grub.cfg: No such file or directory

Par conséquent, la commande suivante échouera en mode UEFI.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

Il est nécessaire de reconnaître qu'il s'agit de l'UEFI et de spécifier / etc / grub2-efi.cfg ou / boot / efi / EFI / * / grub.cfg.

python


awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2-efi.cfg

3-3. Autres fichiers

Les fichiers suivants, qui n'ont pas été expliqués jusqu'à présent, sont expliqués. Cette fois, le contenu de CentOS 8 est affiché, mais c'est presque le même pour la série 7.

  • /etc/default/grub
  • /boot/grub2/grubenv
  • /etc/sysconfig/kernel

3-3-1. /etc/default/grub Ce fichier contient les paramètres de GRUB2 dans son ensemble. La directive ** GRUB_DEFAULT ** est associée au noyau par défaut. La clé est "** sauvé **".

GRUB_TIMEOUT=5 ★ Affichage de l'heure du menu de sélection du noyau au démarrage
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=sauvé ★ Le nom de la directive utilisée par le noyau par défaut
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

3-3-2. /boot/grub2/grubenv Ce fichier contient les paramètres par défaut du noyau. Puisqu'il a été "** sauvé **" plus tôt, le noyau spécifié par la directive ** saved_entry ** devient le noyau par défaut.

Dans la série RHEL7, "numéro de menu" ou "nom de menu" est défini, mais dans la série RHEL8, "ID + version du noyau" est défini.

Série 7


# GRUB Environment Block
saved_entry=CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)

Série 8


# GRUB Environment Block
saved_entry=0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64
kernelopts=root=/dev/mapper/cl-root ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
boot_success=0
boot_indeterminate=0

Dans la série RHEL8, le fichier de réglage correspondant existe ici. Il s'agit d'une spécification appelée BootLoaderSpecByDefault (BLS).

Série RHEL8 uniquement


# ls /boot/loader/entries/
0aa24a7da6284581821b2215d0757580-0-rescue.conf
0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64.conf
0aa24a7da6284581821b2215d0757580-4.18.0-193.14.2.el8_2.x86_64.conf

3-3-3. /etc/sysconfig/kernel Ce fichier contient des instructions sur la mise à jour du noyau.

# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel-core

** UPDATEDEFAULT ** spécifie s'il faut créer le noyau par défaut lorsque le noyau est mis à jour. Si oui, ce sera le noyau par défaut, mais si non, ce ne sera pas le noyau par défaut.

Par exemple, spécifiez no lorsque vous ne souhaitez pas utiliser un nouveau noyau même si vous installez un noyau supplémentaire avec yum update.

En premier lieu, si vous souhaitez supprimer l'installation du noyau lui-même, vous devez l'exclure dans le fichier de paramètres Yum / DNF comme suit.

shell-session:/etc/yum.conf(/etc/dnf/dnf.conf)


exclude=kernel

Définissez le type de noyau par défaut dans ** DEFAULTKERNEL **. Le noyau normal est kernel et kernel-core, mais le noyau de débogage est kernel-debug. Dans UEK d'Oracle Linux, c'est kernel-uek.

4. Changez le noyau de démarrage

Je vais vous expliquer comment utiliser grub2-reboot, mais j'ai fait un détour. La méthode de changement du noyau par défaut est presque la même, je vais donc l'expliquer ensemble. La procédure principale est la suivante.

  1. Examinez le noyau par défaut
  2. Afficher la liste des noyaux
  3. Définissez le prochain noyau de démarrage (permanent ou temporaire)
  4. Redémarrez

Les commandes pour changer le noyau diffèrent selon la version, donc chacune sera expliquée. Si vous souhaitez utiliser sale même dans la série 7, veuillez consulter l'explication de la série 8.

** Série 7: ** grub2-mkconfig / grub2-set-default ou grubby ** Série 8: ** sale

4-1. Série RHEL7 (non sale)

4-1-1. Vérifiez le noyau par défaut

La valeur par défaut actuelle peut être affichée avec la commande grub2-editenv. La valeur de la directive saved_entry est le noyau par défaut.

# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
# uname -a
Linux hostname 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Mar 17 23:49:17 UTC 2020
 x86_64 x86_64 x86_64 GNU/Linux

4-1-2. Afficher la liste des noyaux

Affichez une liste des noyaux installés. Combiné avec les résultats précédents, le numéro d'index 0 est le noyau par défaut.

** Mode BIOS **

# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

** Mode UEFI **

# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2-efi.cfg

Exemple de sortie


0 : CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1062.18.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-b5a029229fd6464ca40d2e93351d5c5f) 7 (Core)

4-1-3. Changer le noyau par défaut

Dans l'exemple suivant, une version spécifie un noyau d'entrée numéro 1 plus ancien.

  1. Remplacez le noyau par défaut par l'entrée numéro 1.
# grub2-set-default 1
  1. Vous pouvez voir que le noyau par défaut a changé.
# grub2-editenv list
saved_entry=1

4-1-4. Redémarrer

Redémarrez pour que le noyau modifié prenne effet. C'est tout.

# systemctl reboot

4-2. Série RHEL7 / RHEL8 (sale)

4-2-1. Vérifiez le noyau par défaut

grubby peut afficher les noms de fichiers et les index du noyau.

# grubby --default-kernel
/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64
# grubby --default-index
0

4-2-2. Afficher la liste des noyaux

Affichez une liste des noyaux installés. Cet exemple montre également la ligne suivante qui correspond à grep avec l'option -A 2.

# grubby --info=ALL | grep -A 2 index
index=0
kernel="/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=1
kernel="/boot/vmlinuz-4.18.0-147.el8.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
--
index=2
kernel="/boot/vmlinuz-0-rescue-0aa24a7da6284581821b2215d0757580"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"

4-2-3. Changer le noyau par défaut

Pour modifier définitivement le noyau par défaut, utilisez la commande grubby comme suit: Dans cet exemple, un égal (=) est spécifié entre l'option --set-default et la valeur, mais un espace peut être utilisé.

# grubby --set-default=/boot/vmlinuz-4.18.0-147.el8.x86_64

Vous pouvez également spécifier le numéro d'index comme suit.

# grubby --set-default-index=1

Confirmez qu'il a été modifié.

# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64

Vous pouvez utiliser --info pour afficher l'entrée entière pour le noyau spécifié. Dans cet exemple, le nom du fichier du noyau est spécifié, mais l'index peut également être spécifié.

# grubby --info=/boot/vmlinuz-4.18.0-147.el8.x86_64
index=1
kernel="/boot/vmlinuz-4.18.0-147.el8.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv
=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-147.el8.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-147.el8.x86_64) 8 (Core)"
id="0aa24a7da6284581821b2215d0757580-4.18.0-147.el8.x86_64"

4-2-4. Redémarrer

Redémarrez pour que le noyau modifié prenne effet. C'est tout.

# systemctl reboot

4-3. Changer temporairement le noyau

J'ai changé le noyau de façon permanente plus tôt, mais vous ne pouvez changer le noyau qu'au prochain démarrage. Le redémarrage restaurera le noyau d'origine, ce qui est utile pour les objectifs suivants.

  • Je souhaite passer à un autre noyau à des fins de test
  • Je veux utiliser un noyau de débogage
  • Je veux tester les options de démarrage passées au noyau

Utilisez ** grub2-reboot ** pour changer. Spécifiez le numéro de l'entrée de menu (numéro d'index) comme suit.

grub2-reboot 1

Afin de confirmer l'opération, une série d'étapes sera décrite.

  1. La version actuelle du noyau est "4.18.0-147".
# uname -r
4.18.0-147.el8.x86_64
  1. Le noyau par défaut est bien sûr le même.
# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64

# grubby --default-index
1
  1. Utilisez grub2-reboot pour modifier l'index sur "0" uniquement lors du prochain redémarrage.
# grub2-reboot 0
  1. L'index n'a pas changé car le noyau par défaut n'a pas changé.
# grubby --default-index
1
  1. Redémarrez.
# systemctl reboot
  1. Lorsque je me connecte après le redémarrage, le noyau passe à l'index "0".
# uname -r
4.18.0-193.14.2.el8_2.x86_64

# grubby --info=/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64
index=0
kernel="/boot/vmlinuz-4.18.0-193.14.2.el8_2.x86_64"
args="ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-193.14.2.el8_2.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-193.14.2.el8_2.x86_64) 8 (Core)"
id="0aa24a7da6284581821b2215d0757580-4.18.0-193.14.2.el8_2.x86_64"
  1. Redémarrez à nouveau.
# systemctl reboot
  1. Revenir au noyau par défaut. Il a été confirmé que grub2-reboot n'est efficace qu'au prochain redémarrage.
# uname -r
4.18.0-147.el8.x86_64

5. Résumé

  • ** Dans GRUB2 après RHEL7, utilisez une commande pour changer le noyau par défaut. Ne modifiez pas le fichier à la main. ** **
  • ** Le nom du fichier de paramètres GRUB est différent entre le mode BIOS et le mode UEFI. ** **
  • ** Pour changer le noyau par défaut, utilisez grub2-mkconfig / grub2-set-default ou grubby sur la série RHEL7. Grubby est utilisé pour la série RHEL8. ** **
  • ** Vous pouvez utiliser la commande grub2-reboot pour modifier temporairement le noyau uniquement au prochain démarrage. Ces caractéristiques sont utiles dans le cloud et lors des tests où l'accès à la console est difficile. ** **

6. Référence