Wie funktioniert der Ubuntu-Upgrade-Prozess?

11

Wie kann Ubuntu nahtlos auf eine neuere Distribution aktualisiert werden, während das Betriebssystem noch ausgeführt wird? Ich aktualisiere von 10.10 auf 11.04 und habe bereits mehrere Male ein Upgrade durchgeführt. Es ist so einfach, Update-Manager -d auszuführen, herunterzuladen und zu installieren und anschließend neu zu starten.

Wie genau funktioniert das? Wie kann der Upgrade-Manager das Betriebssystem aktualisieren, während es noch verwendet wird?

bbosak
quelle
Okay, meine Frage in einen Kopfgeldkommentar aufzunehmen, war keine gute Idee. Sieht nicht so aus, als könnte ich es auch bearbeiten.
Oxwivi

Antworten:

3

Aus meiner Erfahrung würde ich annehmen, dass Pakete und Module, während sie ausgeführt werden, im Speicher gehalten werden und nicht viel auf ihre Kopie auf der Festplatte zurückgreifen. Sie können dies sehen, wenn Sie ein Programm in Ubuntu ausführen und dann die zugehörigen Pakete entfernen, während es ausgeführt wird. Es läuft weiter, aber wenn Sie es schließen, können Sie es nicht neu starten.

Ich würde annehmen, dass das gleiche mit einem Distributions-Upgrade passiert. Alle Pakete, die sich auf die ursprüngliche Version von Ubuntu beziehen, werden weiterhin ausgeführt, obwohl sie entfernt und durch die neuen ersetzt wurden. Wenn sie also bei einem Systemneustart endgültig gestoppt werden, übernehmen die neuen Pakete.

Windschatten
quelle
Das würde auch erklären, warum ich bemerke, dass im Verlauf des Upgrades einigen Menüs neue Funktionen hinzugefügt werden.
Bbosak
15

Hier eine detailliertere Beschreibung des Prozesses. Entschuldigung, der Text wurde so lang.

Meine Erfahrung stammt von Debian, für das ursprünglich das gesamte in Ubuntu verwendete Verpackungs- und Upgrade-System erfunden wurde. Die täglichen Ubuntu-Sicherheitsupgrades entsprechen der Ausführung, bei apt-get upgradeder normalerweise keine Software entfernt wird. Die großen Release-Upgrades entsprechen einem, apt-get dist-upgradewährend dessen Softwarepakete vollständig ausgetauscht werden können.

Tatsächlich werden die Komponenten auf sehr niedriger Ebene normalerweise während eines Release-Upgrades nicht ausgetauscht. Unmittelbar nach dem Upgrade sollten Sie zwei Kernel- und initrd-Images in Ihrem / boot-Verzeichnis finden. Dies liegt daran, dass Kernel-Komponenten im Gegensatz zu Programmen nicht so gut austauschbar sind. Wenn während des Upgrades neue Gerätetreiber geladen werden müssen, müssen diese mit dem laufenden Kernel kompatibel sein. Nachdem das System mit dem neuen Kernel gestartet wurde, kann der alte entfernt werden. Als ich das letzte Mal überprüft habe, dass dies manuell erledigt werden muss, weiß ich nicht, wie der aktuelle Updater damit umgeht. Das ist übrigens. Der Hauptgrund, warum das Kernel-Image seine Versionsnummer im Dateinamen trägt - so können Sie verschiedene Kernel-Versionen gleichzeitig installieren. Gleiches gilt für den Modulpfad (/ lib / modules / ...)

Softwarepakete werden einzeln aktualisiert, beginnend mit den niedrigsten Paketen in der Abhängigkeits-Hirarchie. Dies sind normalerweise Programmbibliotheken wie libc und andere. Die Reihenfolge, in der Pakete aktualisiert werden, ist jedoch nicht fest codiert, sondern wird dynamisch berechnet, wenn Paketabhängigkeiten aufgelöst werden. In den meisten Fällen können alte Programme mit neuen Bibliotheken funktionieren. Daher ist es nicht so problematisch, wenn diese Bibliotheken zuerst ersetzt werden.

