Upgrade von Jails

Columbo0815

Kaffeemann
Teammitglied
Moin,

ich stolpere da nun schon eine ganze Weile drüber und die im FreeBSD-Handbuch dargestellte Lösung [1] ist für meinen Fall nicht ganz passend.

Von vorne: Ich hatte ein FreeBSD-8.0/amd64, welches ich per freebsd-update auf FreeBSD-8.1 aktualisiert habe. Auf diesem System habe ich verschiedene Jails installiert, wie es hier [2] beschrieben ist. Kurzfassung hiervon:
cd /usr/src
make buildworld
make installworld DESTDIR=/foo/bar
make distribution DESTDIR=/foo/bar
Die Jails wurden auf FreeBSD-8.0 erstellt und sollen nun auf FreeBSD-8.1 aktualisiert werden.

Wie ich vorgehen würde:
Nachdem die Sourcen auf dem Hostsystem auch auf FreeBSD-8.1 aktualisiert wurden, gehe ich wieder nach /usr/src und führe dort "make buildworld" aus. Danach würde ich die Zieljail stoppen (/etc/rc.d/jail stop foobar). Danach würde ich "make installworld DESTDIR=/foo/bar" ausführen um die Jail zu aktualisieren.

Meine Bedenken bei diesem Punkt:
Wenn ich "make installworld" ausführe (für die Jail), werden alle bestehenden Programme überschrieben. Das ist soweit ok. Sollte ein Programm aus dem Basissystem verbannt worden sein (in der neueren Version), habe ich die verbannte Version in der Jail aber noch.

Weiterhin habe ich /etc in der Jail ja noch nicht aktualisiert. Hierfür dachte ich ist mergemaster da. mergemaster beklagt sich jedoch, dass /var/db/mergemaster.mtree in der jail fehlt, womit ich dann alle Änderungen manuell vornehmen muss. ich denke, dass das nicht im Sinne des Erfinders ist und ich hier irgendwo einen Denkfehler habe. Nur wo? Wie muss ich vorgehen?

Bin ich denn der einzige, der das nicht kapiert? ;) :huth:

Gruß

[1]: http://www.freebsd.org/doc/en/books/handbook/jails-application.html#JAILS-SERVICE-JAILS-UPGRADING
[2]: http://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/jails-build.html
 
Händisch und einzeln ( d.h. kein ezjail oder ähnliches ), ist wohl Glaubensfrage.
Aus privatem howtoknowtowhattodo
Code:
##   U P D A T I N G  a  J A I L ###

AFTER fresh sources and AFTER rebuild of word and kernel in HOST:

##  if exist different (make|src).conf
cd /etc      && cp make.conf make conf.bak
                cat make.conf_jailname > make.conf
                cp src.conf src.conf.bak
                cat src.conf_jailname > src.conf

cd  /usr/src && make cleanworld
                make [-jn] buildworld
                /etc/rc.d/jail stop <JAILNAME>
                mergemaster -p -D /$JAILDIR/<JAIL_NAME>

## for every jail with that makefile:
                make installworld DESTDIR=/$JAILDIR/<JAIL_NAME>
                mergemaster -i -U -F -D /$JAILDIR/<JAIL_NAME>
                /etc/rc.d/jail start <JAIL_NAME>

# mergemaster -F :  If the files differ only by VCS Id ($FreeBSD)
# install the new file. [man mergemaster(8)]

               #####    siehe nächster post von yamagi #####
               make  delete-old DESTDIR=/$JAILDIR/<JAIL_NAME>
               make  delete-old-libs  DESTDIR=/$JAILDIR/<JAIL_NAME>

## feaddisch ##
## awer jezzat rischtisch ##

wer will kann das wohl noch automatisieren, sprich verscripten. Geht aber bis ca. 25 jails relativ zügig.

hth
 
Zuletzt bearbeitet:
Euch beiden fehlt "make delete-old DESTDIR=/das/jail" und anschließend "make delete-old-libs DESTDIR=/das/jail". Die beiden Kommandos entfernen alle nicht mehr benötigten Programme und Bibliotheken aus der Base. Es macht also genau das, was du mit "Wenn ich "make installworld" ausführe (für die Jail), werden alle bestehenden Programme überschrieben. Das ist soweit ok. Sollte ein Programm aus dem Basissystem verbannt worden sein (in der neueren Version), habe ich die verbannte Version in der Jail aber noch." meinst. :)
 
Ok, wenn ich aber nun manuell nach "howtoknowtowhattodo" vorgehe, bin ich wieder dabei mergemaster händisch auf jede Datei anzuwenden. Ist das wirklich "normal"?
 
Es ist
mergemaster -i -U -F -D /$JAILDIR/<JAIL_NAME>

Zur Erklärung => man mergemaster(8).

Händisch musst du nur von dir selbst veränderte Dateien anpassen.

Für mich ist das normal :) und geht wirklich zügig.
 
