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?
Antworten:
Unter Linux (und anderen UNIX-Betriebssystemen) wird zwischen dem Namen einer Datei (dem Link ), der Datei selbst (häufig mit dem Inode gekennzeichnet ) und offenen Handles für die Datei unterschieden. Wenn Sie eine Datei löschen, rufen Sie den
unlink()
Anruf auf. Dadurch wird die Verknüpfung mit der Datei gelöscht (Sie können sie auchrename()
mit einem anderen Inode überschreiben). Wenn jedoch offene Handles für die Datei (oder andere Links - Dateien können mehrere Hardlinks haben ) verbleiben, bleibt der Inode erhalten , ebenso wie der Dateiinhalt, bis alle Links und Handles verschwinden.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. Zum Beispiel ist die C-Bibliothek auf meinem System
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 einemlibc.so.5
oderlibc.so.4
oder etwas; In diesem Fall müssen Sie auch die alte Version beibehalten. Da sich der Dateiname jedoch unterscheidet, ist dies kein Problem.quelle
Im Gegensatz zu Windows, Sie können löschen oder eine geöffnete Datei ersetzen; Um die Erklärung zu vereinfachen , ö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 eins.
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).
quelle
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.
quelle