Sie müssen hier verstehen, dass das System zwischen manuell installierten Paketen (dh den Paketen, deren Installation Sie direkt angefordert haben, dh Chrom) und automatisch installierten Paketen unterscheidet, die nur installiert wurden, um die Abhängigkeiten manuell installierter Pakete (und Abhängigkeiten dieser Abhängigkeiten zu erfüllen) ).

Für jedes manuell installierte Programm sucht der Updater nur nach einer neueren Version. Oft sind diese Programme nur Metapakete wie "Ubuntu-Desktop", die keine Daten und nur Abhängigkeiten enthalten. Neue Versionen abhängiger Bibliotheken werden abgerufen, da sie von direkt aktualisierten (manuell angeforderten) Programmen angefordert werden. Der Updater wird immer versuchen, die neueste verwendbare Version eines abhängigen Pakets zu installieren (während einer Aktualisierung nicht nur Upgrades).

Programme, die mit den neuen Bibliotheksversionen nicht funktionieren, können nicht in der Zeit nach dem Upgrade der Bibliothek und vor dem Upgrade des Programms selbst gestartet werden. Sollten diese Programme bereits vor dem Bibliotheks-Upgrade ausgeführt werden, werden sie jedoch weiterhin ausgeführt, da die alte Bibliotheksversion so lange im Speicher bleibt, wie sie verwendet wird. Gleiches gilt für Programme, die vor dem Upgrade gestartet wurden. Diese bieten keine neuen Funktionen, bis sie beendet und neu gestartet werden.

Nach dem Update werden einige Bibliotheken (oder Abhängigkeiten im Allgemeinen) verwaist. Dies sind Bibliotheken, die von alten Programmversionen benötigt wurden, von den neuen Versionen jedoch nicht mehr benötigt werden. Da diese Pakete als automatisch installiert markiert sind und sich kein manuell installiertes Programm mehr auf sie bezieht, können diese Pakete leicht gefunden und entfernt werden. Sie können dies sogar als letzten Schritt des Aktualisierungsprozesses betrachten (der Aktualisierer sagt "Entfernen veralteter Pakete" oder ähnliches).

Es werden einige Pakete installiert, die zuvor nicht installiert wurden. Dies sind lediglich neue Abhängigkeiten, die als automatisch installiert markiert sind und entfernt werden können, falls die Anforderung für sie in Zukunft nicht mehr besteht.

Dieser Mechanismus ermöglicht sogar den Austausch ganzer Anwenderprogramme. Wie zum Beispiel von Gnome2 zu Unity wechseln. Da beide nur automatische Abhängigkeiten von Ubuntu-Desktop sind, ist dies eines der wenigen Pakete, für die tatsächlich neue Versionen angefordert werden.

Programme hängen normalerweise nicht von einer bestimmten Version des Betriebssystemkerns ab, daher funktionieren sie normalerweise einwandfrei mit dem laufenden Kernel.

Abgesehen von all dem vermute ich, dass der Ubuntu-Updater einige spezifische Korrekturen und Problemumgehungen in die Mischung einbringt, um Situationen zu umgehen, in denen diese Theorie bricht.

Wie Sie während des Updates sehen können, gibt es sehr gute Bedingungen, unter denen das System nur zu einem begrenzten Teil verwendet werden kann. Sollte während des Updates etwas schief gehen, wird höchstwahrscheinlich ein System defekt sein. Oft sogar eine, die nicht einfach repariert werden kann, da auch das Upgrade-Programm betroffen sein kann. Denken Sie daran, dass Programme mit unterbrochenen Abhängigkeiten weiterhin funktionieren können, aber nicht neu gestartet werden können. Solange die Abhängigkeiten unterbrochen sind, gilt dies auch für den Updater.

Mit dem Befehlszeilenprogramm können Sie apt-markherausfinden, welche Pakete als manuell installiert markiert sind und welche automatisch installiert wurden. Sie können diese Markierungen auch mit demselben Programm wechseln. Dies wirkt sich direkt auf den Aktualisierungsprozess aus.