Genau das habe ich gemacht. Wenn ich jedoch die Jails wie von mir beschrieben erstelle, fehlt innerhalb der Jails die Datei /var/db/mergemaster.mtree, weshalb das automatische Update fehl schlägt... :(
 
Sorry, habe deinen Post nicht richtig gelesen.

Bitte versuche mal,
mergemaster -i -F -D /$JAILDIR/<JAIL_NAME> ## also OHNE '-U' auszuführen.

Durch die option '-F' sollte auch da das meiste durchlaufen, und danach ist dann (so soll es zumindest sein)
/var/db/mergemaster.mtree erstellt.


edit: oder passiert das schon bei mergemaster -p -D .... ??

hth
 
Zuletzt bearbeitet:
Egal wie ich mergemaster aufrufe, ich muss alle Dateien händich mergen. Auch mit den von dir genannten 2 Varianten...
 
Komisch. Habe gerade eine mergemaster.mtree aus einem (geklonten) jail rausgenommen und das Ganze getestet.


Also:


mergemaster -p -D /$JAILDIR/<JAIL_NAME>

geht auch ohne existirende mergemaster.mtree.


mergemaster -i -U -F -D /$JAILDIR/<JAIL_NAME> ohne mergemaster.mtree gibt:
Code:
ara /src]# mergemaster -i -U -F  -D /$JAILDIR/<JAIL_NAME>

*** Unable to find mtree database (/jails/jailname/var/db/mergemaster.mtree).
    Skipping auto-upgrade on this run.
    It will be created for the next run when this one is complete.

 *** Press the [Enter] or [Return] key to continue ^C
jetzt ein beherztes 'enter' sorgt dafür, dass eine Menge durchläuft, mergemaster ein paar Frage stellt, die Optionen (install, merge, delete , later) bei einigen Dateien anbietet und Schluss.
mergemaster -i -F -D /$JAILDIR/<JAIL_NAME> ohne mergemaster.mtree gibt:
Code:
ara /src]# mergemaster -i  -F  -D /jails/jailname/

*** The directory specified for the temporary root environment,
    /var/tmp/temproot, exists.  This can be a security risk if untrusted
    users have access to the system.

  Use 'd' to delete the old /var/tmp/temproot and continue
  Use 't' to select a new temporary root directory
  Use 'e' to exit mergemaster

  Default is to use /var/tmp/temproot as is

How should I deal with this? [Use the existing /var/tmp/temproot

genau wie oben: ein beherztes 'enter' sorgt dafür, dass eine Menge durchläuft, mergemaster ein paar Frage stellt, die Optionen (install, merge, delete , later) bei einigen Dateien anbietet und Schluss.

Danach gibt's dann in beiden Varianten auch :
Code:
ara /src]# ls /jails/jailname/var/db/merge*
/jails/jailname/var/db/mergemaster.mtree
Und beim nächsten Mal funktioniert dann auch die Option '-U' Problemlos .
??
Wenn es das ist, was du ungerne händisch machst, weiss ich leider keinen Weg daran vorbei. :)
 
Also bei mir kommt nach deiner meldung oben nicht ein paar Fragen wie diese:
Use 'd' to delete the temporary ./etc/rc.d/pf
Use 'i' to install the temporary ./etc/rc.d/pf
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again

Default is to leave the temporary file to deal with by hand

How should I deal with this? [Leave it for later]
sondern extrem viele. Es hört nicht auf... Das muss ich alles händisch durchgehen? Da klemmts doch woanders.. Hm, ich glaube ich teste das erst nochmal mit einer anderen Jail, die ich umkopiere. Vielleicht hab ich mir durch mehrfaches testen etwas zerschossen?!

BTW: danke natürlich ;)
 
will mich hier nicht festbeissen aber --
hmmmm --
... welches ich per freebsd-update auf FreeBSD-8.1 aktualisiert habe. Auf diesem System habe ich verschiedene Jails installiert, wie es hier [2] .....

wie alt waren denn die sourcen ?

und wie (svn oder cvs) wurden sie ge'updated'?

Haben die Dateien im Jail /etc/ und/oder unter src/etc eine VCS Id ($FreeBSD) ?

(AFAIK funktioniert die '-F' option bei mergemaster nur mit eben diesen VCS Id's)
 
Kurzer Zwischenstand:

Zum einen: Die Sourcen hatte ich auch per freebsd-update auf 8.1 aktualisiert, sie sind also "aktuell". Ich bin das ganze jetzt nochmal an einer "Testjail" durchgegangen, indem ich eine bestehende Jail umkopiert habe. Diesmal bin ich mergemaster komplett (mit "Livesupport im IRC") durchgegangen. Es war zwar Arbeit, ist aber für jede Jail nur einmal nötig. Beim zweite Upgrade sollte /var/db/mergemaster.mtree vorhanden sein.

Eine Alternative ist mir noch gestern eingefallen. Vor dem "make installworld" könnte man /etc aus dem Jail wegsichern und löschen. Dann ein "make installworld" und ein "make distribution". Sofern nicht viele Änderungen im alten /etc gemacht wurden, kann man diese nun wieder einpflegen. Fragt sich nur, welche Handarbeit angenehmer ist :)
 
