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

23

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?

Srinathhs
quelle
Gute Frage, aber wahrscheinlich besser hier gefragt: unix.stackexchange.com (Ich weiß, die URL sagt Unix, aber sie stellen auch Linux-Fragen!)
Das Verständnis der Funktion zum Ersetzen während des
Öffnens
2
@bdonlan: Wenn Sie Bibliotheken während der Lebensdauer Ihres Prozesses dynamisch laden, sollten Sie sich dessen sehr bewusst sein, da Sie sonst möglicherweise beißen. Dies ist besonders wichtig, wenn Sie versuchen, etwas Ungewöhnliches zu tun, z. B. sich selbst ändernden Code usw. Aber ja, es ist grenzwertig.
Piskvor
1
Es ist nicht wirklich relevant für sich selbst ändernden Code, aber es ist sicherlich etwas, das jemand wissen sollte, der Bibliotheken für Linux schreibt, ja. :)
bdonlan
1
@Piskvor, klingt ein bisschen wie der mehrstufige Kompilierungsprozess für gcc :) Aber im Grunde tun nur Compiler so etwas, und normalerweise würden Sie das System nicht aktualisieren, während Sie es tun (selbst wenn Sie es tun, solange Sie es tun) ‚t Herabstufung etwas , während es in Prozess ist, du ist in Ordnung, da es seine privat zusammengestellt Kopien von etwas würde mit , wo es darauf ankommt)
bdonlan

Antworten:

31

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 auch rename()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 einem libc.so.5oder libc.so.4oder etwas; In diesem Fall müssen Sie auch die alte Version beibehalten. Da sich der Dateiname jedoch unterscheidet, ist dies kein Problem.

bdonlan
quelle
9

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

Piskvor
quelle
0

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.

Robin Green
quelle