Ich versuche, den FreeBSD- pkg_add
Befehl zu verwenden, um Binärpakete in einem Szenario zu installieren und zu aktualisieren, bei dem man einmal erstellt und auf mehreren Rechnern installiert. Das funktioniert gut, wenn ich ein neues Paket installiere, aber Aktualisierungen verwirren mich. Wenn ich beispielsweise ein Paket aktualisieren möchte, dasabhängig vondurch ein anderes Paket, ich kann es nicht einfach installieren:
# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed
An diesem Punkt kann ich die ältere Version des Pakets löschen, wenn ich -f
den folgenden pkg_delete
Befehl eingebe:
# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0
Aber... und das ist das Schlimmste... jetzt sind die Abhängigkeitsinformationen weg! Ich kann das Upgrade installieren:
# pkg_add /path/to/somepackage-2.0.tbz
Und jetzt funktionieren Löschversuche ohne Fehler:
# pkg_delete somepackage-2.0
Wie gehe ich elegant damit um (wobei „elegant“ bedeutet „auf eine Weise, bei der Abhängigkeitsinformationen erhalten bleiben, ohne dass ich die gesamte Abhängigkeitskette neu erstellen/neu installieren muss“).
Danke!
Antwort1
Wie Sie festgestellt haben, pkg_add
können Ports nicht ordnungsgemäß aktualisiert werden. Das portupgrade
Paket erledigt dies jedoch recht gut und ist die Methode, die ich verwende und empfehle (es sind auch andere verfügbar, wenn Ihnen diese Methode nicht gefällt).
Sobald der Port installiert ist, können Sie ihn einfach ausführen portupgrade -aPP
und er aktualisiert alle auf dem System installierten Ports mithilfe von Paketen. Wenn Sie nicht jeden Port aktualisieren möchten, können Sie portupgrade -RPP [category/port]
einen bestimmten Port und die Ports, von denen er abhängt, aktualisieren. Wenn Sie das Programm ohne Argumente ausführen, wird der Port aktualisiert, der zum aktuellen Verzeichnis gehört (d. h. es cd /usr/ports/security/openssl ; portupgrade
wird aktualisiert openssl
, ohne die -PP
Option wird der Port aus der Quelle erstellt); und wenn Sie sich nicht in einem Port-Verzeichnis befinden, wird Hilfe angezeigt (dasselbe wie bei der -h
Option).
Bearbeiten:
Standardmäßig installiert portupgrade Pakete, wenn diese in dem durch die PKG_PATH
Umgebungsvariable definierten Verzeichnis vorhanden sind (standardmäßig $PACKAGES/All
, $PACKAGES
standardmäßig $PORTSDIR/packages
; der Standardpfad ist also /usr/ports/packages/All
).
Wenn sie dort nicht vorhanden sind, werden die Pakete (vorzugsweise) von $PKG_SITES
(nimmt eine URI mit Unterordnern Latest
und All
; kein Standardwert) oder $PACKAGEROOT
(nimmt eine URI mit dem normalen Spiegelpfad darunter; Standard ist "ftp://ftp.freebsd.org"
) heruntergeladen.
Eine einfache Möglichkeit hierfür besteht darin, eine Maschine zum Erstellen/Zwischenspeichern von Paketen zu verwenden, die auf einer anderen Maschine installiert werden.
- Sie können Pakete aus dem Ports-Baum im Verzeichnis des Ports erstellen
make package
(wodurch auch der Port installiert wird). - Sie können es verwenden,
portupgrade
um eine Maschine zu aktualisieren und die Paketdateien für die Verwendung auf anderen Maschinen zwischenzuspeichern. Die oben genannten Befehle speichern die Paketdateien im Standardverzeichnis (siehe oben). portupgrade -aPPF
Sie können portupgrade mit oder verwenden, um die Pakete nur abzurufen, nicht aber, um sie zu installierenportupgrade -RPPF [category/port]
.
Sobald Sie die zwischengespeicherten Paketdateien haben, können Sie das Verzeichnis über NFS, FTP, HTTP usw. freigeben, solange die Dateien von den anderen Computern aus zugänglich sind. Legen Sie PACKAGES
oder PKG_SITE
mit den entsprechenden Werten fest, um auf den Caching-Server zu verweisen. Führen Sie den typischen portupgrade
Befehl aus, er sollte die Pakete vom Caching-Server abrufen und installieren.
Hinweis: Damit der Port-Tree richtig funktioniert, muss er auf allen Servern auf dem neuesten Stand sein portupgrade
(es wird versucht, auf die Version zu aktualisieren, die im lokalen Port-Tree vorhanden ist). Wenn Sie auf allen Computern dieselben Ports/Pakete installiert haben möchten, ist es möglicherweise am einfachsten, ein Serververzeichnis freizugeben /usr/ports
(z. B. über NFS) und es auf allen anderen Servern zu mounten.
Antwort2
Vielleicht pkg_replace
ist es das, wonach Sie suchen.
Ich benutze es jetzt schon eine ganze Weile. Einer meiner FreeBSD-Rechner fungiert als Build-Server und erstellt (unter Verwendung portmaster
) alle Pakete für die anderen Rechner. Ich verwende es, pkg_replace
um diese vorgefertigten Pakete auf allen anderen Rechnern zu installieren.
http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr
Antwort3
Oder Sie verlassen sich auf Portsnap oder CVSup, die hier beschrieben werden:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html