FreeBSD Jail minimal buildworld

arcona

Well-Known Member
Hallo,
ich befinde mich in neuem "Terrain", ich gehe meinen ersten Schritte im BSD-Userland und baue gerade meine erste Jail.

Dabei ist mir noch so einiges nicht ganz klar.
Zunächst bin ich nach dem FreeBSD Handbuch vorgegangen
Code:
# setenv D /hier/ist/die/jail
# mkdir -p $D 
# cd /usr/src
# make buildworld  ###bin erst hier!
# make installworld DESTDIR=$D
# make distribution DESTDIR=$D 
# mount -t devfs devfs $D/dev
Da ich (aus Unwissenheit) mit sysintall sätmliche Sourcen der Installations CD installiert habe, dauert make buildworld halt ziemlich lange.

Wenn ich jetzt make installworld ausführe, wird dann in der Jail alles (/usr/src ist sehr groß und /usr/obj/usr/src noch viel größer) installiert, was in den Sourcen ist?

Eigentlich möchte ich nur eine minimale Jail erstellen (wenn möglich aber mit ports, da ich dann alles benötigte nachinstallieren kann).

Wie kann ich einen minimale Jail erstellen? Muss ich weniger Sourcen (/usr/src) auf dem Host installieren und dann nochmal make buildworld ausführen? Nur welche lasse ich weg, damit ich ein minimal lauffähigel Jail erhalte?

Oder kann ich besser make buildworld anweisen nicht alles zu bauen? In welcher Konfigurationsdatei stelle ich das ein? Was kann ich weglassen, um mein obiges Ziel zu erreichen?

Grüße.
arcona
 
Was 'make buildworld/make installworld' bauen soll kannst du in der make.conf einstellen.

Erläuterungen dazu in 'man make.conf' oder ein Beispiel unter '/usr/share/examples/etc/make.conf'.

z.B.
Code:
NO_INFO="YES"
NO_MAN="YES"
NO_GAMES="YES"
usw.
 
Ok wenn ich man make.conf aufrufe ist der Abschnitt über die buildworld Optionen irgendwie unvollständig, dh sehr kurz.
Ich habe eine Manpage hier gefunden und die Optionen mal übernommen:
http://www.gsp.com/cgi-bin/man.cgi?section=5&topic=make.conf

Meine make.conf sieht jetzt erstmal so aus:
Code:
..
NO_KERBEROS="YES"                                                                                                
   NO_WPA_SUPPLICANT_EAPOL="YES"                                                                                    
   MODULES_WITH_WORLD="YES"                                                                                         
   NO_BLUETOOTH="YES"                                                                                               
   NO_BOOT="YES"                                                                                                    
   NO_CVS="YES"                                                                                                     
   NO_CXX="YES"                                                                                                     
   NO_DICT="YES"                                                                                                    
   NO_FORTRAN="YES"
   NO_GDB ="YES"
   NO_GPIB ="YES"
   NO_I4B
   NO_IPFILTER="YES"
   NO_AUTHPF="YES"
   NO_AUTHPF="YES"
   NO_TOOLCHAIN="YES"
   NO_INET6="YES"
   NO_ATM="YES"
   NO_USB="YES"
   NO_LPR="YES"
   NO_ACPI="YES"
   NO_MAILWRAPPER="YES"
   NO_MAN="NO"
   NO_NETCAT="NO"
   NO_NIS="NO"
   NO_NLS_CATALOGS="NO"
   NO_OBJC="YES"
   NO_OPENSSH="NO"
   NO_OPENSSL="NO"
   NO_SENDMAIL="NO"
   NO_SHAREDOCS="YES"
   NO_TCSH="NO"
   NO_CLEAN="NO"
   NO_CLEANDIR="YES"
   NO_CRYPT="NO"
   NO_GAMES="YES"
   NO_INFO="YES"
   NO_LIBC_R
   NO_LIBPTHREAD
   NO_LIBTHR
   NO_MANCOMPRESS
   NO_PROFILE
   NO_SHARE
   NO_SHARED="YES"
   NO_BIND="YES"
..

Ist das ungefähr richtig um ein minimal laufendes Jail zu erstellen (mit SSH) oder soll ich besser einiges hinzufügen oder weiteres entfernen?

