Dois-je redémarrer après une mise à niveau de pacman?

17

après avoir couru

sudo pacman -Syyu

ou

sudo pacman -S [something to install]

dois-je redémarrer juste pour être en sécurité?

ahtmatrix
la source

Réponses:

10

S'il existe des mises à jour du noyau, de la glibc ou de systemd, vous souhaiterez peut-être redémarrer afin que les versions mises à jour soient utilisées. Si vous avez, par exemple, des mises à jour de votre environnement de bureau, une simple déconnexion / connexion suffit.

Schaiba
la source
11

La meilleure façon est de trouver quels programmes / services utilisent les anciennes bibliothèques et de les redémarrer. Et vous pouvez y parvenir en listant tous les fichiers utilisés en utilisant 'lsof' et en trouvant ceux qui ont le type 'DEL'. DEL signifie que le nom de fichier a été supprimé du système de fichiers mais il est toujours bloqué en mémoire car quelqu'un l'utilise.

Voici la ligne de commande complète:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
user576557
la source
2
Après avoir généré cette liste de services et de bibliothèques, il n'est toujours pas clair quels services systemd doivent être redémarrés. Par conséquent, même si je sais quels processus et bibliothèques ont besoin d'un redémarrage, il n'est généralement pas trivial de déterminer les services à redémarrer en fonction de cette liste.
bwv549
6

La seule raison obligatoire de redémarrer est un nouveau noyau (et vous pouvez redémarrer en douceur en utilisant kexec). Voir https://wiki.archlinux.org/index.php/Kexec pour plus de détails, en bref:

  • charger le nouveau noyau, initramfs et spécifier la cmdline de démarrage

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • invoke kexec(à utiliser systemctlpour un arrêt correct, kexec -es'exécuterait directement)

    systemctl kexec
    
  • Notez que si vous créez un [email protected]comme expliqué dans le wiki, si vous redémarrez, il redémarrera systemdautomatiquement en utilisant à la kexecplace de faire un redémarrage du BIOS

Version légèrement améliorée qui donne des noms de service systemd:

PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
    systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u

ou une ligne:

for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u

Notez qu'il y a quelques problèmes:

  • systemctl daemon-reload doit être exécuté avant de redémarrer autre chose
  • si PID 1 ( systemdlui-même) doit être redémarré, cela peut être fait en utilisantsystemctl daemon-reexec
  • systemctl restart dbus.service interrompt certains autres services, ils doivent être redémarrés après le redémarrage du dbus:
    • systemd lui-même: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • probablement d'autres systemd - * / autres services qui utilisent (fortement) dbus
  • Si vous êtes connecté via SSH et que SSH doit être redémarré, mais systemctl restart sshdne le redémarrera pas tant que vous serez connecté, je vois 2 options:
    • planifier à l' systemctl restart sshdaide de at/cron/systemdminuteries
    • redémarrer à l' SSHaide d'un autre shell distant (sécurisé) tel quemosh
  • l'exécution screen/tmuxpeut également bloquer des services comme le SSHredémarrage, la manière la plus simple est de fermer ces sessions avant de redémarrer les services
  • comme indiqué dans une réponse précédente, la déconnexion / connexion peut être nécessaire, en particulier pour les sessions graphiques
Michel Ganguin
la source
1
Pourriez-vous améliorer la réponse en expliquant comment kexec est utilisé?
Rui F Ribeiro
0

Un moyen simple consiste à comparer la version du noyau en cours d'exécution au dernier noyau sur le disque. J'ai trouvé un script qui peut le faire facilement.

Comme j'ai plusieurs noyaux installés, j'ai modifié le script pour ne vérifier que celui correspondant au noyau en cours d'exécution. Par exemple, j'ai actuellement les versions 4.9.79 et 4.14.16 installées et j'ai donc besoin de vérifier /boot/vmlinuz-4.14-x86_64. Malheureusement, cela ne fonctionnera pas lorsque je commencerai à utiliser la version 5.1, donc une mise à jour sera nécessaire (remplacer 4 par 3) ou je dois trouver un moyen plus robuste.

Voici mon script:

#!/bin/sh
NEXTLINE=0
FIND=""
CURRENT_KERNEL=`uname -r`
KERNEL_PATH="/boot/vmlinuz-${CURRENT_KERNEL:0:4}"
for I in `file $KERNEL_PATH*`; do
  if [ ${NEXTLINE} -eq 1 ]; then
    FIND="${I}"
    NEXTLINE=0
   else
    if [ "${I}" = "version" ]; then NEXTLINE=1; fi
  fi
done
    if [ ! "${FIND}" = "" ]; then
      if [ ! "${CURRENT_KERNEL}" = "${FIND}" ]; then
    echo "Boot required"
  else echo "No boot required"
  fi
fi
Aurelien
la source