Wechselwirkungen zwischen Packages und Ports

JochenF

Well-Known Member
Hallo,

so ganz ist mir das Zusammenspiel von Packages und Ports nicht klar. Meist hat man ja manche Pakete Binär installiert, und andere aus den Ports compiliert.

Mir ist jetzt aufgefallen, dass ein "portmaster -a" auch Pakete compilieren wollte die ich binär installiert hatte, weil die in den Ports offenbar neuer waren. Andersherum installiert mir gerade ein "pkg upgrade" Pakete binär die ich aus den Ports installiert hatte (teilweise wegen geänderter Config-Optionen, die ich ja bewusst anders haben wollte).

Für einen alten Debianer ist das ziemlich verwirrend. Unter Debian mache ich ein "apt-get dist-upgrade", und alles ist auf dem neuesten Stand. Unter FreeBSD brauche ich 3 unterschiedliche Tools: freebsd-update, pkg und portmaster. Und irgendwie pfuschen die sich gegenseitig ins Handwerk.

Was ist denn die richtige Vorgehensweise um ein FreeBSD auf den aktuellen Stand zu bringen?
 
Moin,

eigentlich ist es ganz einfach. Du musst streng zwischen dem Basissystem und den Ports/Packages unterscheiden.Das Basissystem ist das, was als "FreeBSD" ausgeliefert wird. Es ist NICHT nur der Kernel sondern eben noch andere Tools/Programme die dazu gehören. Das Basissystem aktualisierst du mit freebsd-update. Wenn du nicht -CURRENT oder -STABLE fährst (willst du vermutlich nicht), werden im Basissystem nur zB Sicherheitslücken geschlossen. Nachtrag: -CURRENT und -STABLE kannst du zudem nicht mit freebsd-update aktualisieren sondern musst es dir selbst übersetzen.

Die Packages/Ports hast du NEBEN dem Basissystem. Erkennen kannst du das daran(vereinfacht gesagt), dass die Programme in /usr/local liegen. Alles was zum Basissystem gehört, liegt nicht in /usr/local. Du kannst Pakete (Packages) und Ports mischen. Ein Port macht im Prinzip nichts anderes als ein Package zu erstellen und dieses zu installieren. Meine Meinung ist: Entscheide dich für einen Weg Programme zu installieren. Entweder Ports oder Packages. Ich verwende (wie wohl die meisten) Ports. Du bist dort (noch: Das soll sich ändern) flexibler was eigene Config-Optionen angeht. Wenn du dennoch "mischen" willst, kannst du einzelne Pakete vom Update durch portmaster zurückstellen. Wie das geht müsstest du in der manpage nachlesen. Ich weiß es nicht, da ich es nicht brauche. Aber es geht.

HTH
 
Also, erst einmal musst du dir klar machen, dass in den meisten Linux-Distributionen alles ein Paket ist. Unter FreeBSD ist es nicht so, konzeptionell entspricht das System mehr Windows oder OS X als Linux. Es gibt ein Basissystem und völlig unabhängig dazu gibt es Paketmanagement für Anwendungen von Drittanbietern. Der große Vorteil ist, dass du durch das Paketmanagement niemals das System an sich zerschießen kannst. FreeBSD ist daher nicht darauf angewiesen, Pakete aufwändig zu stabilisieren und erreicht dennoch eine mit den konservativen Linuxen vergleichbare Stabilität. Der Nachteil ist halt, dass das Basisystem zur Pflege eigene Tools benötigt. Im Moment sind es freebsd-update(8) für Binärupgrades und "make buildworld / make buildkernel" für Source-Upgrades.

Die Ports sind wie gesagt gegenüber dem Basisystem weitgehend eigenständig. Was du dir klar machen musst ist, dass Ports und Pakete exakt das gleiche sind. Es gibt aus Sicht des Paketmanagements keinen Unterschied zwischen beiden:
  • Ein Port zieht die Sourcen, baut sie und erstellt daraus ein Paket. Das Paket wird dann installiert.
  • Ein Paket ist ein Port, den bereits jemand für dich gebaut hat. Das Paket wird heruntergeladen und installiert.