Eine Frage zu den Ports. Die Ports (aus (/usr/ports) sind nicht in (/usr/src/) enthalten. Werden die mitgebaut oder was muss ich tun, damit ich via ports Software in der Jail installieren kann?

Grüße.
arcona.
/EDIT
Mal ganz blöd gefragt, ist mein Vorgehen so überhaupt sinnvoll oder habt Ihr einen bessere Lösung, um eine kleine handliche Jail zu erstellen?
 
Last edited:
Also obige Konfiguration bricht nach ca. 20 Minuten ab.
Alle Einstellungen in der make.conf, die oben noch leer sind, habe ich auskommentiert.
Code:
sh /usr/src/tools/install.sh -C -o root -g wheel -m 444   libssp_nonshared.a /usr/obj/usr/src/tmp/usr/lib                                                   
cc -c -O2 -pipe  -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -DHAVE_GTHR_DEFAULT  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcclibs/include  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc/config -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc -I.  -I/usr/src/gnu/lib/libgcc/../../usr.bin/cc/cc_tools -std=gnu99  -fvisibility=hidden -DHIDE_EXPORTS -fPIC  -DL_muldi3 -o _muldi3.o /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c                                
In file included from /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c:33:                                                                            
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:47:20: error: stddef.h: No such file or directory                                                    
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:48:19: error: float.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:87:20: error: stdarg.h: No such file or directory                                                    
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:90:19: error: stdio.h: No such file or directory                                                     
cc -c -O2 -pipe  -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -DHAVE_GTHR_DEFAULT  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcclibs/include  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc/config -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc -I.  -I/usr/src/gnu/lib/libgcc/../../usr.bin/cc/cc_tools -std=gnu99  -fvisibility=hidden -DHIDE_EXPORTS -fPIC  -DL_negdi2 -o _negdi2.o /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c                                
In file included from /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c:33:                                                                            
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:47:20: error: stddef.h: No such file or directory                                                    
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:48:19: error: float.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:87:20: error: stdarg.h: No such file or directory                                                    
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:90:19: error: stdio.h: No such file or directory                                                     
cc -c -O2 -pipe  -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -DHAVE_GTHR_DEFAULT  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcclibs/include  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc/config -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc -I.  -I/usr/src/gnu/lib/libgcc/../../usr.bin/cc/cc_tools -std=gnu99  -fvisibility=hidden -DHIDE_EXPORTS -fPIC  -DL_lshrdi3 -o _lshrdi3.o /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c                              
In file included from /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c:33:                                                                            
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:96:19: error: errno.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:103:20: error: string.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:104:20: error: stdlib.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:105:20: error: unistd.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:108:20: error: limits.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:111:18: error: time.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:96:19: error: errno.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:103:20: error: string.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:104:20: error: stdlib.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:105:20: error: unistd.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:108:20: error: limits.h: No such file or directory                                                   
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:111:18: error: time.h: No such file or directory                                                     
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:47:20: error: stddef.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:48:19: error: float.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:87:20: error: stdarg.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:90:19: error: stdio.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:96:19: error: errno.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:103:20: error: string.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:104:20: error: stdlib.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:105:20: error: unistd.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:108:20: error: limits.h: No such file or directory
cc -c -O2 -pipe  -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED  -DHAVE_GTHR_DEFAULT  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcclibs/include  -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc/config -I/usr/src/gnu/lib/libgcc/../../../contrib/gcc -I.  -I/usr/src/gnu/lib/libgcc/../../usr.bin/cc/cc_tools -std=gnu99  -fvisibility=hidden -DHIDE_EXPORTS -fPIC  -DL_ashldi3 -o _ashldi3.o /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:111:18: error: time.h: No such file or directory
In file included from /usr/src/gnu/lib/libgcc/../../../contrib/gcc/libgcc2.c:33:
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:47:20: error: stddef.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:48:19: error: float.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:87:20: error: stdarg.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:90:19: error: stdio.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:96:19: error: errno.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:103:20: error: string.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:104:20: error: stdlib.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:105:20: error: unistd.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:108:20: error: limits.h: No such file or directory
/usr/src/gnu/lib/libgcc/../../../contrib/gcc/tsystem.h:111:18: error: time.h: No such file or directory
*** Error code 1
*** Error code 1
*** Error code 1
*** Error code 1
4 errors
*** Error code 2
1 error
*** Error code 2
1 error
*** Error code 2
1 error
*** Error code 2
1 error
BSD#
 
Ich habe jetzt die Jail mal so wie eingangs beschrieben erstellt und keine Einschränkungen in der /etc/make.conf vorgenommen.
Die Jail wird dann insgesamt nur ca. 190 MB groß und ist ziemlich minimal.
Das ist zwar sehr schön, weil von mir so erwünscht, aber das verstehe ich nicht.

Wieso baut buildworls alles make install und make distrbution erstellen dann aber nur so eine kleine Umgebung???

Übrigens sollte ich auch hier am Ende ein make clean ausführen?

Grüße.
craano.
 
Hi,

freut mich, dass du FreeBSD ausprobierst :)

