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.
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 **
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.
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.
Il existe de nombreux fichiers dans GRUB2, et les fichiers suivants sont typiques.
/etc/grub2.cfg
/boot/grub2/grub.cfg
/boot/loader/entries/*
/boot/grub2/grubenv
/etc/default/grub
/etc/sysconfig/kernel
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.
python
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
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.
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
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
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) |
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
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.
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.
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.
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
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
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)
Dans l'exemple suivant, une version spécifie un noyau d'entrée numéro 1 plus ancien.
# grub2-set-default 1
# grub2-editenv list
saved_entry=1
Redémarrez pour que le noyau modifié prenne effet. C'est tout.
# systemctl reboot
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
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"
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"
Redémarrez pour que le noyau modifié prenne effet. C'est tout.
# systemctl reboot
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.
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.
# uname -r
4.18.0-147.el8.x86_64
# grubby --default-kernel
/boot/vmlinuz-4.18.0-147.el8.x86_64
# grubby --default-index
1
# grub2-reboot 0
# grubby --default-index
1
# systemctl reboot
# 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"
# systemctl reboot
# uname -r
4.18.0-147.el8.x86_64