Du stolperst nun darüber, dass sowohl pkg als auch portmaster ein "Alles oder Nichts"-Ansatz sind. portmaster wird alle Abhängigkeiten des gewünschten Ports auf Stand deiner /usr/ports bringen. pkg wiederum wird alles auf Stand des Repos bringen. Damit die beiden nicht Ping-Pong spielen, sollte man sich für eines entscheiden und das jeweils andere nur in Ausnahmefällen benutzen. Ich installiere z.B. alles per pkg, nur noch sehr Weniges (mpv, libdvdread und Sylpheed) aus den Ports. Die aus den Ports installierten Pakete werden anschließend mit "pkg lock" gesperrt, damit pkg sie in Ruhe lässt.
 
Meist hat man ja manche Pakete Binär installiert, und andere aus den Ports compiliert.

Eigentlich nicht. Ich entscheide mich klar für das Eine oder das Andere. Wie du bereits bemerkt hast fliesst am Ende alles in eine einzige Datenbank. Daher siehst du auch mit pkg info alles was aus Ports installiert wurde. Das entfernen von per Ports installierter Software nimmt man iA auch per pkg delete (oder remove) vor.

Du musst die Funktionsweise des Ganzen richtig verstehen, dann wird einiges klarer. DIe Trennung zwischen Base-System und Drittsoftware (Pakate/Ports) ist für alle die von Linux wechseln meist das erste Verständnisproblem.
Ein Linux-System ist zumeist eine Sammlung von verschiedensten Bestandteilen die von überall zusammengesucht werden und dann zu einem System, rund um einen, meist auch noch zusammengepatchten, Kernel zusammengeklebt werden. Sprich: Alles an dem System kommt von irgendwo her. Daher ist die Updateverwaltung auch einheitlich und es wird alles mögliche durch ein zentrales Paketmanagement gepatcht. Das ist zunächst mal praktisch, da einfach zu verstehen. Der Nachteil ist, meiner Meinung nach, dass so ein Update halt auch recht flott mal mein OS unbenutzbar macht da nicht alle Pakete immer aufeinander abgestimmt sein müssen. Man Merke: Es gibt kein "Linux-System", sondern nur ein System mit (meist GNU-)Software rund um einen Linux-Kernel.
Ein FreeBSD ist Gegensatz dazu ein komplettes Betriebssystem. Sprich nicht nur ein Kernel um den herrum dann Software zu einem Gesamtsystem zusammengeklaubt wird, sondern ein wirklich vollständiges System. Alles was in Base-System von FreeBSD drin steckt wird auch vom FreeBSD-Projekt verwaltet und gepflegt (klar wird da auch mal ein Patch von aussen geprüft und eingestellt). Um dieses System mit externer Software zu versorgen gibt es die Ports. Das sind einfach nur Bauanleitungen wie man Software aus _fremden_ Quellen in einem FreeBSD installiert. Sprich das ist, einfach gesagt, ein Makefile in dem drin steht: "Lade die Quellen von dem Server XYZ und wennde dann den Pach hier an, mit das auch gescheit unter BSD läuft und dann übersetz das ganze... bla blub". Die eigentliche Software wird also i.A. nicht von dem FreeBSD-Projekt verwaltet oder gehostet. Lediglich die Makefiles werden immer angepasst, dass sie die aktuellen Versionen übersetzen können.

Wie funktioniert das nun mit den Ports? Der Port, der ja wie gesagt nur ein Makefile (mit bissl was dazu ist) übersetzt dir die Software mit deinen Optionen und macht daraus ein Paket(!). Dieses wird anschließend mittels pkg installiert. Daher kommt auch das Verhalten, dass jede Software gleich behandelt wird, egal ob aus Paketen oder Ports... denn Schlussendlich sind beides Pakete.
Übrigens da Ports nur "Anleitungen" sind kann man damit auch binär verteilte Software installieren.

