23 votes

Comment fonctionne la mise à jour des binaires des applications en cours d'exécution lors d'une mise à niveau ?

Je viens de mettre à jour mon ubuntu lucid vers natty , pendant la mise à jour il a remplacé la plupart des la plupart des applications en cours d'exécution par une version plus récente.

Comment cela fonctionne-t-il ? (Les applications ne vont-elles pas se bloquer ?) Que se passera-t-il pour l'application si un fichier de bibliothèque a été mis à jour et qu'une application en cours d'exécution qui recherche une ancienne bibliothèque essaie de la charger ?

32voto

goofdad Points 1723

Linux (et d'autres UNIX) établit une distinction entre les éléments suivants nom d'un fichier (le lien ), le fichier lui-même (souvent identifié par le symbole inode ), et ouvrent des handles vers le fichier. Lorsque vous souhaitez supprimer un fichier, vous appelez la fonction unlink() ce qui a pour effet d'effacer l'appel de lien dans le fichier (vous pouvez également utiliser rename() pour l'écraser avec un inode différent). Cependant, si des handles ouverts vers le fichier (ou d'autres liens - les fichiers peuvent avoir plusieurs liens durs ) subsistent, le inode demeure, de même que le contenu du fichier, jusqu'à ce que tous les liens et les poignées disparaissent.

Les programmes en cours d'exécution qui utilisent la bibliothèque ou autre conservent donc un lien avec l'ancienne version (souvent de manière implicite par le biais d'un mappage mémoire), de sorte qu'elle reste sur le disque. Elle n'a simplement plus de nom de fichier et sera nettoyée lorsque tous les programmes qui l'utilisent s'arrêteront (ou au prochain redémarrage, lors de la vérification du système de fichiers ou de la relecture du journal).

De plus, notez que les programmes qui s'attendent à utiliser l'"ancienne bibliothèque" fonctionneront parfaitement avec les versions plus récentes de la bibliothèque. Les bibliothèques Linux se voient attribuer un nom de fichier ("soname") qui reflète la version de l'ABI (Application Binary Interface) proposée par la bibliothèque. Par exemple, la bibliothèque C de mon système s'appelle libc.so.6 . Tout programme compilé avec une version plus ancienne de libc, mais toujours une version de libc implémentant l'ABI de la version 6, fonctionnera correctement avec elle. Les très vieux programmes chercheront un fichier libc.so.5 ou libc.so.4 ou quelque chose d'autre à la place ; dans ce cas, vous devrez également conserver l'ancienne version - mais comme le nom de fichier est différent, ce n'est pas un problème.

9voto

Ben Straub Points 3224

Contrairement à Windows, vous peut supprimer ou remplacer un fichier ouvert ; donner une simplifié les nouvelles demandes de fichiers ouvrent le nouveau fichier, les poignées existantes utilisent le fichier qui existait lorsqu'elles ont été créées. En d'autres termes, sous Linux, vous pouvez avoir des fichiers/versions de fichiers qui existent toujours, bien qu'il n'y ait plus de pointeur vers eux dans la structure du répertoire ; ceux qui cessent d'exister n'ont plus de pointeur vers eux du tout (fermés et tout).

Habituellement, une application en cours d'exécution charge les bibliothèques nécessaires en amont, de sorte que le problème que vous décrivez ne se produirait que dans des situations très spécifiques pendant l'installation du paquet : les applications en cours d'exécution utilisent toujours l'ancienne version de la bibliothèque, tandis que les applications nouvellement démarrées utilisent la nouvelle.

Cela n'est pas seulement utilisé dans les mises à jour de distro, mais se produit lors de chaque mise à jour de paquet (la mise à jour de distro ajoute simplement quelques étapes automatiques supplémentaires à ce processus).

0voto

Patman Points 180

De nombreux processus Linux continuent de fonctionner après que les paquets dont ils sont issus ont été mis à jour, mais certains ne le font pas. D'après mon expérience, KDE ne fonctionne jamais correctement si vous le mettez à jour alors qu'il est en cours d'exécution. Vous risquez de rencontrer des plantages et/ou des échecs de déconnexion.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X