FreeBSD Ports auf mehreren Jails installieren

Echelon1010000

Active Member
Hi!

Ich verwende 5.4-STABLE und habe mir einige jails aufgebaut. Jetzt möchte ich einen Port auf allen installieren. Das Verzeichnis /usr/ports ist über einen NullFS Mount in den jails eingehängt.
Um das ganze relativ unbeaufsichtigt laufen zu lassen habe ich mir ein kurzes Shellscript geschrieben:
Code:
#!/usr/local/bin/bash
jailstart 1
jailcount 5

...SNIP....
jailname[5]="proxy"                                     # Symbolischer name
jailpath[5]="/jail/eigen/proxy"                         # absoluter pfad
jailhostname[5]="host.name.domain.tld"                  # hostname
jailip[5]="1.2.3.4"                                     # IP Adresse
jailexec[5]="/bin/sh /etc/rc"                           # Startbefehl
jailactive[5]="yes"                                     # Soll der Port installiert werden?


cd /usr/ports/$1
for i in `seq -s $jailstart -e $jailcount `
do
    echo "Installiere /usr/ports/$1 in jail ${jailname[$i]} (${jailpath[$i]})"
    if [ ${jailactive[$i]} = "yes" ]; then
        make clean install DESTDIR=${jailpath[$i]}
    else
        echo "Jail ${jailname[$i]} ist nicht aktiv: Skipped!"
    fi
    echo "Abgeschlossen: /usr/ports/$1 make clean install in ${jailpath[$i]}"
done

Das Script rufe ich beispielsweise mit "./portverteiler net/nss_ldap" oder, um die bash zu installieren, mit "./portverteiler shells/bash" auf.
Leider klappt das nicht so wie ich mir das vorstelle. Der make Prozess läuft eine Weile, baut den Port aus den Quellen, so wie ich das will, dann meldet er mir das der Port bereits installiert ist. Auf der jail wo das installiert ist ist das jedoch definitv nicht der Fall. Auch auf dem Hostsystem nicht.
Wo ist hier mein Denkfehler? Oder gibt es eine andere Methode scriptgesteuert einen Port zu installieren? Wenn möglich aus den Quellen, nicht über pkg_add. Mach es Sinn das mit jexec zu probieren?

Gruß, Echelon
 
Hi!

Danke für deinen Hinweis :) Ich bin Linuxumsteiger und habe diese Möglichkeit noch nicht gekannt. Ich hätte dazu noch eine Frage:
Der Autor schreibt das das Paket erzeugt wird und gleichzeitig der Port auf dem System auf dem das Paket generiert wird installiert wird. Um das dann wieder loszuwerden soll man "make deinstall" laufen lassen. Mich würde da interessieren wie "sauber" das deinstallieren arbeitet.

Mit stellen sich da folgende mögliche Probleme:
1. Das Paket/Port installiert Abhängigkeiten. Werden diese beim Deinstallieren auch gelöscht oder muss ich mir diese zusammenklamüsern und einzeln deinstallieren?

2. Das Paket/Port hat eine Abhängkeit die schon installiert war. Wenn diese beim deinstallieren gelöscht wird fehlt das dann einer anderen Anwendung für die die Abhängikeit installiert wurde oder "weiß" make um diese Zusammenhänge?

3. Wird der Port restlos gelöscht oder muss ich dann manuell irgendwelche Überbleibsel (Configdateien etc.) zusammensuchen und händig löschen? Vor allem wenn der Port Dateien in Nutzerverzeichnissen installiert kann das recht mühsam werden...

4. Wenn ich das Paket erzeugt hab, kann ich dann, so wie oben geplant, das Paket über ein einzelnes Script auf den jails verteilen? Das war es ja was ich erreichen wollte. Ich will micht nicht auf jeder einzeln mit ssh einloggen und dann den Port installieren, unabhängig ob das nun aus den Sourcen kommt oder als Paket installiert wird.

