Wann und warum sollte ich apt-get update verwenden?

15

Allgemeine Frage:

Könnten Sie erklären, was der Befehl apt-get updatebewirkt und wann ich ihn wirklich verwenden sollte?


Bemerkungen

Bitte geben Sie eine ausführliche Antwort . Nicht nur eine Kopie der Manpage, es sei denn, Ihre Version ist wirklich detailliert (ich habe eine Definition von der Manpage unten angegeben).

apt-get update : Dient zum erneuten Synchronisieren der Paketindexdateien von ihren Quellen. Die Indizes der verfügbaren Pakete werden von den in /etc/apt/sources.list (5) angegebenen Speicherorten abgerufen. Ein Update sollte immer vor einem Upgrade oder Dist-Upgrade durchgeführt werden.


Unterfragen:

  • Wo ist der Paketindex gespeichert? In einer Datenbank? In einer Datei?
  • Was passiert, wenn ich apt-get installden Cache nicht aktualisiere? Besteht die Möglichkeit, dass das Remote-Paket nicht mehr existiert und die Verbindung unterbrochen wird?
  • Gibt es eine einvernehmliche Politik in Bezug auf Deb-Repositories? Soll ein Repository beispielsweise nur die letzte Version eines Pakets enthalten, oder sollen im Gegenteil alle Versionen enthalten sein, die für eine bestimmte Distributionsversion verfügbar sind?

Kontext

Ich stelle meine Frage, weil ich das Docker-Framework studiere . Eine seiner Funktionen ist das Dockerfile , mit dem Sie eine Art Betriebssystem-Image erstellen können , indem Sie Anweisungen aus dieser Datei ausführen. Eine Eigenschaft dieses Images ist, dass es unabhängig vom Kontext (Erstellungszeitpunkt usw.) immer gleich sein sollte.

Ich fürchte, wenn ich das apt-get updateKommando zu einem anderen Zeitpunkt starte, ist das Ergebnis anders und meine Bilder würden anders sein.

Pierre-Jean
quelle
Ich denke, dieser Beitrag könnte als Wiki-Artikel dazu dienen, eine hochrangige Frage zu stellen. Sehr hilfreich.
Zerodf

Antworten:

12

apt-get update Lädt die Liste der verfügbaren Pakete herunter.

Die Liste der Pakete kann sich im Laufe der Zeit ändern. Neue Pakete werden hinzugefügt und alte Pakete werden entfernt. Wenn du also einen wirklich alten Cache hast und versuchst einen zu machenapt-get install versuchen, einen zu erstellen, wird möglicherweise versucht, ein Paket herunterzuladen, das nicht mehr existiert.
Wie lange ein altes Paket in einem Repository aufbewahrt wird, hängt vom Repo-Betreuer (Ihrer Distribution) ab. Daher sollten Sie, wenn Sie so etwas wie Docker verwenden, bei dem der Cache möglicherweise sehr veraltet ist, immer ausführen, apt-get updatebevor Sie Pakete installieren.

Der Grund für das Entfernen und Hinzufügen von Paketen sind hauptsächlich Fehlerbehebungen und Sicherheitsupdates. Wenn Sie Repos von Drittanbietern wie PPA verwenden, ist alles möglich.

Wenn Sie Docker für die Containerisierung in einer Unternehmensumgebung verwenden, sollten Sie den Container einmal erstellen und dann diesen Container durch Ihre verschiedenen Release-Umgebungen (Entwicklung, Staging, Produktion) verschieben und den Container nicht jedes Mal neu erstellen. Auf diese Weise stellen Sie sicher, dass Sie keinen anderen Container erhalten, der nicht getestet wurde.

Zur Beantwortung Ihrer Frage, wo die Cache - Dateien leben /var/lib/apt/lists.

Patrick
quelle
Gute Antwort! Vielen Dank! Ich möchte auf den Absatz reagieren "(...) den Container nicht jedes Mal neu erstellen. Dadurch wird sichergestellt, dass Sie keinen anderen Container erhalten, der nicht getestet wurde." Ich habe gelesen, dass es eine bewährte Methode ist, niemals apt-get upgrade zu verwenden. Einer der Gründe wäre: "Es werden auch inkonsistente Bilder erstellt, da Sie nicht mehr über eine einzige Quelle verfügen, aus der hervorgeht, wie Ihre Anwendung ausgeführt werden soll und welche Versionen von Abhängigkeiten im Bild enthalten sind." Ist es nicht das gleiche Problem mit apt-get updatedann? Und Dockerfile soll das Image nicht garantieren?
Pierre-Jean,
2
Irgendwie. apt-get updatebetrifft nur neu installierte Pakete. Bestehende Pakete werden nur dann aktualisiert, wenn sie von den neuen Paketen benötigt werden (dies sollte minimal sein). Wenn apt-get upgradeSie alle Pakete, einschließlich der vorhandenen, aktualisieren, erhalten Sie ein völlig anderes Image. Obwohl dies jedes Mal zu einem anderen Ergebnis führen kann, wenn Sie aus der Docker-Datei erstellen, ist dies meines Erachtens kein ernstes Problem, wenn Sie ein Release mit mehreren Umgebungen durchführen. Ich denke, dies ist eher ein Problem, wenn Sie die Docker-Datei an andere Personen verteilen und sie erstellen lassen.
Patrick
0