Die Pakete die pkg installiert sind übrigens, du denkst es dir bereits, nichts anderes als Ports die mit den Standardoptionen gebaut wurden.

Vielleicht verstehst du es nun besser. freebsd-update aktuallisiert das Basissystem. pkg und portmaster aktuallisieren beide Drittsoftware welche in der selben Datenbank verwaltet wird. Das ist auch eine Vertrauenssache. Das Basissystem wird von dem Projekt geprüft und überwacht. Drittsoftware nicht.

Du kannst pkg auch anweisen verschiedene Pakete einzufrieren, damit sie nicht automatisch geupdated werden... Wegen der Abhängigkeitspfade sollte man sowas jedoch nur in Ausnahmesituatuinen machen und dann auch nur selten.

Die richtige Vorgehensweise ist dein Basissystem regelmässig aktuell zu halten. Das geht entweder binär per freebsd-update oder eben aus den Quellen (buildkernel, buildworld, etc).

Und deine Drittsoftware dann je nach gewähltem Weg zu updaten. Es gibt Leute die Updaten Drittsoftware nur gezielt (also nur die Software welche evtl Sicherheitsprobleme hat). Andere updaten einfach alles... Mache arbeiten nur mit Pakete, andere nur mir Ports (weil sie Anpassungen brauchen oder wollen).... Wie dem auch sei.

Ich habe für mich fast auf allen Desktop-Rechnern Pakete im Einsatz (da das zumeist wirklich völlig ausreicht) und verwende auf Servern Ports da ich da meist etwas anpassen will (z.B. WITHOUT_X11).
 
Damit die beiden nicht Ping-Pong spielen, sollte man sich für eines entscheiden und das jeweils andere nur in Ausnahmefällen benutzen. Ich installiere z.B. alles per pkg, nur noch sehr Weniges (mpv, libdvdread und Sylpheed) aus den Ports. Die aus den Ports installierten Pakete werden anschließend mit "pkg lock" gesperrt, damit pkg sie in Ruhe lässt.
Dass man die Pakete mit "pkg lock" sperren muss war der entscheidende Hinweis der mir fehlte.

Ich möchte eigentlich auch so vorgehen wie Yamagi: alles per pkg installieren, außer das was da nicht verfügbar ist, oder wo ich bewusst andere Optionen möchte.

Auf meinem Testrechner hatte ich alles aus den Ports installiert, bin aber dann dahinter gekommen dass das zu aufwändig ist. Für webkit-gtk2 und webkit-gtk3 ist der tagelang am compilieren. Auf meinem Laptop habe ich dann die Strategie schon geändert, und installiere überwiegend per pkg. Aber leider gibt es nicht alles binär, deshalb kommt man um einen "Mischbetrieb" nicht drumrum.
 
Noch eine Anmerkung, wenn du Ports/Packages aktuallisierst solltest du vorher immer mal einen Blick in /usr/ports/UPDATING werfen. Das kann dir viel Ärger ersparen. Bei Updates des Base-Systems innerhalb einer Version (also nur Patchlevel erhöhen) gibt es normal nichts besonderes zu beachten, aber wenn du ein Upgrade machst (z.B. von 10.0 auf 10.1 etc) solltest du auch immer in die Releasenotes und die Installation-Instructions sehen. Hin und wieder gibt es hier auch besonderheiten zu beachten.
 
Ich möchte eigentlich auch so vorgehen wie Yamagi: alles per pkg installieren, außer das was da nicht verfügbar ist, oder wo ich bewusst andere Optionen möchte.
Ich schmeisse hier mal noch poudriere [1] in den Raum. Damit kannst du Pakete automatisch bauen lassen und hast zum Schluss ein eigenes PKG Repository welches du dann auf deinen Maschinen einbinden kannst. Musst halt schauen, ob sich der Aufwand für dich lohnt. Im Wiki gibt es eine Anleitung.

