Warum ist die Aktualisierung eines laufenden Linux-Systems nicht problematisch?

25

Es ist Jahre her, dass ich täglich Linux-Systeme benutze, und ich hatte nie größere Probleme, ein laufendes System zu aktualisieren, aber ich frage mich immer noch, warum dies möglich ist.

Lassen Sie mich ein Beispiel geben.

Angenommen, ein Programm "A" aus einem bestimmten Paket wird auf einem System ausgeführt. Dieses Programm muss zu einem bestimmten Zeitpunkt eine andere Datei ("B") aus demselben Paket öffnen. Danach schließt Programm "A" "B", weil es es nicht mehr benötigt. Angenommen, ich aktualisiere jetzt das Paket, zu dem "A" und "B" gehören. "A" ist zumindest vorerst nicht direkt von diesen Vorgängen betroffen, da es im RAM ausgeführt wird und das Update gerade "A" auf der Festplatte ersetzt hat. Angenommen, "B" wurde auch im Dateisystem ersetzt. Jetzt muss "A" aus irgendeinem Grund wieder "B" lesen. Die Frage ist: Ist es möglich, dass "A" eine inkompatible Version von "B" findet und auf andere Weise abstürzt oder nicht funktioniert?

Warum aktualisiert niemand seine Systeme durch einen Neustart mit einer Live-CD oder einem ähnlichen Verfahren?

Francesco Turco
quelle
Ich tendiere dazu, solche Aktualisierungen zu vermeiden, nicht wegen der Mechanismen der Aktualisierung (dies kann einfach in Ordnung gebracht werden), sondern weil ich meine Anwendungen und Konfiguration lieber zuerst anhand der Änderungen testen möchte. Dann hätte ich ein separates, jetzt aktualisiertes System, auf das ich einfach umsteigen kann. Abgesehen davon ist ein Update im Userland im Allgemeinen kein Problem, und für kleine oder Sicherheitslücken würde ich es einfach tun.
Skaperen

Antworten:

23

Das Aktualisieren von Userland ist selten ein Problem

Sie können Pakete auf einem Live-System häufig aktualisieren, weil:

  1. Freigegebene Bibliotheken werden im Arbeitsspeicher gespeichert und nicht bei jedem Aufruf von der Festplatte gelesen, sodass die alten Versionen verwendet werden, bis die Anwendung neu gestartet wird.
  2. Geöffnete Dateien werden tatsächlich aus den Dateideskriptoren gelesen , nicht aus den Dateinamen, sodass der Dateiinhalt auch dann für die ausgeführten Anwendungen verfügbar bleibt, wenn sie verschoben, umbenannt oder gelöscht werden, bis die Sektoren überschrieben oder die Dateideskriptoren geschlossen werden.
  3. Pakete, die neu geladen oder neu gestartet werden müssen, werden normalerweise vom Paketmanager ordnungsgemäß behandelt, wenn das Paket ordnungsgemäß entworfen wurde. Beispielsweise wird Debian bestimmte Dienste neu starten, wenn libc6 aktualisiert wird.

Wenn Sie Ihren Kernel nicht aktualisieren und ksplice nicht verwenden, müssen Programme oder Dienste möglicherweise neu gestartet werden, um die Vorteile eines Updates zu nutzen. Es ist jedoch selten erforderlich, ein System neu zu starten, um ein Update im Benutzerland durchzuführen, obwohl es auf Desktops gelegentlich einfacher ist, einzelne Dienste neu zu starten.

Siehe auch

http://en.wikipedia.org/wiki/Ring_%28computer_security%29#Supervisor_mode