Bei den aktuellen Versionen von FreeBSD gibt es extra für diese NO_* Variablen eine config-file /etc/src.conf . mit man src.conf bekommst du eine gute Einführung in die verschiedenen Optionen. Wichtig anzumerken ist, dass bei den Variablen (sofern ich mich erinnere) nur geschaut wird, ob irgendetwas drinsteht, also egal ob "NO" oder "YES", wird beides als angehakt gewertet.

Hier mal meine src.conf für meine normale Desktop (!) Installation:
Code:
WITHOUT_MAILWRAPPER=YES
WITHOUT_BIND_DNSSEC=YES
WITHOUT_BIND_ETC=YES
WITHOUT_BIND_MTREE=YES
WITHOUT_BIND_NAMED=YES
WITHOUT_GAMES=YES
WITHOUT_LPR=YES
WITHOUT_MAILWRAPPER=YES
WITHOUT_NIS=YES
WITHOUT_SENDMAIL=YES
WITHOUT_RESCUE=YES
WITHOUT_RCMDS=YES
WITH_IDEA=YES
WITHOUT_I4B=YES
WITHOUT_NCP=YES
WITHOUT_NLS=YES
WITHOUT_NLS_CATALOGS=YES
WITHOUT_LOCATE=YES
WITHOUT_MAIL=YES

Du bist wohl noch ein wenig an die Linux verhältnisse gewöhnt :) - 200MB ist bei FreeBSD so circa die normale Installation. - NanoBSD builds (siehe m0n0wall o.Ä.) kommen teilweise auf 8MB durch rigoroses abspecken.

Ich wünsch noch freudiges ausprobieren !

Gruß

PS: Alles bezogen auf 8.0 und 7.x
 
Ja, komme aus der Linux-Welt. Dafür empfinde ich 200 MB als relativ schlank.
FreeBSD 8.0 ist das erste BSD mit dem ich in Berührung komme.

Der Hinweis auf die /etc/src.conf bringt mich sehr weiter. Die Manpage zeitgt jetzt auch alle Schalter. Allerdings kann ich mit vielen (noch) nichts anfangen.
Ich würde mich sehr freuen, wenn sich jemand finden würde, der schon einmal sehr kleine Jails ersellt hat und vielleicht mal ein Beispiel posten könnte einer minimalen Jail.

Ein make buildworld für SSH, vi, ports, rudimentäre Dateisystembefehle und Kleinkram dauert dann bestimmt auch nicht mehr so lange.

Bislang läuft erstmal alles in der Jail, habe aber wahrscheinlich viel zu viel übersetzt.
Code:
last pid: 78795;  load averages:  3.88,  3.75,  4.06                                                         up 0+02:30:20  23:30:17
9 processes:   1 running, 8 sleeping
CPU: 14.7% user,  0.0% nice, 80.6% system,  4.7% interrupt,  0.0% idle
Mem: 66M Active, 236M Inact, 77M Wired, 6864K Cache, 60M Buf, 104M Free
Swap: 512M Total, 512M Free

  PID USERNAME  THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMAND
 1946 root        1  44    0  6072K  2396K select   0:02  0.00% sendmail
 3009 vcraano     1  44    0  9400K  3100K select   0:00  0.00% sshd
70143 vcraano     1  44    0  3680K  1404K RUN      0:00  0.00% top
 1956 root        1  44    0  3372K  1124K nanslp   0:00  0.00% cron
 1835 root        1  44    0  3344K  1068K select   0:00  0.00% syslogd
 3006 root        1  46    0  9400K  3068K sbwait   0:00  0.00% sshd
 3010 vcraano     1  44    0  4664K  2104K pause    0:00  0.00% tcsh
 1950 smmsp       1  44    0  6072K  2364K pause    0:00  0.00% sendmail
 1992 root        1  44    0  6676K  2800K select   0:00  0.00% sshd

Grüße.
craano.
 
Ich habe noch eine zweit e Möglichkeit gefunden eine Basis-System für eine Jail zu erstellen.
Man eine Basis-System per ftp oder von einer Installations-Cd in ein Verzeichnis ($DESTDIR) taren. Das so installierte System ist nur noch 148 MB groß un der ganze Vorgang dauert nur 2 Minuten.