Gruss

[1] http://wiki.bsdforen.de/kategorie:howto:poudriere
 
Das mit der Trennung zwischen Basis-System und Packages/Ports war mir ja schon vorher klar, das ist ja im Handbuch gut beschrieben. Einige Dinge sind mir aber nachwievor nicht so richtig klar: Wird bei Packages/Ports auch zwischen RELEASE und CURRENT unterschieden, oder gibts da immer nur eine Version? Wird mit freebsd-update auch der Source-Tree aktualisiert, oder muss man sich den per svn selber aktualisieren? Falls man den selber aktualisieren muss, wie macht man das? Bei den Branches gibt es kein Release, nur Stable und Current.
 
Wird bei Packages/Ports auch zwischen RELEASE und CURRENT unterschieden, oder gibts da immer nur eine Version? Wird mit freebsd-update auch der Source-Tree aktualisiert, oder muss man sich den per svn selber aktualisieren? Falls man den selber aktualisieren muss, wie macht man das? Bei den Branches gibt es kein Release, nur Stable und Current.

Die Ports gibt es nur in einer Version. Die Packages, logischerweise jeweils für jedes Release, da sie ja gegen die aktuellen Versionen gebaut werden müssen.
Ob freebsd-update den Source-Pfad updated oder nicht liegt an dir. Grundsätzlich ist es dazu in der Lage. Bei einem Update versucht es festzustellen was du alles installiert hast und fragt dich dann.
Update der Quellen kann man so machen (wenn man es von Hand macht): http://denkrobat.de/doku.php?id=systemquellen_aktualisieren
 
Die Ports gibt es nur in einer Version. Die Packages, logischerweise jeweils für jedes Release, da sie ja gegen die aktuellen Versionen gebaut werden müssen.
Müsste heißen "für jedes Major Release"; es gibt keine separaten Packages für z.B. 9.2-RELEASE und 9.3-RELEASE.

Weiß eigentlich jemand, ob/wann portmaster auf pkg umgestellt wird - will meinen: Wann kann ich wieder die portmaster -P verwenden? (Aus der portmaster Manpage)
Code:
  -P|--packages
  use packages, but build port if not available

Ansonsten noch einen Tipp aus meiner Praxis: Ich nutze ebenfalls üblicherweise pkg und lediglich für ein paar Ausnahmen portmaster. In letzterem Falle lasse ich portmaster erstmal prüfen, welche Abhängigkeiten er noch installieren/updaten würde, mache das dann aber - soweit es geht - per pkg. Meist bleiben dann ein paar Dinge übrig, die portmaster zusätzlich zum gewünschten Port neubauen will, weil es eine (minimal) neue Portversion gibt, die noch nicht als Package vorliegen. Diese schließe ich per -x aus und baue nur den Port, der mich wirklich interessiert. Funktioniert aber möglicherweise nicht, wenn irgendeine Abhängigkeit einen größeren Versionssprung gemacht hat.

Wenn ich also den Port xxx/meinport per portmaster bauen will, sieht das ungefähr so aus:
Code:
#portmaster -x abhängigkeit1 -x abhängigkeit2 -x abhängigkeit3 xxx/meinport
 
Müsste heißen "für jedes Major Release"; es gibt keine separaten Packages für z.B. 9.2-RELEASE und 9.3-RELEASE.

Weiß eigentlich jemand, ob/wann portmaster auf pkg umgestellt wird - will meinen: Wann kann ich wieder die portmaster -P verwenden? (Aus der portmaster Manpage)

Hast natürlich recht.

portmaster kann doch schon lange pkg....? Zu Anfangszeiten brauchte er noch "WITH_PKGNG=yes" in der make.conf. Ich denke, dass er es mitterweile auf 10er Systemen automatisch nutzt,
 
Zurück
Oben