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

23

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?

srinathhs
la source
Bonne question, mais probablement mieux posée ici: unix.stackexchange.com (je sais que l'URL indique Unix mais ils répondent également aux questions Linux!)
Comprendre la fonctionnalité de remplacement pendant l'ouverture de Linux semble être encore en cours de programmation (mais à peine :)
bdonlan
2
@bdonlan: Si vous chargez dynamiquement des bibliothèques pendant la durée de vie de votre processus, vous devez en être très conscient, sinon cela pourrait vous mordre. Ceci est particulièrement important si vous essayez de faire quelque chose d'inhabituel, par exemple du code auto-modifiable, etc. Mais oui, c'est limite.
Piskvor
1
Ce n'est pas vraiment pertinent pour le code auto-modifiable, mais c'est certainement quelque chose que quelqu'un qui écrit des bibliothèques pour linux devrait savoir, oui. :)
bdonlan
1
@Piskvor, ressemble un peu au processus de compilation en plusieurs étapes pour gcc :) Mais en gros, seuls les compilateurs font quelque chose comme ça, et généralement vous ne mettriez pas à niveau le système pendant que vous le faites (même si vous le faites, tant que vous ne le faites pas) ne rétrogradez rien pendant qu'il est en cours, vous allez bien, car il utilisera ses copies compilées en privé de tout ce qui importe)
bdonlan

Réponses:

31

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'utiliser rename()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 un libc.so.5ou libc.so.4ou 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.

bdonlan
la source
9

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).

Piskvor
la source
0

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.

Robin Green
la source