32bit Anwendung auf amd64

Man weiß bescheid und will sich darum kümmern. Leider ist der zuständige Committer ein Mitarbeiter von Yahoo und hat daher im Moment ganz andere Probleme. Sprich, schlicht keine Zeit. :/
 
Was lange währt wird endlich ... naja wenigstens so halb. Oder anders gesagt, es funktioniert jetzt ein FreeBSD/i386-Jail oder gar nur ein Chroot auf einem FreeBSD/amd64 Host einzurichten. Einen Beweisscreenshot findet ihr im Anhang. Wie oben im Thread bereits gesagt, ist der dyamische Linker schon vor längerer Zeit repariert worden. Das es dennoch nicht funktionierte lag dann auch tatsächlich nicht mehr am ihm, sondern am Jailframework. Dieses ist nun stillschweigend (Vielleicht sogar unbeabsichtigt? Ich weiß es nicht...) durch Bjoern Zeeb repariert worden.

Kurze FAQ:

Was läuft?
- Theoretisch alles. Ich habe jetzt nur den unten zu sehenden Vim am Laufen, gestern hatte ich im ersten Versuch sogar Gimp im Betrieb. Es ging einwandfrei.

Was muss ich tun?
- Du brauchst ein aktuelles 7-STABLE oder 8.0-CURRENT. Alternativ (so wie ich) ein FreeBSD 7.1 mit Bjoern Zeebs Jailpatch. Du baust dir die Welt: "make TARGET=i386 TARGET_ARCH=i386 buildworld" und installierst diese anschließend mit "make TARGET=i386 TARGET_ARCH=i386 installworld DESTDIR=/dein/jail". Der Rest funktioniert wir beim Aufbau eines normalen Jails.

OK, und die Ports?
- Sind so eine Sache. 98% der Ports bauen, einige leider nicht. devel/glib ist so ein Kandidat, er fliegt auseinander, da der Port versuch amd64-Assembler im i386-Jails zu nutzen. Hier wäre es schön wenn jemand mit mehr Ahnung von Ports noch einmal aufzeigt, wie man Ports genau crosscompiled. Oder anders gesagt dem mit Gewalt beipulen kann, dass er i386-Zeugs nutzen soll. Ich habe daher für meine Testläufe Pakete genutzt.

X11 geht auch?
- Ja, wenn der Server auf dem Host läuft. Was ich hier treibe ist sicherheitstechnisch nicht ganz OK, aber für einen schnellen Test ausreichend:
Auf dem Host:
Code:
xhost $jailip
Im Jail:
Code:
setenv DISPLAY $hostip:0

So, viel Spaß damit. Vielen Dank an dieser Stelle an John Baldwin für seine Geduld und Hilfe, sowie Bjoern Zeep. Auch wenn wir in dieser Sache nie miteinander gesprochen haben :)
 

Anhänge

  • i386.jpg
    i386.jpg
    224,4 KB · Aufrufe: 399
Wem muss ich den Heiratsantrag machen? :D DANKE!

Kannst du mal prüfen, ob ifconfig was anständiges ausgibt? Kannst du irgendwo den Patch bereitstellen? Oder wäre es sogar denkbar, dass dieser Patch in Kürze per freebsd-update verteilt wird?
 
ifconfig auf dem Host:
Code:
yamagi@saya:ttyp2 ~: ifconfig                                       [10:57:42]
age0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=319b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MCAST,WOL_MAGIC>
	ether 00:23:54:31:a0:12
	inet6 fe80::223:54ff:fe31:a012%age0 prefixlen 64 scopeid 0x1 
	media: Ethernet autoselect (none)
	status: no carrier
sk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=b<RXCSUM,TXCSUM,VLAN_MTU>
	ether 00:0a:5e:53:64:87
	inet6 fe80::20a:5eff:fe53:6487%sk0 prefixlen 64 scopeid 0x2 
	inet 192.168.0.11 netmask 0xffffff00 broadcast 192.168.0.255
	inet6 2001:6f8:108a:1:20a:5eff:fe53:6487 prefixlen 64 autoconf 
	inet 192.168.0.17 netmask 0xffffffff broadcast 192.168.0.17
	media: Ethernet autoselect (1000baseTX <full-duplex,flag0,flag1>)
	status: active
ral0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether 00:1d:7d:7a:eb:0b
	media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
	status: no carrier
	ssid "" channel 1 (2412 Mhz 11b)
	authmode OPEN privacy OFF txpower 50 bmiss 7 scanvalid 60 bgscan
	bgscanintvl 300 bgscanidle 250 roam:rssi11b 7 roam:rate11b 1 bintval 0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 
	inet 127.0.0.1 netmask 0xff000000 
0.000u 0.007s 0:00.00 0.0%	0+0k 0+0io 0pf+0w
yamagi@saya:ttyp2 ~:                                                [10:57:45]