CodeGnome
quelle
Aber was passiert, wenn Sie den gesamten Cache-Speicher benötigen? In diesem Fall müssen die Share-Libraries erneut von der Festplatte geladen werden ...
Nils
3
Tatsächlich war die Beschreibung von Nr. 1 nicht so klar. Der Inhalt der alten Bibliotheksdatei bleibt unter einem separaten (ursprünglichen) Inode, auch wenn alle damit verknüpften Namen verschwunden sind. Solange ein Prozess die Datei geöffnet oder ihr Inhalt zugeordnet hat, bleiben die Daten eindeutig (und das Dateisystem nicht) wieder eingehängt werden, bis die Verknüpfung der Datei beendet ist). Der Prozess, der die ursprüngliche Datei zugeordnet hat, verfügt weiterhin über Speicherzuordnungen zum ursprünglichen Inhalt.
Skaperen
@Nils Ich bin kein Experte, aber wenn Ihnen der Cache ausgeht, wäre es dann nicht geschrieben, von dort aus zu tauschen und erneut zu lesen? Wenn dies voll wäre, würde wahrscheinlich ein Prozess blockiert, bevor der Speicher eines anderen Prozesses, der ihn bereits verwendet, entzogen werden könnte.
Joe
@ Joe nein - Swap ist auch RAM. Skaperen beschreibt, was passiert: Das Datei-Handle wird intakt gehalten. Das Programm hat also im Grunde genommen eine One-Hadle-Bibliothek zur alten (nicht mehr vorhandenen) Bibliothek, die erst gelöscht wird, wenn dieses Handle wieder frei ist - dies alles auf Dateisystemebene - nicht auf RAM-Ebene.
Nils
4

Ja, was Sie beschrieben haben, ist möglich, aber die meiste Zeit, wenn die Datei im Paket enthalten ist, handelt es sich um eine Bibliothek oder eine andere Datei, die nur einmal gelesen wird (da sie sich nicht ändert, gibt es keinen Grund dafür) mehrmals lesen). Auch wenn die Datei langfristig benötigt wird, lässt die Anwendung wahrscheinlich das Datei-Handle geöffnet, wobei das geöffnete Datei-Handle die alte Version auch dann geöffnet hält, wenn es im tatsächlichen Dateisystem ersetzt wird.

In den meisten Fällen handelt es sich bei Daten, die während der Laufzeit des Prozesses mehrmals gelesen werden, um Benutzer- / Variablendaten. Dies würde sich während eines Paket-Upgrades nicht ändern. Da die Daten variabel sind, würde jeder Programmierer, der bei Verstand ist, sicherstellen, dass das Programm mit dem Wechsel von einem Lesevorgang zum nächsten umgehen kann.

Patrick
quelle
Die Datei kann immer noch als "Sicherungsspeicher" erneut gelesen werden, wenn die Zuordnung keine Änderungen im Speicher vorgenommen hat (wodurch der Sicherungsspeicher andernfalls in den Auslagerungsspeicher verschoben würde, falls verfügbar), und die Kopie im Speicher wird aufgrund eines anderen Nutzungsdrucks verworfen Erinnerung. Dies ist jedoch kein Problem, da die Originaldatei noch geöffnet oder zugeordnet ist. Die Ersatzbibliothek ist eine neue und andere Datei, die der alte Prozess nicht geöffnet hat.
Skaperen
1
@ Kaperen Ich gehe davon aus, dass es sich um speicherabgebildete Dateien handelt. Dies sind keine Probleme beim Aktualisieren von Paketen. Alle Paketmanager erstellen neue Dateien, um die alten zu ersetzen, anstatt sie zu überschreiben. Tatsächlich ist dies die einzige Möglichkeit, da eine laufende ausführbare Datei nicht geändert werden kann, sondern nur die Verknüpfung aufgehoben werden kann.
Patrick
4

Angenommen, "B" wurde auch im Dateisystem ersetzt. Jetzt muss "A" aus irgendeinem Grund wieder "B" lesen. Die Frage ist: Ist es möglich, dass "A" eine inkompatible Version von "B" findet und auf andere Weise abstürzt oder nicht funktioniert?

Dies ist möglich, aber in den meisten Fällen unwahrscheinlich. Wenn "B" eine Codebibliothek ist, wird die Originalversion normalerweise nicht geschlossen. "A" würde weiterhin die Originalversion von "B" verwenden. Wenn Sie nach dem Update "A" ausführen, wird die neue Version von "B" verwendet. Während des Updates besteht das Risiko, dass inkompatible Versionen geladen werden. Aufgrund der Art und Weise, wie Codebibliotheken geladen werden, sollte dies jedoch nur dann ein Problem sein, wenn "A" Funktionen benötigt, die in den geladenen Versionen von "B" nicht vorhanden sind.