Im Moment sehe ich da keinen Nachteil im Vergleich zu einem selbstgebauten Basis-System.

Grüße,
craano.
 
@morromett
Ja, das scheint mir zZ der schnellste/eleganteste Weg zu sein eine Jail zu erstellen.

Was meinst Du denn am Ende mit Jail entrümpeln, was löscht Du denn alles?

Im Moment läuft gerade nochmal ein make buildworld in der ich einiges ausgeschlossen habe, mal sehen was dabei heraus kommt.
Code:
NO_ACPI= true
NO_BOOT= true
NO_BLUETOOTH= true
NO_FORTRAN= true
NO_GDB= true
NO_GPIB= true
NO_I4B= true
NO_IPFILTER= true
NO_PF= true
NO_AUTHPF= true
NO_KERBEROS= true
NO_LPR= true
NO_MAILWRAPPER=true
NO_MODULES= true
NO_NETCAT= true
NO_NIS= true
NO_SENDMAIL= true
NO_SHAREDOCS= true
NO_USB= true
NO_VINUM= true
NOATM= true
NOCRYPT= true
NOGAMES= true
NOINFO= true
NOMAN= true
NOPROFILE= true
NO_BIND= true
NO_BIND_ETC= true
NO_BIND_LIBS_LWRES= truNO_BIND_MTREE= true
NO_BIND_NAMED= true

Hast Du vielleicht auch eine Lösung für diesen Anwendungsfall:
http://www.bsdforen.de/showthread.php?t=24017

Grüße.
craano
 
Welches Dateisystem nutzt du denn?
ZFS. Das wurde bei meiner (ersten) 8.0 Installation per Default verwendet.
Soweit ich das verstanden habe ist dein Vorhaben mit ZFS recht einfach moeglich.
Wie denn?
[/QUOTE]Damit koenntest du dann auch zusaetzlich noch eine Mutter-Jail erstellen und diese dann ganz einfach clonen - fuer so viele jails wie du brauchst.[/QUOTE]
Das verstehe ich nicht so ganz. Was hat denn das Dateisystem mit den Jails zu tun? Denkst Du jetzt an cpdup?

Grüße.
craano.
 
@arcona:
An sich hat das Dateisystem nichts damit zu tun es ergeben sich halt Vorteile im Plattenplatzersparnis.

So wie ich das verstanden habe funktioniert das folgendermassen:

Du erstellst dir eine basejail und machst einen snapshot daraus, diesen kannst du dann klonen.
Das gute daran ist, das du recht viele Klone haben kannst ohne viel Speicherplatz zu verlieren, da diese nur den Platz der Aenderungen des originals einnehmen - sprich direkt nach dem Klonen erstmal nichts. Die haben sozusagen die ganze config und die ordner der jail "vererbt"
 
@arcona:
An sich hat das Dateisystem nichts damit zu tun es ergeben sich halt Vorteile im Plattenplatzersparnis.

So wie ich das verstanden habe funktioniert das folgendermassen:

Du erstellst dir eine basejail und machst einen snapshot daraus, diesen kannst du dann klonen.
Das gute daran ist, das du recht viele Klone haben kannst ohne viel Speicherplatz zu verlieren, da diese nur den Platz der Aenderungen des originals einnehmen - sprich direkt nach dem Klonen erstmal nichts. Die haben sozusagen die ganze config und die ordner der jail "vererbt"
Ja, das ist richtig. Das ist zum Beispiel sehr schnell mit ezjail gemacht. Das benutze ich jedoch nicht, ich bastele gerade an einem Skript um automatisiert Jails erstellen zu können.

Ich habe Deinen Vorpost falsch verstanden.
Ich dachte Du hättest eine Lösung im Kopf für die Jails ein qutas-ähnliches System benutzen zu können. Das ist gerade noch mein letztet Stolperstein, deswegen habe ich auch das oben erwähnte neue Thema eröffnet. Ich möchte vermeiden, dass eine Jail die anderen beinflusst, weil Sie den ganzen Plattenplatz einnimmt. Leider kann ich Quotas dafür nicht verwenden, weil die sich immer auf User oder Gruppen beziehen. Eine Möglichekeit dem System zu sagen, dass Ordner XY eine maximale Größe nicht überschreiten darf, habe ich noch nicht gefunden.

Grüße.
craano.
 
Back
Top