it-swarm.com.de

Wie funktioniert das Aktualisieren laufender Anwendungsbinärdateien während eines Upgrades?

Ich habe gerade mein Ubuntu Lucid auf Natty aktualisiert. Während des Upgrades wurden die meisten laufenden Anwendungen durch eine neuere Version ersetzt.

Wie funktioniert das? (Werden die Anwendungen nicht abstürzen?) Was passiert mit der Anwendung, wenn eine lib-Datei aktualisiert wurde und eine laufende Anwendung, die nach einer älteren lib sucht, versucht, sie zu laden?

21
srinathhs

Linux (und andere UNIXe) unterscheidet zwischen dem Name einer Datei (dem Link), der Datei selbst (oft mit dem Inode gekennzeichnet) ) und öffnen Sie die Handles für die Datei. Wenn Sie zum Löschen einer Datei gehen, rufen Sie den unlink() -Aufruf auf - dies löscht das Link der Datei (Sie können auch rename() verwenden, um sie mit einem anderen Inode zu überschreiben). . Wenn jedoch offene Handles für die Datei (oder andere Links - Dateien können mehrere Hardlinks) enthalten bleiben, bleibt das Inode erhalten, ebenso wie der Dateiinhalt, bis alle Links und Griffe gehen weg.

Wenn Sie also Programme ausführen, die die Bibliothek verwenden oder was auch immer, behalten Sie die alte Version im Griff (oft implizit über eine Speicherzuordnung), damit sie auf der Festplatte bleibt. Es hat nur keinen Dateinamen mehr und wird bereinigt, wenn alle Programme, die es verwenden, heruntergefahren werden (oder beim nächsten Neustart, während der Dateisystemprüfung oder der Journalwiedergabe).

Beachten Sie außerdem, dass Programme, die die 'alte Bibliothek' erwarten, mit neueren Versionen der Bibliothek problemlos funktionieren. Linux-Bibliotheken wird ein Dateiname ("Soname") zugewiesen, der die Version des von der Bibliothek angebotenen ABI (Application Binary Interface) widerspiegelt. Die C-Bibliothek auf meinem System lautet beispielsweise libc.so.6. Jedes Programm, das mit einer älteren Version von libc kompiliert wurde, jedoch noch eine Version von libc enthält, die das ABI der Version 6 implementiert, funktioniert einwandfrei. Wirklich alte Programme suchen stattdessen nach einem libc.so.5 oder libc.so.4 oder etwas anderem. In diesem Fall müssen Sie auch die alte Version beibehalten. Da sich der Dateiname jedoch unterscheidet, ist dies kein Problem.

29
bdonlan

Im Gegensatz zu Windows können Sie eine geöffnete Datei löschen oder ersetzen . Um eine vereinfachte Erklärung zu geben, öffnen neue Anforderungen für die Dateien die neue Datei. Vorhandene Handles verwenden die Datei, die beim Erstellen vorhanden war. Mit anderen Worten, unter Linux können Dateien/Dateiversionen vorhanden sein, obwohl in der Verzeichnisstruktur kein Zeiger mehr darauf vorhanden ist. Diejenigen, die aufhören zu existieren, gibt es überhaupt keinen Zeiger auf sie (geschlossen und alle).

Normalerweise lädt eine laufende App die benötigten Bibliotheken im Voraus, sodass das von Ihnen beschriebene Problem nur in ganz bestimmten Zeitsituationen auftritt, während das Paket installiert wird: Die laufenden Apps verwenden immer noch die alte Version der Bibliothek, neu gestartete Apps verwenden die neue einer.

Dies wird nicht nur bei Distributions-Upgrades verwendet, sondern tritt auch bei jedem Paket-Upgrade auf (das Distributions-Upgrade fügt diesem Prozess nur ein paar weitere automatische Schritte hinzu).

8
Piskvor

Viele Linux-Prozesse funktionieren weiterhin, nachdem die Pakete, von denen sie stammen, aktualisiert wurden - einige jedoch nicht. Nach meiner Erfahrung funktioniert KDE nicht richtig, wenn Sie es aktualisieren, während es ausgeführt wird. Es ist wahrscheinlich, dass es zu Abstürzen und/oder Fehlern beim Abmelden kommt.

0
Robin Green