Je viens de mettre à jour mon ubuntu lucid vers natty, pendant la mise à niveau, il a remplacé la plupart des applications en cours d'exécution par une version plus récente.
Comment cela marche-t-il? (Les applications ne plantent-elles pas?) Qu'arrivera-t-il à l'application si un fichier lib a été mis à niveau et qu'une application en cours d'exécution qui recherche une bibliothèque plus ancienne essaie de la charger?
Réponses:
Linux (et d'autres UNIX) établit une distinction entre le nom d'un fichier (le lien ), le fichier lui-même (souvent identifié avec l' inode ) et les poignées ouvertes du fichier. Lorsque vous allez supprimer un fichier, vous appelez l'
unlink()
appel - cela efface le lien vers le fichier (vous pouvez également l'utiliserrename()
pour le remplacer par un autre inode). Cependant, s'il reste des poignées ouvertes vers le fichier (ou d'autres liens - les fichiers peuvent avoir plusieurs liens physiques ), l' inode reste, ainsi que le contenu du fichier, jusqu'à ce que tous les liens et poignées disparaissent.Ainsi, l'exécution de programmes à l'aide de la bibliothèque ou de tout autre élément conserve une poignée vers l'ancienne version (souvent implicitement via un mappage de mémoire), afin qu'elle reste sur le disque. Il n'a tout simplement plus de nom de fichier et sera nettoyé lorsque tous les programmes l'utilisant s'arrêteront (ou au prochain redémarrage, pendant la vérification du système de fichiers ou la relecture du journal).
De plus, notez que les programmes qui attendent «l'ancienne bibliothèque» feront très bien l'affaire avec les nouvelles versions 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 sur mon système est
libc.so.6
. Tout programme compilé avec une ancienne version de libc, mais toujours une version de libc implémentant la version 6 ABI, fonctionnera correctement avec. Les programmes vraiment anciens chercheront unlibc.so.5
oulibc.so.4
ou quelque chose à la place; dans ce cas, vous devez également conserver l'ancienne version - mais comme le nom de fichier est différent, ce n'est pas un problème.la source
Contrairement à Windows, vous pouvez supprimer ou remplacer un fichier ouvert; pour donner une explication simplifiée , les nouvelles demandes de fichiers ouvrent le nouveau fichier, les poignées existantes utilisent le fichier qui existait lors de leur création. 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 de répertoires; celles-ci cessent d'exister, il n'y a aucun pointeur vers elles (fermées et toutes).
Habituellement, une application en cours d'exécution charge les bibliothèques nécessaires à l'avance, de sorte que le problème que vous décrivez ne se produirait que dans des situations de synchronisation très spécifiques pendant l'installation du package: les applications en cours d'exécution utilisent toujours l'ancienne version de la bibliothèque, les applications nouvellement démarrées utilisent la nouvelle une.
Ceci est utilisé non seulement dans les mises à niveau de distribution, mais il se produit à chaque mise à niveau de package (la mise à niveau de dist ajoute simplement quelques étapes automagiques supplémentaires à ce processus).
la source
De nombreux processus Linux continuent de fonctionner après la mise à niveau des packages dont ils sont issus - mais certains ne le font pas. D'après mon expérience, KDE ne fonctionne jamais correctement si vous le mettez à niveau pendant son fonctionnement. Vous risquez de rencontrer des pannes et / ou des échecs de déconnexion.
la source