Warum läuft ein Softwarepaket einwandfrei, selbst wenn es aktualisiert wird?

Warum läuft ein Softwarepaket einwandfrei, selbst wenn es aktualisiert wird?

Angenommen, ich führe eine Software aus und führe dann den Paketmanager aus, um die Software zu aktualisieren. Ich stelle fest, dass Linux den laufenden Prozess für die Paketaktualisierung nicht beendet – er läuft weiterhin einwandfrei. Wie macht Linux das?

Antwort1

Der Grund dafür ist, dass Unix eine ausführbare Datei während der Ausführung nicht sperrt, und selbst wenn es dies tut, wie bei Linux, gilt diese Sperre für den Inode, nicht für den Dateinamen. Das bedeutet, dass ein Prozess, der die Datei offen hält, auf dieselben (alten) Daten zugreift, selbst nachdem die Datei gelöscht (tatsächlich entlinkt) und durch eine neue mit demselben Namen ersetzt wurde, was im Wesentlichen das ist, was ein Paketupdate tut.

Dies ist einer der Hauptunterschiede zwischen Unix und Windows. Letzteres kann eine gesperrte Datei nicht aktualisieren, da eine Ebene zwischen Dateinamen und Inodes fehlt. Dies macht das Aktualisieren oder sogar Installieren einiger Pakete sehr aufwändig, da normalerweise ein vollständiger Neustart erforderlich ist.

Antwort2

Ausführbare Dateien werden im Allgemeinen einmal geöffnet, an einen Dateideskriptor angehängt und haben keinen Dateideskriptor für ihre Binärdatei, der während einer einzelnen Ausführungsperiode erneut geöffnet wird. Wenn Sie beispielsweise ausführen bash, exec()wird im Allgemeinen nur einmal ein Dateideskriptor für den Inode erstellt, auf den gezeigt wird /bin/bash– beim Aufruf.

Dies bedeutet häufig, dass bei einfachen Binärdateien, die während der Ausführung nicht versuchen, sich selbst erneut zu lesen (indem sie den Pfad verwenden, über den sie aufgerufen wurden), der zwischengespeicherte Inhalt als hängender Inode gültig bleibt. Dies bedeutet, dass im Wesentlichen eine Kopie der vorherigen Version der ausführbaren Datei vorhanden ist.

In komplexeren Fällen kann dies zu Problemen führen. Beispielsweise kann eine Konfigurationsdatei aktualisiert und anschließend erneut gelesen werden, oder das Programm kann sich selbst über den Pfad, von dem es ausgeführt wurde, erneut ausführen. Es kann auch Probleme geben, wenn Programme miteinander verbunden sind und eines vor der Aktualisierung und eines danach ausgeführt wird (möglicherweise vom ersten Programm). Dies gilt auch für einige Bibliotheken.

In einfachen Anwendungsfällen ist ein Upgrade jedoch ohne Neustart des Vorgangs sicher.

verwandte Informationen