In einem komplexeren Software-Setup werden Sie manchmal vom Updater aufgefordert, eine Abhängigkeit manuell aufzulösen. Das heißt, wenn ein manuell installiertes Programm aktualisiert wird und eine neue Version einer Bibliothek anfordert, während ein anderes manuell installiertes Programm von der alten Version derselben Bibliothek abhängt und nicht mit der neuen arbeiten kann. Sie müssen dann Ihre Wahl treffen, entweder um eines dieser Programme aufzugeben oder um nicht beide zu aktualisieren. Da Abhängigkeiten oft komplex sind, kann dies sehr schnell sehr chaotisch werden (Sie haben vielleicht schon vom Begriff "Abhängigkeitshölle" gehört).

Nun zu den spezifischen Fragen:

  1. Was passiert mit den veralteten Binärdateien, wenn die Infrastruktur auf niedriger Ebene geändert wird (auf niedriger Ebene wie im Kernel, in Treibern, Bibliotheken usw., mit der ein Benutzer nicht direkt interagiert)?
    • OK ... ich habe diesen bereits behandelt
  2. Was passiert mit einer App, die komplett veraltet ist? Zum Beispiel Unity 2D (oder eine andere Software, die aufgegeben wurde / keine Betreuer, deren Paket nicht im neuen Repo enthalten ist).
    • Wenn die App einmal manuell installiert wurde, bleibt sie im System, was häufig die von mir beschriebene Abhängigkeitshölle verursacht.
  3. Ubuntu-Desktop ist ein Metapaket, das Standard-Ubuntu-Anwendungen als Abhängigkeiten abruft. Wenn ich Firefox entfernt und Chrome installiert habe, wird Firefox dann im Rahmen von Upgrades weiterhin abgerufen?
    • Solange es der Standardbrowser der neuen Version ist, ja. Chrom wird ebenfalls aktualisiert. Ich bin nicht sicher, ob Sie Firefox entfernen können, ohne Ubuntu-Desktop zu entfernen. Beachten Sie, dass das Paketsystem neben strengen Abhängigkeiten auch das Konzept von Empfehlungen kennt, bei denen eine Software normalerweise wie eine Abhängigkeit installiert wird, aber später deinstalliert werden kann, ohne dass etwas anderes als die eigenen Abhängigkeiten betroffen sind.
  4. Was passiert außerdem, wenn eine einzelne App früher von package-x abhängig war und dies in einer neuen Version nicht mehr tut? Wird package-x zusammen mit den anderen Paketen aktualisiert, obwohl es verwaist ist?
    • Nee.

Fragen Sie mich einfach, wenn Sie noch weitere Fragen haben.

Paul Hänsch
quelle
Können Sie auf weitere Dokumente im Zusammenhang mit der Abhängigkeitshölle verlinken (erinnert mich an den Begriff DLL-Hölle)? Ich verwende nur minimale Ubuntu-Installationen und möchte herausfinden, wie ein Upgrade für mich funktioniert.
Oxwivi
Ich denke, alles, was Sie im Internet über die Abhängigkeitshölle finden, sind Beschwerden. Lesen Sie Ihre passenden Manpages wie man apt-get. Ich finde es oft nützlich, die Release-Angabe der Befehlssyntax wie apt-get -t intrepid install foo/jaunty bar/oneiricetc ... zu verwenden, nur Beispiele. Tatsächlich ist dies bei Debian sinnvoller, wo Sie manchmal Releases mischen. Unter Ubuntu ist dies weniger üblich. Interessante Themen könnten auch das Anheften und Zurückhalten von Paketen sein.
Paul Hänsch
3
Sie gewinnen die Auszeichnung für die längste Nicht-Code-Antwort, die ich je im Stack Exchange-Netzwerk gesehen habe.
Patrick
3

Auf Dateisystemebene können Sie im Gegensatz zu Windows auf einem Unix-System geöffnete Dateien löschen. Durch das Löschen wird nur der Name der Datei entfernt, nicht deren Inhalt, sodass alle Programme, bei denen die Datei noch geöffnet ist, weiterhin darauf zugreifen können, bis sie die Datei schließen. Erst dann werden die Daten freigegeben.

Der Aktualisierungsprozess entfernt also einfach die alten Dateien, ersetzt sie durch die neuen und startet sie für bestimmte Systemdienste neu, damit die neue Version ausgeführt wird.

Es gibt eine oder zwei Komponenten, die nicht neu gestartet werden können, ohne den gesamten Computer neu zu starten. Nach dem Upgrade werden Sie aufgefordert, einen Neustart durchzuführen, damit Sie die neue Version verwenden können.

