Latence du noyau au démarrage

Résolu
lenainjaune Messages postés 691 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 6 janvier 2025 - Modifié le 20 déc. 2024 à 18:37
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 - 8 janv. 2025 à 15:54

Bonjour à tou.te.s :D !

Récemment j'ai ouvert le fil suivant : Convertir partition depuis support GPT en MBR pour isoler en p2v un système Debian problématique sur une machine physique afin de l'éprouver en machine virtuelle (ici avec Qemu/KVM/libvirt).

J'avais presque mené à terme ce projet, mais il restait un problème de latence au démarrage que je viens de résoudre.

=> célébration, problème résolu :D !

Je propose de vous faire un retour ici.

----

Au démarrage il y avait environ 30s où il ne se passait rien. Le curseur blanc clignotait sur fond noir. Juste après venaient toutes les écritures ininterrompues de systemd avant d'arriver sur l'accueillant.

J'ai fait un audit sur l'activité après amorçage et j'ai constaté que c'était le noyau qui générait cette latence.
 

$ systemd-analyze
Startup finished in 33.781s (kernel) + 4.069s (userspace) = 37.851s 
graphical.target reached after 4.040s in userspace.

$ systemd-analyze plot > analyse.svg

J'avais ouvert le fichier SVG généré (ristretto sait le faire) et sans zoom, on voyait une longue barre en gris en haut de 33s ...

Résultat analyse - haut de l'analyse sans zoom

... et on pouvait constater que cette barre était relative au noyau :

Résultat analyse - zoom sur le début en haut à gauche

J'ai alors demandé à @mamiemando de l'aide pour révéler l'activité du noyau (voir dans le fil dessus) mais les propositions simples n'ont pas abouties.

Remarque : le fameux "RTFM" ne m'a pas beaucoup aidé jusqu'à présent car quand je me lance dans la lecture d'un manuel (man, info, help), je me sens noyé dans sa compréhension, le sens des phrases et souvent je ne comprends pas ou je mésinterprête (j'ai un multi-handicap sensoriel et mnésique). Pour moi ces rédacteurs s'adressent uniquement à des personnes qui les comprennent et rarement je les comprends. De fait, je suis contraint de rechercher différentes documentations et approches, pour mieux cerner les tenants et les aboutissants. C'est aussi pour ça que je ne me réfère pas à ces manuels pour sourcer mes démarches.

Après m'être documenté sur l'analyse du démarrage Linux (Analyze Linux startup performance), j'ai vu qu'il y avait un prérequis (Understanding systemd at startup on Linux) que j'ai également parcouru et à la rubrique Exploring Linux startup with systemd il était question de modifier le fichier grub.cfg pour enlever la directive quiet de manière à afficher les messages d'amorçage ce qui m'a fait réaliser qu'ils pouvaient être cachés par défaut et que je ne me souciais pas du fait qu'il y avait dans les distributions actuelles, cette pratique de cacher ces messages.

Je l'ai donc supprimé de /etc/default/grub et ai appliqué la modification avec update-grub.

Au prochain amorçage, j'ai vu que l'écran était d'avantage verbeux avant les affichages de systemd et qu'il bloquait sur une action qui se répétait : "running /scripts/local-block"

Cette page Solving the Running /scripts/local-block loop while booting in Linux a mis en évidence le problème : l'amorçage Linux a besoin de connaître l'identifiant unique (UUID) du fichier d'échange (mémoire SWAP) qu'il essaye de monter

Ça a fait tilt dans ma tête ! Le SWAP du disque GPT était dans une partition dédiée (et non dans un fichier du système) qui n'avait pas été clonée. J'avais bien supprimé son montage depuis /etc/fstab (je rappelle que le SWAP n'est pas obligatoire, surtout en virtualisation), mais je m'étais arrêté là.

Attention : à partir d'ici, je ne suis pas sûr de tout comprendre, donc si des experts passent par là, n'hésitez pas à corriger ...

En effet, depuis /etc/initramfs-tools/conf.d/resume (de mémoire, qui sert entre autre pour la veille), il y avait bien un lien vers le SWAP, je l'ai alors désactivé en commentant la ligne (la précéder par #).

Dans mon cas, une fois modifiée :

$ cat /etc/initramfs-tools/conf.d/resume
#RESUME=UUID=80f3d2a0-e416-49d1-b5d9-1dd5fb089e22

Mais ce n'était pas tout, après le chargement du noyau, le SWAP est aussi utilisé par l'archive initrd.img qui charge le système de fichier initramfs permettant de monter le système de fichiers racine (source et aussi ici).

Comme le lien vers le SWAP est intégré "en dur" dans l'archive, il faut mettre à jour pour la régénérer :

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.1.0-23-amd64

Note : cette mise à jour est entre autre impactée par le fichier resume indiqué dessus, j'ai pu le constater car en réactivant la ligne et en remettant à jour, j'ai pu constater le problème initial

=> il n'y a désormais pas cette latence de 30s au démarrage :D

En espérant que ça puisse servir à d'autres ...

Avec adelphité,

lnj


Linux / Firefox 115.0


A voir également:

1 réponse

mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
Modifié le 6 janv. 2025 à 15:45

Bonjour,

Merci pour ce retour très intéressant. Le fait que le noyau soit perdu a cause de cette histoire de swap n'est pas surprenant, puisque cette dernière est utilisée lors d'une mise en hibernation sur le disque dur. A vrai dire, ça m'étonne que le système parvienne à démarrer (il faut croire qu'un timeout a été prévu quand la récupération d'un système hiberné échoue) !

Ensuite, si je comprends bien tes explications, réactiver la prise en charge de l'hibernation te ramène a ton problème initial. Si c'est bien le cas, je suspecte qu'il réside encore aujourd'hui dans ta swap une ancienne hibernation. Pour s'en débarrasser, tu pourrais reformater ta partition swap.

Si tu veux le faire, commence par retrouver le device concerné à l'aide de sudo fdisk -l

(mando@velvet) (~) $ sudo fdisk -l
[sudo] Mot de passe de mando : 
Disque /dev/nvme0n1 : 476,94 GiB, 512110190592 octets, 1000215216 secteurs
Modèle de disque : SAMSUNG MZVLW512HMJP-00000              
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : gpt
Identifiant de disque : CCA34840-4481-48C5-B59B-5DA342615950

Périphérique       Début        Fin  Secteurs Taille Type
/dev/nvme0n1p1      2048    1087487   1085440   530M Environnement de récupération Windows
/dev/nvme0n1p2   1087488    1619967    532480   260M Système EFI
/dev/nvme0n1p3   1619968    1882111    262144   128M Réservé Microsoft
/dev/nvme0n1p4   1882112  281618431 279736320 133,4G Données de base Microsoft
/dev/nvme0n1p5 998418432 1000212479   1794048   876M Environnement de récupération Windows
/dev/nvme0n1p6 281618432  289431551   7813120   3,7G Partition d'échange Linux
/dev/nvme0n1p7 289431552  387088383  97656832  46,6G Système de fichiers Linux
/dev/nvme0n1p8 387088384  998418431 611330048 291,5G Système de fichiers Linux

Les entrées de la table de partitions ne sont pas dans l'ordre du disque.

(dans cet exemple /dev/nvme0n1p6)

Tu peux alors désactiver la swap, la reformater, et la réactiver. Si on suit cet exemple (attention, veille à utiliser le bon device car si tu le fais sur une partition de disque dur, tu perdras ses données !!!)

swapoff /dev/nvme0n1p6
mkswap /dev/nvme0n1p6
swapon /dev/nvme0n1p6

Peut-être qu'ainsi au redémarrage, la swap étant vidée, ton noyau ne tenterait pas de restaurer une hibernation passée bancale.

Bonne chance et tous mes meilleurs vœux ;-)