edit:
5. Auf dem Buildsystem ist die Abhängigkeit "lib.blubb86.so" vorhanden, auf dem Zielsystem hingegen nicht. Wird die dann nachgeholt, in das Paket mit eingebaut, schlägt die installation auf dem Zielsystem fehl oder, was am schlimmsten wäre, funktioniert das installierte Paket nicht und ich darf mich auf die Suche machen?

Vielen Dank im voraus und mit freundlichen Grüßen,
Echelon
 
Zuletzt bearbeitet:
Nimm "jexec" das ist ja für sowas gedacht wenn Du vom Hostsystem aus etwas in der Jail starten, stoppen, wasauchimmer willst.
Ansonsten kostet Plattenplatz kaum noch was. Daher kannst Du doch jeder Jail das eigene
/usr/ports spendieren. Um was zu installieren dann vom Hostsystem mit jexex oder rein in die Jail und schnell "portinstall" aufgerufen.
Wenn Du Angst hast das dies zuviel Speicher auf der Platte frisst dann lösche eben ein paar der Ports verzeichnisse die Du wohl aum nutzen wirst (russisches,...) und bereinige /usr/ports/distfiles vom hostsystem aus auf den Jails.

Wenn Du das via package lösen willst dann setze doch eine Jail mit ports tree auf, baue dort den port mit "make package-recrusive" und schubse dann das Paket in die anderen Jails um es dort mit pkg_add zu installieren
 
Hi!

Danke für den Tipp :) Habe ich zwischendurch auch schon getetstet. Ein Versuch das mit
jexec $JID "cd /usr/ports/$1 && /usr/bin/make clean install"
zu lösen schlug genauso fehl wie der Versuch mit
"jexec $JID /usr/bin/make clean install -f /usr/ports/$1/Makefile"
(in beiden Fällen "no such File or Directory")

Hatte das so versucht. Der Plattenplatz ist mir eigentlich egal, habe genug davon. Ich benutze den NullFSmount hauptsächlich weil ich dann nicht für jede jail einen eigenen Portstree pflegen muß. Im Moment experimentiere ich mit einem Cronjob der ein bestimmtes Verzeichnis prüft und eventuell enthaltene Pakete installiert.

Ich suche halt nach einer Möglichkeit den Port/das Paket automatisch in allen jails zu installieren. Ohne das ich mich auf jeder einloggen zu müssen. Ich werde mir das jexec nochmal vornehmen. Eine andere Möglichkeit wäre vielleicht von dem Script ein Miniscript im jeweiligen jailverzeichnis erzeugen zu lassen in dem die Installationsanweisungen stehen. Dieses kann ich dann durch jexec ausführen lassen.

Grüße,
Echelon
 
Hi!

Sieht genauso aus:
Code:
root@jailhouse# jexec 16 portinstall nss_ldap
jexec: execvp(): portinstall: No such file or directory
root@jailhouse#
Abgesehen baut er die dann doch nicht, er installiert die binaries. Oder hab ich das falsch verstanden?

Gruss,
Echelon
 
Du musst natürlich "portinstall" installiert haben, sonst klappt das nicht ;-)
Nein, portinstal installiert den Port aus den Sourcen, ausser man gibt ein -P (oder -PP) mit dann wird versucht das package, so vorhanden, zu installieren
 
Hi

Habe portinstall installiert. Hatte bei "jexec $JID /usr/bin/make" ja auch das Problem.
Ich habe es mittlerweile anders gelöst.
Als erstes baue ich auf einer extrajail das Paket.
Als zweites stoße ich einen pkg_add an der das Paket installiert. Und da hab ich auch schon das nächste Problem:
Bei dem Paket sind natürlich keine Abhängigkeiten dabei. Kann ich "make package" so beeinflussen das es auch die Abhängkeiten auflöst und diese idealerweise auch ins Paket mit einbaut bzw das Paket dafür generiert?

Gruss,
Echelon
 
Zurück
Oben