psusi
quelle
2

Wie kann sich Linux selbst aktualisieren, während es noch verwendet wird?

Hauptsächlich, weil Linux (und damit die meisten Distributionen) einfach so entworfen wurde. Die Möglichkeit, ein Paket auf einem laufenden System zu aktualisieren, ist ein Ziel für die meisten Linux-basierten Distributionen.

Unter Linux hindert nichts den Paketmanager daran, in eine Datei auf der Festplatte zu schreiben, selbst wenn diese Datei derzeit von einer Anwendung geöffnet wird oder die Datei eine ausführbare oder gemeinsam genutzte Codebibliothek ist, die derzeit ausgeführt wird . Auf einer sehr niedrigen Ebene gibt es Sperren, die den Zugriff auf eine Datei während eines einzelnen Schreib- / Lesevorgangs schützen. Diese werden jedoch niemals länger als eine Millisekunde gehalten, und jede andere Anwendung versucht, in dieselbe Datei zu schreiben Ich werde einfach diese Millisekunden warten.

Sie können eine ausführbare Datei ersetzen, während sie ausgeführt wird, und sie führt tatsächlich nichts zum laufenden Prozess, da der Prozess die Datei auf der Festplatte nicht mehr benötigt - der gesamte Code wurde bereits in den Speicher geladen.

Aus diesem Grund wird das Upgrade unter Linux, obwohl Sie eine Anwendung während der Ausführung aktualisieren können, erst wirksam, wenn die von Ihnen aktualisierte Anwendung neu gestartet wird. Im Falle eines Upgrades eines Hintergrundprozesses wie eines Systemdienstes müsste dieser Dienst neu gestartet werden. Wenn Sie den Kernel aktualisiert haben, bedeutet dies einen Neustart.

Werden die Dateien eines Programms nicht ersetzt, während es ausgeführt wird, werden einige Programme unterbrochen?

Einige der Pakete in einer Linux-Distribution enthalten Installationsanweisungen, die den Paketmanager anweisen, bestimmte Systemdienste zu stoppen, während das Paket aktualisiert wird, und diese Dienste nach Abschluss des Updates neu zu starten. Dies verhindert Situationen, in denen beispielsweise die Konfigurationsdateien für einen bestimmten Dienst aktualisiert werden und die laufende Version des Dienstes möglicherweise nicht mit der neueren Version der Konfigurationsdateien fertig wird.

Für normale Benutzeranwendungen sind im Allgemeinen keine Konfigurationsdateien erforderlich, mit Ausnahme von Dateien, die selbst generiert und an Orten wie den Basisverzeichnissen der Benutzer abgelegt werden. Diese werden also beim Aktualisieren vom Paketmanager nicht berührt.

thomasrutter
quelle
Ich bin mir all dieser Details bereits bewusst. Bitte lesen Sie den Kommentar, den ich mit meinem Kopfgeld abgegeben habe. Ich möchte wissen, wie genau Ubuntu, dh aptdie bestimmten Pakete und Abhängigkeiten während des Upgrade-Prozesses behandelt.
Oxwivi
-2

Dies ähnelt einer anderen Funktion. Ich hoffe, dies hilft, den grundlegenden Prozess zu verstehen.

Ich beziehe mich auf die Fähigkeit, "root zu wechseln", wenn das Betriebssystem startet.

Beim Booten des Betriebssystems ist das Root-Dateisystem (sprich: "/") zunächst nur im RAM verfügbar. Während dieser Startvorgang wechselt / vom RAM zum / Dateisystem auf der Festplatte.

manipuliert
quelle
1
Nein, der Chroot-Mechanismus wird während des System-Upgrades nicht verwendet. Das Upgrade wird im Live-Dateisystem durchgeführt. Sie können sogar beobachten, wie Ihre Programmmenüs neu erstellt werden und sich die Programmsymbole ändern, wenn sie ersetzt werden. Der Chroot-Mechanismus wird jedoch in einer ursprünglichen Systeminstallation verwendet, wenn ein neues System in einer Change-Root-Umgebung auf einer neu erstellten Festplattenpartition "debootstrapped" wird.
Paul Hänsch