0
lenainjaune Messages postés 691 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 6 janvier 2025 56
Modifié le 6 janv. 2025 à 16:44

Ensuite, si je comprends bien tes explications, réactiver la prise en charge de l'hibernation te ramène a ton problème initial. Si c'est bien le cas, je suspecte qu'il réside encore aujourd'hui dans ta swap une ancienne hibernation. Pour s'en débarrasser, tu pourrais reformater ta partition swap.

C'est surtout que la dite partition de SWAP est inexistante ... Je rappelle que j'ai juste fait une copie fichier (rsync) du contenu de la partition du support GPT donc sans la partition SWAP.

Mais merci beaucoup pour la démarche pour refaire le SWAP.

Du coup je peux (enfin) estampiller en résolu ;D

A toi aussi une très belle année 2025 (que j'espère meilleure que 2024) :D

0
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813 > lenainjaune Messages postés 691 Date d'inscription mercredi 7 mai 2008 Statut Contributeur Dernière intervention 6 janvier 2025
8 janv. 2025 à 15:18

C'est surtout que la dite partition de SWAP est inexistante ... Je rappelle que j'ai juste fait une copie fichier (rsync) du contenu de la partition du support GPT donc sans la partition SWAP.

D'accord merci pour la précision. En fait peu importe qu'elle soit mal référencée ou carrément inexistante, le problème de fond est que le noyau ne la trouve pas. Merci beaucoup pour tous ces explications et félicitations pour avoir trouvé la solution. 

A toi aussi une très belle année 2025 (que j'espère meilleure que 2024) :D

J'espère aussi :D

0
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813 > mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025
Modifié le 8 janv. 2025 à 15:55
  • Je profite de ce message pour signaler que reformater la swap (avec mkswap) change son UUID, référencé dans /etc/fstab, et utilisé au moment de (ré)générer l'image du noyau (avec update-initramfs).
  • Si la swap est incorrecte dans /etc/fstab, j'en ai fait l'amère expérience, le système prend 1min30 supplémentaires.
    • Si le système démarre en mode recovery, on le verra typiquement en train de patienter sur la tâche "A start job is running for dev-disk-by...."
    • Sinon, ce message ne sera pas affiché, et on aura l'impression que le système bloque sur autre chose qui n'a rien à voir (dans mon cas, lors de l'initialisation du bluetooth !)
  • Pour résoudre le problème, il faut, comme évoqué plus haut :
    • Récupérer le device associé à la partition swap (/dev/nvme0n1p6 dans l'exemple fourni dans #1)
    • Récupérer l'UUID correspondant : 
      ls -l /dev/disk/by-uuid/ | grep nvme0n1p6

      Dans mon cas cette commande a retourné : 

      lrwxrwxrwx 1 root root 15  8 janv. 15:45 77822326-b1ac-47e5-9b4f-492da91bc47e -> ../../nvme0n1p6
      

      donc UUID est 77822326-b1ac-47e5-9b4f-492da91bc47e

    • Corriger /etc/fstab avec des droits root (éventuellement via sudo), et corriger la ligne qui correspond à la swap (sans toucher aux autres lignes). Dans mon cas, la ligne corrigée devient donc : 

      # swap was on /dev/nvme0n1p6 during installation
      UUID=77822326-b1ac-47e5-9b4f-492da91bc47e none swap sw 0 0
    • Sauver /etc/fstab, puis régénérer l'image du noyau : 
      sudo update-initramfs -u
    • Redémarrer
1