Ifconfig im Jail:
Code:
yamagi@i386:ttyp3 ~: ifconfig                                         [9:58:26]
: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST>
	inet 0.0.0.0 netmask 0x0 
	inet 192.168.0.17 netmask 0xffffffff broadcast 192.168.0.17
0.000u 0.000s 0:00.01 0.0%	0+0k 2+0io 2pf+0w
yamagi@i386:ttyp3 ~:                                                  [9:58:28]

Du brauchst keinen besonderen Patch. Du brauchst die stark erweiterten Jails von Bjoern Zeeb, sie sind in einem aktuellen 7-STABLE und seit längerem in 8.0-CURRENT bereits erhalten. Dort sollte es direkt aus der Box heraus funktionieren. Wenn du im 7.1 bleiben willst wie ich, musst du dort den neuen Jail-Kram reinpatchen. Den Patch (die Version ist ein wenig älter als das, was nach 7-STABLE ge MFCt wurde, macht aber keine Probleme) findest du unter: http://people.freebsd.org/~bz/bz_jail7-20081126-02-at153644.diff

Den patcht du in dein /usr/src, baust anschließend die Welt und den Kernel neu. Dies installierst du in den Host (logisch) und in alle Jails. Aktualisierst du die Jails nicht, funktionieren sie unter Umständen nicht mehr. EDIT: freebsd-update bekommt ihn dann mit dem Upgrade auf 7.2 irgendwann in ferner Zukunft ;)

EDIT2: Die Ausgabe vom ifconfig im Jail sieht wirklich so aus. Ich habe es nicht falsch kopiert :)
 
Ifconfig im Jail:
Code:
yamagi@i386:ttyp3 ~: ifconfig                                         [9:58:26]
: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST>
	inet 0.0.0.0 netmask 0x0 
	inet 192.168.0.17 netmask 0xffffffff broadcast 192.168.0.17
0.000u 0.000s 0:00.01 0.0%	0+0k 2+0io 2pf+0w
yamagi@i386:ttyp3 ~:                                                  [9:58:28]
Das heißt, du kannst vom Jail aus ins Internet pingen, richtig? Das ging bei mir nämlich unter i386 nicht.
Den patcht du in dein /usr/src, baust anschließend die Welt und den Kernel neu. Dies installierst du in den Host (logisch) und in alle Jails. Aktualisierst du die Jails nicht, funktionieren sie unter Umständen nicht mehr. EDIT: freebsd-update bekommt ihn dann mit dem Upgrade auf 7.2 irgendwann in ferner Zukunft ;)
Mist.. wenn ich das jetzt selbst patche, bekomme ich ja keine freebsd-update Sachen mehr. Bei 7.1 wollte ich aber schon bleiben. Zumindest bis 7.2 raus kommt ;) Hm.. Einen Tod muss ich wohl sterben damit ich verschiedene Programme, die unter amd64 zicken trotzdem nutzen kann.

Gruß
 
Ja, ich kann pingen. Ich konnte auch diverse Pakete per portinstall installieren. Das Netz funktioniert also definitiv. Lediglich ifconfig scheint ein Problem damit zu haben den Gerätenamen auszulesen.
 
Perfekt! Aber nochmal zurück zum Thema "bei 7.1 bleiben oder -STABLE nehmen". Ich denke du hast (im IRC) meine Skepsis gegenüber -STABLE bemerkt. Mal angenommen ich bleibe bei 7.1 und ich installiere über den von dir beschriebenen Weg die neuen jails. Muss ich dann um 7.2 zu bekommen (sobald es erschienen ist) auch das System aus den Sourcen übersetzen oder kann ich freebsd-update nutzen? Weil eigentlich Untersucht freebsd-update ja das System und müsste feststellen "jails ist schon aktuell" bzw. "bei den jails muss ich nicht alles holen". Dann würde ich nämlich 7.1 bevorzugen..

Und dann noch eine reine Verständnisfrage (bitte nicht als Quängeln auffassen): jails sind derzeit (in 7.1) kaputt, richtig? Egal was jetzt der Bug ist. Wäre das nicht eigentlich einen "offiziellen" Backport der Fehlerkorrektur wert?

Gruß
 
jails sind unter 7.1 nicht kaputt. wie kommst du zu der annahme? der patch kümmert sich in erster linie darum, dass man einer jail mehrere, gar keine oder ipv6-adressen zuweisen kann.
 
Jails funktionieren, da hast du recht.Was genau kaputt ist, weiß ich nicht, dazu bin ich zu sehr Laie. Also sorry für die "Unterstellung".

Der Patch - so habe ich das verstanden - sorgt wohl dafür, dass "jails2" im System sind, mit den von dir genannten Verbesserungen. Gleichzeitig behebt er jedoch das genannte Problem.

amd64 jails auf einem amd64-System laufen gut, da hast du Recht.

Gruß und sorry für die Mißverständnisse.. :)
 
Also, das sind ja im Prinzip zwei Fragen:

freebsd-update(8) ist ein Tool, welches zwischen offiziell veröffentlichten FreeBSD-Versionen Aktualisierungen durchführen kann. Dazu benötigt es zwei Dinge. Das erste ist eine definierte Zielversion, also etwas wir "FreeBSD 7.1-p2". -STABLE ist aber nicht definiert, rein theoretisch ist ein jetzt gebautes -STABLE eine andere Version als das, was ich mir nur eine Sekunde später ziehe. Da es in der Zwischenzeit Änderungen gegeben haben könnte, die keinerlei Versionsnummer erhöhen gibt es also kein "definiertes Ziel". Es gab mal den Vorschlag die Snapshots von -CURRENT und von -STABLE per freebsd-update(8) zu verteilen, wurde aber abgelehnt, um die Hemmschwelle es zu nutzen nicht zuweit zu senken.
Nun braucht freebsd-update(8) aber auch eine definierte Ausgangsversion, zumindest in Theorie. Du kannst entsprechend dein -STABLE später nicht mit freebsd-update(8) auf ein 7.2 hochziehen, allerdings ist die Wahrscheinlichkeit gar nicht mal so gering, dass es dennoch klappt. Du musst 7.2 manuell bauen, darauf aktualisieren und kannst dann wieder freebsd-update(8) nutzen, da 7.2 ja eine definierte Version ist.

Die Jails wurden ja eigentlich schon beantwortet. Der Patch fügt die Jail2 in das Basissystem ein, was ein massiver Eingreif ist. Das wird unter Garantie niemals in das 7.1 noch reingepatcht, dort würde man es allenfalls machen, wenn die Jails an sich defekt wären. Nur das zu extrahieren wsr Crossplattform-Jails erlaubt, dürfte auch unmöglich sein. Dafür ist die Reihe der Änderungen zu groß. Du siehst, einen Tod musst du sterben. Ob das nun 8.0-CURRENT ist (was ich nicht empfehlen würde), oder aber 7.1 mit Patch oder -STABLE (das nimmt sich beides eigentlich nicht viel) musst du wissen. :)
 
Moin,

danke für die ausführliche (!) Erklärung. Hm, nach langer Überlegung welchen Tod ich denn sterben möchte habe ich mir eine weitere Alternative überlegt, mit der ich mich am Besten anfreunden kann und es deswegen zuerst auf diesem Weg teste:

Ich installiere FreeBSD 7.1/i386 in qemu und teste wie schnell die problematischen Ports damit sind. Ist das zu langsam, wähle ich einen neuen Tod :)

Gruß und Danke!

PS: Natürlich bin ich am Werdegang dieses Themas weiterhin interessiert. :)
 
So, ich habe es mit den Ports hin. Ich schrieb oben ja, dass nicht alle Ports bauen. Nähere Analyse hat ergeben, dass uname schuld ist. uname ließt seine Daten aus dem Kernel, schreibt diese dann auf STDOUT. Auch im i386-Jail gibt "uname -m" daher "amd64" aus, das verwirrt einige Ports und es geschehen seltsame Dinge. Die Lösung ist entsprechend einfach, wir schieben uname per Umgebungsvariablen neue Daten unter. Einfach zwei Stück setzen und schon bauen die Ports:
Code:
setenv UNAME_p i386
setenv UNAME_m i386
 
So, ein kleines Update:

Aktuell läuft FreeBSD-7.2-beta1. Ich habe ein Jail eingerichtet und die 2 Variablen wie von Yamagi beschrieben gesetzt. Derzeit baut "mc". Es scheint also tatsächlich zu funktionieren. Ich freue mich auf 7.2! :)
 
Hm, geht da auch wine und der linuxulator? Außer für Spiele, braucht man doch eh kein 32Bit, oder?
 
Nein, wine funktioniert nicht. Stürzt mit Signal 10 aka SIGBUS ab. Der Linuxulator funktioniert auch auf dem Host einwandfrei, denn er läuft immer als Linux/i386. Ein amd64-Linuxulator ist geplant, aber noch nicht da.
 
Kann das immer noch jemand bestätigen das Wine in einer i386 Jail auf einem amd64 System läuft?

Gibt es Anleitungen zum Bauen einer solchen Jail?

Mfg KO
 
Nein, es läuft nicht. Wine verlangt ein bestimmtes Prozesslyout seitens des Betriebssystems, was unter einem FreeBSD/amd64 immer anders ist als unter FreeBSD/i386. Auch im i386-Jail funktioniert Wine daher nicht, es stürzt mit SIGBUS ab.

Zum Bauen einer i386-Jails schaue mal in diesem Thread ab dem verlinkten Beitrag. Es ist sehr knapp gehaöten und eine bessere Anleitung steht auf meiner Liste, aber für den Anfang erklärt es zumindest das Wesentliche: http://www.bsdforen.de/showthread.php?p=195092#post195092
 
Zurück
Oben