Es gibt - der Vollständigkeit halber - noch einen dritten Weg: sysutils/etcmerge Das Tool wurde von John Baldwin für seine Unmengen Server geschrieben und arbeitet mit Hilfe eines Drei-Wege-Merges. Es ist wesentlich automatischer als mergemaster und verlangt kaum mehr manuelle Eingriffe, da es auch einen Großteil der Merges automatisiert machen kann.
 
Diesmal bin ich mergemaster komplett (mit "Livesupport im IRC") durchgegangen. Es war zwar Arbeit, ist aber für jede Jail nur einmal nötig.


Wenn deine Jails alle gleich gebaut sind, bzw für die, die mit den gleichen [make|src).conf gebaut werden, kannst du ja auch einfach die erste, nach vielfach wiederholten schmerzhaftem tippen der 'i' - Taste :) enstandene mergemaster.mtree in die anderen Jails legen.

Ist nicht besonders intellektuell, aber wirksam ;).
 
meine make.conf ist leer. Ich "touche" die lediglich in den Jails kurz, damit sie existiert. Ansonsten bricht mergemaster ab.

Was mir jetzt noch fehlt - was es aber vermutlich nicht gibt - wäre ein "make checkbinary -D /Pfad/zur/Jail", das prüft ob alle Dateien iO sind oder noch irgendwo Leichen/ungeänderte Konfigdateien rumliegen... :)
 
OK, logisch.
Wobei hier mergemaster nicht abbricht sondern nur ein wenig meckert, sonst nix.
Ich meinte aber die (make|src).conf im HOST.
Begründung:
Jails werden ja auf dem Host gebaut, und zwar nach dem, was sowohl make.conf und src.conf ( falls vorhanden ?!?) vorgenben. Lass uns bitte die einzelnen Bausteine etc. nicht hier ausdiskutieren. :rolleyes:
Wenn nun mehrere Jails nach den gleichen Vorgaben gebaut sind, sind die von mergemaster zu aktualisierenden Dateien in /etc auch identisch.
Daher wird eine auf einem dieser Jails erstellte mergemaster.mtree auch auf den anderen, gleich gebauten Jails seinen Zweck genauso erfüllen. Und gut.
Bei dir scheinen alle Jails gleich gebaut zu sein, also wird die erste in einem dieser Jails erstellte mergemaster.mtree in alle anderen Jails passen.

Daher: Eine var/db/mergemaster.mtree aus einem 'händisch ;)' aktualisiertem Jail, in die anderen, baugleichen Jails kopiert, sorgt dafür, dass auch in diesen Jails mergemaster die '-U' (automatisches update) durchführen kann.

So war das gemeint :belehren:
 
Ich weiß nicht, ob es von belang ist, schaden kann es sicher nicht: Ich würde make delete-old und make delete-old-libs ausführen bevor ich die Jails starte. Vielleicht willst du das in deinem "Script" ändern? :)

Gruß
 
Der Post #2 wurde unmittelbar nach Yamagis Post ergänzt.
siehe: Geändert von metro (01.08.2010 um 12:08 Uhr).

Seitdem steht das gewünschte in voller Pracht und Fülle in hier.

BTW, das ist kein script, nur meine möglicherweise absonderliche Art so etwas festzuhalten.
Vielleicht mach ich aber noch eins.
 
Ja, natürlich hast du das bereits geändert :) Ich nutze deine Zusammenstellung (das passt besser... Script stand deshalb in "") auch schon sehr erfolgreich :-D (Danke dafür!)

Ich meinte lediglich, dass ich zuerst make old-delete ausführen würde und danach die jails starten würde. Die Reihenfolge in deiner Aufstellung ist umgekehrt :)

Gruß
 
@ columbo0815: danke, genauso solte es sein ...
Es ist aber leider nicht mehr möglich , den Post von Sonntag zu editieren. Daher hier nochmal alles, und hoffentlich in der richtigen Reihenfolge.

Code:
##   U P D A T I N G  a  J A I L ###

AFTER fresh sources and AFTER rebuild of word and kernel in HOST:

##  if exist different (make|src).conf for jails
cd /etc      && cp make.conf make conf.bak
                cat make.conf_jailname > make.conf
                cp src.conf src.conf.bak
                cat src.conf_jailname > src.conf
       -----------------------------------------------------------------
      -------------------------------------------------------------------
cd  /usr/src && make cleanworld
                make [-jn] buildworld
                /etc/rc.d/jail stop <JAILNAME>
                mergemaster -p -D /$JAILDIR/<JAIL_NAME>

## for every jail with that makefile:
                make installworld DESTDIR=/$JAILDIR/<JAIL_NAME>
                
               #####  danke @yamagi  #####
               make  delete-old DESTDIR=/$JAILDIR/<JAIL_NAME>
               make  delete-old-libs  DESTDIR=/$JAILDIR/<JAIL_NAME>
              
               mergemaster -i -U -F -D /$JAILDIR/<JAIL_NAME>

               /etc/rc.d/jail start <JAIL_NAME>
 
Zuletzt bearbeitet:
Zurück
Oben