Könnten einige erklären, was der Befehl apt-get update bewirkt und wann ich ihn wirklich verwenden sollte?

apt-get update Lädt aktualisierte Indizes aus den Paket-Repositorys der Distribution herunter und listet alle verfügbaren Pakete und ihre genauen Versionen auf.

Gängige Distributionen wie Ubuntu und Debian sind in ihren Paketangeboten normalerweise konservativ und abwärtskompatibel, so dass sich die Versionen im Laufe der Zeit nicht wesentlich ändern. Sie ändern sich aufgrund von Sicherheitsupdates oder Fehlerbehebungen. Zum Beispiel könnte mysql von 5.7.18nach, 5.7.19aber nicht nach aktualisiert werden 6.x.

Wo ist der Paketindex gespeichert? In einer Datenbank? In einer Datei?

Es wird normalerweise in einer oder mehreren Dateien gespeichert /var/lib/apt. Im Kontext von Docker befinden sich diese Dateien im Image. Beim Erstellen der Docker-Datei werden sie in den neuen Ebenen des Dateisystems gespeichert, die als neu erstelltes Image erstellt und beibehalten werden.

Was passiert, wenn ich apt-get installiere, ohne den Cache zu aktualisieren?

Sie können versuchen, Paketversionen herunterzuladen, die nicht mehr existieren. Dies ist auf virtuellen Maschinen durchaus üblich, aber auch in Containern möglich, wenn die Distributions-Repositorys nach dem Erstellen des Basis-Images neue Pakete veröffentlicht haben. Möglicherweise gibt es keine Koordination zwischen den Distributionsbetreuern und den Dockerfile-Betreuern, die der Distribution nachgeschaltet sind und möglicherweise eine größere Anzahl haben. Es gibt nur ein Debian-Repository, aber Tausende von jessieContainer-Images und Dockerfile.

Darüber hinaus entfernen einige vorgelagerte Bilder wie das Ubuntu den heruntergeladenen Index , um das Bild zu verkleinern und veraltete Dateien dort zu vermeiden. Es wird daher erwartet, dass ein aktualisierter Index heruntergeladen wird, wenn Sie auf einem Basisimage aufbauen, und nicht für jede Version eines Basisimages, die mit dem neuesten Index ausgeliefert wird.

Besteht die Möglichkeit, dass das Remote-Paket nicht mehr existiert und die Verbindung unterbrochen wird?

Auf jeden Fall, weil die im Index gespeicherten Versionen sehr genau sind 5.7.19(Vereinfachung; sie ähneln eher 5.7.19-0ubuntu1).

Gibt es eine einvernehmliche Politik in Bezug auf Deb-Repositories? Soll ein Repository beispielsweise nur die letzte Version eines Pakets enthalten, oder sollen im Gegenteil alle Versionen enthalten sein, die für eine bestimmte Distributionsversion verfügbar sind?

Es ist üblich, dass alte Nebenversionen schnell entfernt werden, sobald ein Update verfügbar ist. Ich gehe davon aus, dass dies Platz auf den Servern spart, da Binärdateien mehrere zehn Megabyte wiegen können, multipliziert mit allen unterstützten Versionen und Architekturen. So ist es normalerweise unmöglich, mysql-5.7.18im folgenden zu sagen, festzunageln apt-get install; Sobald mysql-5.7.19es in der Distribution veröffentlicht wird, wird das vorherige entfernt.

Um Docker gegenüber fair zu sein, ist dieser Nicht-Determinismus von apt-get updateein Problem, das im Rahmen der Paketverwaltung jeder Distribution aufgeworfen wird. Sie haben das gleiche Problem beim wiederholten Erstellen einer virtuellen EC2- oder Vagrant-Maschine.

Einige Systemadministratoren verwenden Dienste wie Aptly, um die ursprünglichen Repositorys zu spiegeln und eine bestimmte Version zu pinnen. Es besteht jedoch die Gefahr, dass Sie Sicherheitsupdates verpassen, es sei denn, Sie führen regelmäßig einen separaten Prozess aus, um die Updates zu testen und Ihre Einstellungen zu ändern stecken fest.

giorgiosironi
quelle