web-dev-qa-db-fra.com

Comment puis-je redémarrer très vite?

Il arrive souvent que les utilisateurs d’Ubuntu aient besoin de redémarrer rapidement, par exemple. après une mise à jour du noyau ou lors du test de certains paramètres nécessitant un redémarrage.

J'aimerais disposer d'une méthode (un script, par exemple) qui me permette de gagner le plus de temps possible lors du redémarrage.

Ce sont des choses qui peuvent probablement être évitées pour réduire le temps de redémarrage jusqu'à ce que la session utilisateur soit prête:

  • si possible, ignorez l'initialisation du BIOS/UEFI/firmware et le POST
  • ignorer le menu GRUB (présélectionnez une fois l'entrée souhaitée et démarrez-la directement sans délai d'expiration)
  • ignorer l'écran de connexion (utilisez une fois la connexion automatique sans mot de passe)

Peut-être y a-t-il encore plus de choses qui pourraient être ignorées pour un redémarrage rapide.

J'ai vu les spécifications RapidReboot dans le wiki d'Ubuntu, mais la page a été modifiée pour la dernière fois le 2010-02-03.

Toutefois, même si nous ne sommes peut-être pas encore en mesure d'utiliser cette procédure décrite kexec pour ignorer l'initialisation du firmware et autres éléments, il est possible de présélectionner temporairement l'entrée GRUB et d'utiliser la connexion automatique pour un redémarrage précis. Comment puis-je configurer cela?

J'utilise Ubuntu 16.04, 64 bits avec Unity DE, lightdm et GRUB en double amorçage avec Windows 10 (et bientôt avec d'autres distributions Linux) sur une machine Acer Aspire E5-773G avec UEFI.

6
Byte Commander

Temps de redémarrage

Nous pouvons retarder parfois le redémarrage dans ce monde de "trop ​​occupé" et de ne pas vouloir perdre 5 ou 15 secondes. Lorsque j’ai examiné cette question pour la première fois, le temps de démarrage de mon disque dur SSD et de systemd était passé de 45 à 14 secondes.

Récemment, j'ai acheté un ordinateur portable "moderne" équipé d'un SSD NVMe M.2 Gen 3.0 x 4 avec une vitesse de lecture Windows de 3,4 Go/s et d'une vitesse de lecture Linux de 2 Go/s. Donc ça devrait être plus rapide non? Um non. C'est douloureusement plus lent:

$ systemd-analyze
Startup finished in 6.823s (firmware) + 4.447s (loader) + 3.467s (kernel) + 8.412s (userspace) = 23.151s

Cette heure est en fait après peaufiner. 80 secondes étaient bien pires parce que nVidia et Dell ont choisi de couper l’alimentation audio HDMI sur la carte graphique nVidia GTX970M qui pilote le port HDMI. En tant que telle, une commande setpci était requise, ce qui entraînait le message "erreur d'erreur grave" et vous deviez attendre 20 secondes pour que le pointeur de la souris continue. Ensuite, il rechargerait tous les pilotes graphiques et redémarrer lightdm.

Le BIOS POST était un autre problème avec l'ordinateur portable "moderne", prenant 15 secondes. Modifications dans le BIOS pour désactiver la vérification des erreurs matérielles, désactiver le chargement des pilotes d'amorçage pour les cartes réseau et autres modifications dont je ne me souviens plus, vient de changer le BIOS POST fois à 6 secondes. Par comparaison, le "vieux" BIOS pour ordinateur portable POST ne prenait que quelques secondes avec Legacy BIOS CSM et ne nécessitait aucun ajustement du BIOS.


Projet Ubuntu RapidReboot de 2010

La mention du projet Ubuntu RapidReboot dans le post de ByteCommander date de 2010. La justification du projet se résume ainsi:

Raisonnement

Il existe quelques cas où nous pouvons supposer en toute sécurité que l'utilisateur ne veut pas voir le chargeur de démarrage; Dans ces cas, nous devrions utiliser kexec pour éviter les longs redémarrages, les POST du BIOS et le temps du chargeur de démarrage. Cela peut prendre 10 secondes dans des situations optimales. mais avec le BIOS SCSI ou RAID et les roms de démarrage réseau, le temps peut atteindre 20, 30 voire même 60 secondes, même dans les cas où le temps entre le chargement du noyau et l'affichage de l'écran de connexion est de 30 à 60 secondes.

Exemples d'utilisation du projet:

Cas d'utilisation

  • Bob vient de mettre à jour son noyau; update-notifier l'informe qu'il doit redémarrer pour que les modifications prennent effet, et le bouton 'Redémarrer' utilise kexec pour accélérer le processus.
  • Alice vient de mettre à niveau dbus; update-notifier lui dit de redémarrer et utilise kexec.
  • Seveas a effectué plusieurs mises à jour au cours du dernier mois et sa pression de mémoire est maintenant trois fois plus importante du fait que différents programmes utilisent différentes copies de bibliothèques partagées. Il décide de redémarrer pour résoudre le problème et utilise un "redémarrage rapide" pour accélérer le processus.
  • Keybuk vient d'installer Ubuntu Edgy et veut démarrer dessus. Le LiveCD charge le noyau cible et initrd avec kexec; monte tous les systèmes de fichiers sur disque; sync; et utilise ensuite kexec pour démarrer le nouveau système plutôt que de le redémarrer.

Utiliser kexec pour redémarrer

kexec est le sortilège que nous lançons pour redémarrer sans post BIOS et autres mécanismes de découverte bas niveau tels que la configuration RAID.

Le noyau doit être compilé avec le drapeau CONFIG_KEXEC

La première étape consiste à vous assurer que votre noyau a été compilé avec l'option CONFIG_KEXEC=y:

$ uname -r
4.14.2-041402-generic
$ grep KEXEC= /boot/config-`uname -r`
CONFIG_KEXEC=y

La première commande uname -r est facultative pour montrer le noyau avec lequel vous avez démarré. Comme nous pouvons le voir sur la deuxième commande, le noyau est compilé par l'équipe Ubuntu avec le jeu d'indicateurs nécessaire. Je ne sais pas quand cela a été ajouté, mais probablement <= année 2012.

Installer kexec-tools

L'étape suivante consiste à installer les outils kexec pour l'espace utilisateur:

$Sudo apt install kexec-tools

Après les téléchargements binaires normaux, cet écran vous accueille:

kexec-tools install.png

J'ai répondu à No en partie à cause de ce rapport de bogue indiquant que l'option n'est pas pertinente dans systemd.

Ensuite, l'installation continue (extrait ci-dessous):

Unpacking kexec-tools (1:2.0.10-1ubuntu2.4) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for systemd (229-4ubuntu21) ...
Setting up kexec-tools (1:2.0.10-1ubuntu2.4) ...
Generating /etc/default/kexec...
Generating grub configuration file ...
  (... CUT ...)
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Windows Boot Manager on /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done
Processing triggers for systemd (229-4ubuntu21) ...

Configuration de kexec

Nos cohortes chez ArchLinux ont bonne documentation pour kexec mais il faut masser pour les distributions Ubuntu/Debian.

L'utilisation de base sont avec deux commandes:

Sudo kexec -l /boot/vmlinuz-`uname -r` --initrd=/boot/initrd.img-`uname -r` --reuse-cmdline
Sudo kexec -e

à partir de ce moment, il apparaît chaque fois que vous cliquez sur redémarrer. Il recharge automatiquement le dernier noyau en mode de redémarrage rapide.

Utiliser Systemd pour charger kexec

Créez le fichier /etc/systemd/system/[email protected]:

[Unit]
Description=load %i kernel into the current kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initrd.img-%i --reuse-cmdline

[Install]
WantedBy=kexec.target

Activez ensuite le fichier de service pour le noyau que vous voulez charger, par exemple pour définir simplement le noyau actuel uname -r:

$ Sudo systemctl enable kexec-load@`uname -r`
Created symlink from /etc/systemd/system/kexec.target.wants/[email protected] to /etc/systemd/system/[email protected].

Puis à kexec:

$ Sudo systemctl kexec

Si vous avez youtube en cours d'exécution, un inhibiteur système pourrait vous empêcher de redémarrer. Dans ce cas, utilisez:

$ Sudo systemctl kexec -i

Si vous souhaitez charger un noyau différent pour le prochain kexec, par exemple 4.12.2-041202-generic, désactivez le service pour le noyau actuel et activez celui du nouveau noyau:

$ Sudo systemctl disable kexec-load@`uname -r`
$ Sudo systemctl enable [email protected]

Plus à venir

Je dois poster cette réponse maintenant car il est temps de démarrer, corriger, démarrer, corriger, répéter. J'ai une configuration compliquée où systemd charge cinq pilotes nVidia que je dois décharger, exécuter setpci pour activer l'audio sur HDMI, recharger les pilotes nVidia et redémarrer lightdm. Il faudra peut-être un moment pour y arriver.

Après avoir utilisé les méthodes cli, je vais créer un raccourci sur le bureau pour redémarrer en un clic avec Sudo invite de mot de passe. Après cela, je créerai un raccourci sur le bureau vers une boîte de dialogue yad vous permettant de choisir parmi les noyaux installés pour le redémarrage. Semblable au menu des options avancées de grub.

2
WinEunuuchs2Unix