Gute Codierungspraxis hält die Schnittstelle zu Funktionen gleich. Folglich spielt es keine Rolle, welche Version geladen ist, es sei denn, in der neueren Version wurden Fehler behoben.

Konfigurationsdateien sind etwas anders, werden jedoch normalerweise beim Start gelesen. In diesem Fall würde "A" nicht "B" lesen, es sei denn, ein erneutes Laden der Konfiguration wurde geändert. Auch hier wäre es eine schlechte Codierungspraxis, das Format oder die Bedeutung der Konfigurationsdatei zu ändern. Eine inkompatible Version der Konfigurationsdatei sollte einen anderen Namen haben, damit dies kein Problem verursacht.

Warum aktualisiert niemand seine Systeme durch einen Neustart mit einer Live-CD oder einem ähnlichen Verfahren?

Das Herunterfahren und Neustarten von einer anderen Version aus würde zu einem Serviceausfall führen. Für Server ist dies in der Regel nicht erwünscht. In jedem Fall ist der Paketmanager auf dem laufenden System über die installierte Software und Versionen informiert. Live-CDs enthalten eine eigene Liste der installierten Software, möglicherweise mit unterschiedlichen Versionen. Dies macht es schwierig, das laufende System zuverlässig von der Live-CD zu aktualisieren.

Live-CDs werden manchmal verwendet, wenn eine neue Version des Betriebssystems installiert wird. In diesem Fall wird normalerweise eine Neuinstallation des Betriebssystems durchgeführt. Dies kann die Anzahl der nicht verwendeten Dateien aus der vorherigen Version begrenzen, die beibehalten werden. Dies kann aufwändiger sein als ein Upgrade des Live-Systems. Wenn jedoch unterschiedliche Root-Partitionen verwendet werden, kann das Risiko eingeschränkt werden, dass ein nicht bootfähiges, teilweise aktualisiertes System hängen bleibt.

BillThor
quelle
0

In einigen Fällen ist dies ein Problem:

  • JDK-Upgrade während eine Java-VM ausgeführt wird: Ich habe myselv die gleiche Frage gestellt, die Sie gestellt haben - ich hatte einen laufenden Tomcat, der Java verwendet. Jetzt nach einem Patch-Update des JDK lief es noch ohne Probleme - so schien es.

Die Erklärung ist jetzt Cache-Speicher. OK - Ich habe ein Memory-Hog-Programm gestartet, um den gesamten verfügbaren Arbeitsspeicher zu nutzen - und dann ist Tomcat abgestürzt (nachdem ich auf die dort ausgeführte Anwendung zugegriffen habe).

  • Kernel-Upgrade auf SuSE-Systemen: Unter SuSE werden der alte Kernel und seine Module direkt nach dem Patch-Upgrade des Kernels gelöscht. Wenn Sie dann etwas Neues verwenden möchten, für das ein Kernel-Modul erforderlich ist, das bisher nicht geladen wurde, schlägt der Dienst fehl.
Nils
quelle
2
Klingt so, als ob einige Teile von Tomcat neu gestartet wurden oder dynamische Bibliotheken unterhalb der Java-Ebene verwendet wurden (z. B. dlopen () und so weiter), was zu einer Mischung von Live-APIs führen könnte.
Skaperen
@ Kaperen auch bei Verwendung von Shared Libraries - wenn sie nach der Verwendung geschlossen werden, sollte jedes Programm Probleme haben, wenn der Cache knapp wird ...
Nils
1
Ein offener Dateideskriptor hat dieselbe Berechtigung, die Daten auf der Festplatte als Namen für die Datei in einem Verzeichnis beizubehalten. Der ursprüngliche Inode wird nicht gelöscht , solange eine Festplatte oder ein offener Dateideskriptor vorhanden ist. Cache hat nichts damit zu tun. Jetzt schließen einige Programme ihre Dateideskriptoren, wenn sie sie nicht verwenden, und das kann dazu führen, dass die Daten gelöscht werden.
dmckee
@ dmckee Richtig. Wir nähern uns dem Kern. Was ist also normal für ein "normales" Programm: Öffnen Sie die Bibliothek und lassen Sie sie geöffnet, oder laden Sie die Bibliothek und schließen Sie sie anschließend?
Nils