¿Debo reiniciar después de una actualización de pacman?

Respuestas:

10

Si hay actualizaciones para el kernel, glibc o systemd, es posible que desee reiniciar para que las versiones actualizadas estén en uso. Si tiene, por ejemplo, actualizaciones para su entorno de escritorio, basta con un simple cierre de sesión / inicio de sesión.

schaiba
fuente
11

La mejor manera es encontrar qué programas / servicios usan las bibliotecas antiguas y reiniciarlas. Y puede lograrlo al enumerar todos los archivos usados ​​usando 'lsof' y encontrar aquellos que tienen el tipo 'DEL'. DEL significa que el nombre de archivo se eliminó del sistema de archivos, pero todavía está atascado en la memoria porque alguien lo usa.

Aquí está la línea de comando completa:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
user576557
fuente
2
Después de generar esa lista de servicios y bibliotecas, todavía no está claro qué servicios systemd deben reiniciarse. Por lo tanto, aunque sé qué procesos y bibliotecas necesitan reiniciarse, generalmente no es trivial determinar qué servicios reiniciar en función de esa lista.
bwv549
6

La única razón obligatoria para reiniciar es un nuevo kernel (y puede reiniciar mediante kexec). Ver https://wiki.archlinux.org/index.php/Kexec para más detalles, en resumen:

  • cargar el nuevo kernel, initramfs y especificar el cmdline de arranque

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • invocar kexec(usar systemctlpara el apagado correcto, kexec -ese ejecutaría directamente)

    systemctl kexec
    
  • Tenga en cuenta que si crea una [email protected]como se explica en la wiki, si reinicia, systemdse reiniciará automáticamente utilizando en kexeclugar de reiniciar la BIOS.

Versión un poco mejorada que da nombres de servicio 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

o una línea:

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

Tenga en cuenta que hay algunos problemas:

  • systemctl daemon-reload debe ejecutarse antes de reiniciar cualquier otra cosa
  • si el PID 1 (en systemdsí) necesita reiniciarse, puede hacerse usandosystemctl daemon-reexec
  • systemctl restart dbus.service rompe algunos otros servicios, deben reiniciarse después del reinicio de dbus:
    • systemd sí mismo: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • probablemente otros systemd - * / otros servicios que (en gran medida) usan dbus
  • Si está conectado a través de SSH y SSH necesita reiniciarse, pero systemctl restart sshdno lo reiniciará mientras esté conectado, veo 2 opciones:
    • programar systemctl restart sshdusando at/cron/systemdtemporizadores
    • reiniciar SSHusando otro shell remoto (seguro) comomosh
  • la ejecución screen/tmuxtambién puede bloquear servicios como el SSHreinicio, la forma más fácil es cerrar estas sesiones antes de reiniciar los servicios
  • como se dijo en una respuesta anterior, puede ser necesario cerrar sesión / iniciar sesión, especialmente para sesiones gráficas
Michel Ganguin
fuente
1
¿le importaría mejorar la respuesta que explica cómo se usa kexec?
Rui F Ribeiro
0

Una manera fácil es comparar la versión del núcleo en ejecución con el último núcleo en el disco. Encontré un script que puede hacerlo fácilmente.

Como tengo varios núcleos instalados, modifiqué el script para verificar solo el que corresponde al núcleo en ejecución. Por ejemplo, actualmente tengo instaladas las versiones 4.9.79 y 4.14.16 y, por lo tanto, necesito verificar /boot/vmlinuz-4.14-x86_64. Desafortunadamente, esto no funcionará cuando empiece a usar la versión 5.1, por lo que se necesitará una actualización (reemplazar 4 por 3) o necesito encontrar una forma más sólida.

Aquí está mi guión:

#!/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
fuente