From owner-svn-doc-all@freebsd.org Wed May 18 19:55:48 2016 Return-Path: Delivered-To: svn-doc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 988C6B41961; Wed, 18 May 2016 19:55:48 +0000 (UTC) (envelope-from bhd@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 362281A32; Wed, 18 May 2016 19:55:48 +0000 (UTC) (envelope-from bhd@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u4IJtlwK008670; Wed, 18 May 2016 19:55:47 GMT (envelope-from bhd@FreeBSD.org) Received: (from bhd@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u4IJtlio008669; Wed, 18 May 2016 19:55:47 GMT (envelope-from bhd@FreeBSD.org) Message-Id: <201605181955.u4IJtlio008669@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bhd set sender to bhd@FreeBSD.org using -f From: Bjoern Heidotting Date: Wed, 18 May 2016 19:55:47 +0000 (UTC) To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r48830 - head/de_DE.ISO8859-1/books/handbook/linuxemu X-SVN-Group: doc-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-doc-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire doc trees \(except for " user" , " projects" , and " translations" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 May 2016 19:55:48 -0000 Author: bhd Date: Wed May 18 19:55:47 2016 New Revision: 48830 URL: https://svnweb.freebsd.org/changeset/doc/48830 Log: Update to r48090: Patch to get straight to r48090. Reviewed by: bcr Differential Revision: https://reviews.freebsd.org/D6440 Modified: head/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.xml Modified: head/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.xml ============================================================================== --- head/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.xml Wed May 18 00:18:50 2016 (r48829) +++ head/de_DE.ISO8859-1/books/handbook/linuxemu/chapter.xml Wed May 18 19:55:47 2016 (r48830) @@ -5,10 +5,10 @@ $FreeBSD$ $FreeBSDde: de-docproj/books/handbook/linuxemu/chapter.xml,v 1.94 2012/04/30 17:13:51 bcr Exp $ - basiert auf: r40979 + basiert auf: r48090 --> - Linux-Binärkompatibilität + &linux;-Binärkompatibilität JimMockRestrukturiert und teilweise aktualisiert von @@ -22,8 +22,6 @@ - - Übersicht @@ -34,298 +32,182 @@ Linux - FreeBSD bietet Binärkompatibilität zu verschiedenen - anderen &unix; Betriebssystemen, darunter auch Linux. Nun - könnten Sie sich fragen, warum FreeBSD in der Lage sein - muss, Linux-Binärprogramme auszuführen? Die Antwort - auf diese Frage ist sehr einfach. Viele Unternehmen und Entwickler - programmieren bzw. entwickeln nur für Linux, da es - das Neueste und Beste in der Computerwelt ist. - Für uns FreeBSD-Anwender heißt dies, genau diese Unternehmen - und Entwickler zu bitten, FreeBSD-Versionen ihrer Programme - herauszubringen. Das Problem dabei ist nur, dass die meisten dieser - Firmen trotzdem nicht erkennen, wie viele zusätzliche - Anwender ihre Produkte benutzen würden, wenn es auch - FreeBSD-Versionen gäbe, und daher weiterhin - ausschließlich für Linux entwickeln. Was also kann ein - FreeBSD-Anwender tun? Genau an diesem Punkt kommt die Linux- - Binärkompatibilität ins Spiel. - - Um es auf den Punkt zu bringen, genau diese Kompatibilität - erlaubt es FreeBSD-Anwendern, etwa 90 % aller Linux-Anwendungen - ohne Code-Änderungen zu verwenden. Dies schließt - solche Anwendungen wie &staroffice;, - Open Office, die Linux-Versionen von - &adobe; &acrobat;, - &realplayer;, - &oracle;, - Doom, - Quake und viele andere ein. Es wird - sogar berichtet, dass diese Linux-Anwendungen in manchen - Fällen unter FreeBSD eine bessere Leistung als unter - Linux aufweisen. - - Allerdings gibt es nach wie vor einige Linux-spezifische - Betriebssystem-Eigenschaften, die unter FreeBSD nicht - unterstützt werden. Linux-Anwendungen, die - &i386;-spezifische Aufrufe (wie die Aktivierung des - virtuellen 8086-Modus) verwenden, funktionieren - unter FreeBSD leider nicht. + &os; bietet 32-Bit-Binärkompatibilität zu &linux;, so dass + Benutzer 32-Bit &linux; Anwendungen auf einem &os;-System + installieren und ausführen können, ohne die Binärdatei ändern zu + müssen. Es wurde sogar berichtet, dass in einigen Situationen + die 32-Bit &linux; Anwendungen auf &os; besser laufen als unter + &linux;. + + Allerdings werden einige &linux;-spezifischen Merkmale nicht + von &os; unterstützt. &linux;-Anwendungen, die + &i386;-spezifische Aufrufe, wie bspw. die Aktivierung + des virtuellen 8086-Modus verwenden, werden derzeit nicht + unterstützt. + + Nach dem Lesen dieses Kapitels werden Sie wissen: - Nach dem Lesen dieses Kapitels werden Sie - wissen, wie Sie die Linux-Binärkompatibilität - installieren bzw. aktivieren. + Wie Sie die &linux;-Binärkompatibilität + aktivieren. - Wissen, wie man zusätzliche Linux-Systembibliotheken - unter FreeBSD installiert. + Wie zusätzliche &linux;-Systembibliotheken installiert + werden. - Linux-Anwendungen unter FreeBSD installieren können. + Wie Sie &linux;-Anwendungen unter &os; + installieren. - Wissen, wie die Linux-Binärkompatibilität - unter FreeBSD verwirklicht wurde. + Wie die &linux;-Binärkompatibilität unter &os; + implementiert ist. - Bevor Sie dieses Kapitel lesen, sollten Sie + Bevor Sie dieses Kapitel lesen, sollten Sie wissen: - wissen, wie man Software Dritter installiert - (). + Wie Sie + Software von Drittanbietern installieren. - Installation + Konfiguration der &linux;-Binärkompatibilität - KLD (kernel loadable object) + Ports-Sammlung - Die Linux-Binärkompatibilität ist per Voreinstellung - nicht aktiviert. Der einfachste Weg, dies zu tun, ist das - Linux KLD (Kernel LoaDable object) - zu laden. Dies erreichen Sie durch die Eingabe des folgenden - Befehls: + Die &linux;-Binärkompatibilität ist per Voreinstellung + nicht aktiviert und auch &linux;-Bibliotheken werden nicht + installiert. &linux;-Bibliotheken können entweder manuell, + oder aus der &os; Ports-Sammlung installiert werden. - &prompt.root; kldload linux + Bevor Sie versuchen den Port zu bauen, laden Sie das + &linux;-Kernelmodul, da ansonsten der Bau fehlschlägt: - Wollen Sie die Linux-Binärkompatibilität dauerhaft - aktivieren, sollten Sie die folgende Zeile in - /etc/rc.conf einfügen: - - linux_enable="YES" + &prompt.root; kldload linux - Der &man.kldstat.8;-Befehl kann benutzt werden, um - festzustellen, ob KLD geladen wurde: + Prüfen Sie, ob das Modul geladen wurde: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko + + Der einfachste Weg um einen Basissatz von + &linux;-Bibliotheken und Binärdateien auf einem &os;-System zu + installieren, ist über den Port oder das Paket + emulators/linux_base-c6. So installieren Sie + das Paket: + + &prompt.root; printf "compat.linux.osrelease=2.6.18\n" >> /etc/sysctl.conf +&prompt.root; sysctl compat.linux.osrelease=2.6.18 +&prompt.root; pkg install emulators/linux_base-c6 + + Wollen Sie die &linux;-Binärkompatibilität beim Systemstart + aktivieren, fügen Sie folgende Zeile in + /etc/rc.conf hinzu: + + linux_enable="YES" + Kerneloptionen COMPAT_LINUX - Wenn Sie das KLD nicht laden können oder wollen, besteht - auch die Möglichkeit, die Linux-Binärkompatibiltät - statisch in den Kernel einzubinden. Dazu fügen Sie Ihrer - Kernelkonfigurationsdatei den Eintrag - options COMPAT_LINUX - hinzu. Anschließend installieren Sie Ihren neuen Kernel - wie in beschrieben. + Benutzer, die es vorziehen, &linux;-Binärkompatibilität + statisch in den Kernel zu linken, müssen + options COMPAT_LINUX in die + Kernelkonfigurationsdatei aufnehmen und anschließend einen neuen + Kernel installieren. Dies ist in + beschrieben. + + + Manuelle Installation zusätzlicher Bibliotheken - - Linux-Laufzeitbibliotheken installieren - Linux - Linux-Laufzeitbibliotheken installieren + Gemeinsam benutzte Bibliotheken - Dies kann auf zwei Arten geschehen, entweder über den - linux_base-Port - oder durch manuelle - Installation der Bibliotheken. - - - Installation unter Verwendung des linux_base-Ports - Ports-Sammlung - - Dies ist die einfachste Methode, um die Laufzeitbibliotheken - zu installieren. Sie funktioniert genauso wie die - Installation eines beliebigen anderen Ports aus der - Ports-Sammlung. - Dazu machen Sie einfach folgendes: - - &prompt.root; cd /usr/ports/emulators/linux_base-f10 -&prompt.root; make install distclean - - - Bei &os;-Systemen vor &os; 8.0 müssen Sie den Port - emulators/linux_base-fc4 - anstatt emulators/linux_base-f10 - installieren. - - - Sie sollten nun über eine funktionierende - Linux-Binärkompatibilität verfügen. Einige - Programme könnten sich zwar über falsche - Unterversionsnummern der Systembibliotheken beschweren, dies ist - im Allgemeinen aber kein Problem. - - - Unter Umständen gibt es mehrere Versionen des - Ports emulators/linux_base. - Die Ports entsprechen unterschiedlichen Versionen - verschiedener Linux-Distributionen Sie sollten den - Port installieren, der am besten die Anforderungen - der Linux-Anwendung erfüllt. - - - - - Manuelle Installation der Bibliotheken - - Wenn Sie die Ports-Sammlung nicht installiert - haben, können Sie die Bibliotheken auch manuell - installieren. Dazu brauchen Sie die jeweiligen - Linux-Systembibliotheken, die das zu installierende Programm - verwendet sowie den Laufzeit-Linker. Zusätzlich müssen - Sie auf Ihrem FreeBSD-System einen - virtuellen Verzeichnisbaum für die - Linux-Bibliotheken einrichten. Alle unter FreeBSD gestarteten - Linux-Programme suchen zuerst in diesem Verzeichnisbaum - nach Systembibliotheken. Wenn also ein Linuxprogramm beispielsweise - /lib/libc.so lädt, versucht FreeBSD - zuerst, /compat/linux/lib/libc.so laden. - Ist diese Datei nicht vorhanden, wird - /lib/libc.so geladen. Systembibliotheken - sollten daher besser in den virtuellen Verzeichnisbaum - /compat/linux/lib als in den vom - Linux-ld.so vorgeschlagenen installiert - werden. - - Im Allgemeinen müssen Sie nur zu Beginn nach den - Systembibliotheken suchen, die von Linuxprogrammen - benötigt werden. Nach den ersten Installationen von - Linuxprogrammen auf Ihrem FreeBSD-System verfügen Sie - über eine Sammlung von Linux-Systembibliotheken, - die es Ihnen ermöglichen wird, neue Linuxprogramme - ohne Zusatzarbeit zu installieren. - - - - Installation zusätzlicher Systembibliotheken - Shared-Libraries - - Was passiert, wenn Sie den linux_base-Port - installieren, und Ihr Programm beschwert sich trotzdem - über fehlende Systembibliotheken? Woher wissen Sie, - welche Systembibliotheken von Linux-Binärprogrammen - benötigt werden, und wo Sie diese finden? Grundsätzlich - gibt es dafür zwei Möglichkeiten (um dieser - Anleitung zu folgen, müssen Sie unter - FreeBSD als Benutzer root angemeldet - sein): - - Wenn Sie Zugriff auf ein Linux-System haben, können - Sie dort nachsehen, welche Systembibliotheken eine Anwendung - benötigt, und diese auf Ihr FreeBSD-System kopieren. - Dazu folgendes Beispiel: - - - Nehmen wir an, Sie haben FTP verwendet, um die - Linux-Binärversion von Doom - zu bekommen und haben sie auf Ihrem Linux-System installiert. - Nun können Sie überprüfen, welche - Systembibliotheken das Programm benötigt, indem Sie - ldd linuxdoom eingeben. Das Resultat - sieht dann so aus: + Wenn sich eine &linux;-Anwendung über fehlende + Bibliotheken beschwert nachdem die + &linux;-Binärkompatibilität installiert wurde, finden Sie + heraus welche Bibliothken die Anwendung benötigt und + installieren Sie diese manuell. + + Mit ldd können Sie unter &linux; + bestimmen, welche gemeinsam benutzten Bibliotheken eine + Anwendung benötigt. Wenn Sie herausfinden wollen, welche + Bibliotheken linuxdoom benötigt, können Sie + folgenden Befehl auf einem &linux;-System ausführen, welches + Doom installiert hat: - &prompt.user; ldd linuxdoom + &prompt.user; ldd linuxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 - symbolische Links - Sie müssten nun alle Dateien aus der - letzten Spalte kopieren und sie unter - /compat/linux speichern, wobei - die Namen der ersten Spalte als symbolische Links auf - diese Dateien zeigen. Damit haben Sie schließlich - folgende Dateien auf Ihrem FreeBSD-System: + Kopieren Sie alle Dateien aus der letzten Spalte der + Ausgabe von einem &linux;-System auf das &os;-System in das + Verzeichnis /compat/linux. Nach dem + Kopieren erstellen Sie symbolische Links auf die Namen in der + ersten Spalte. In diesem Beispiel werden folgende Dateien auf + dem &os;-System installiert: - /compat/linux/usr/X11/lib/libXt.so.3.1.0 + /compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 -
- - Beachten Sie, dass wenn Sie bereits eine - Linux-Systembibliothek einer zur ersten Spalte - passenden Hauptversionsnummer (laut - ldd-Ausgabe) besitzen, Sie die Datei - aus der zweiten Spalte nicht mehr kopieren müssen, - da die bereits vorhandene Version funktionieren sollte. - Hat die Systembibliothek jedoch eine neuere - Versionsnummer, sollten Sie sie dennoch kopieren. - Sie können die alte Version löschen, solange - Sie einen symbolischen Link auf die neue - Version anlegen. Wenn Sie also folgende Bibliotheken - auf Ihrem System installiert haben: + Wenn Sie bereits eine &linux;-Bibliothek einer zur + ersten Spalte passenden Hauptversionsnummer besitzen, muss sie + nicht mehr kopiert werden, da die bereits vorhandene Version + funktionieren sollte. Hat die Bibliothek jedoch eine neuere + Versionsnummer, sollten Sie sie dennoch kopieren. Sie können + die alte Version löschen, solange Sie einen symbolischen Link + auf die neue Version anlegen. + + Folgende Bibliotheken existieren bereits auf dem + &os;-System: - /compat/linux/lib/libc.so.4.6.27 + /compat/linux/lib/libc.so.4.6.27$ /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 - und Sie haben eine neue Binärdatei, die - laut ldd - eine neuere Bibliothek benötigt: - - libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 - - Wenn diese sich nur um ein oder zwei Stellen - in der Unterversionsnummer unterscheiden, müssen - Sie /lib/libc.so.4.6.29 - nicht auf Ihr System kopieren, da das Programm auch - mit der etwas älteren Version ohne Probleme - funktionieren sollte. Wenn Sie wollen, - können Sie libc.so aber - dennoch ersetzen (das heißt aktualisieren), was dann zu - folgender Ausgabe führt: + ldd zeigt an, dass eine Anwendung eine + neuere Version benötigt: - /compat/linux/lib/libc.so.4.6.29 + libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 + + Wenn diese Bibliotheken sich nur um ein oder zwei Stellen + in der Unterversionsnummer unterscheiden, sollte das Programm + dennoch mit der älteren Version funktionieren. Wenn Sie + wollen, können Sie die bestehende libc.so + durch die neuere Version ersetzen: + + /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 - -
-
- - Der Mechanismus der symbolischen Links wird - nur für Linux-Binärdateien - benötigt. Der FreeBSD-Laufzeitlinker sucht - sich die passenden Hauptversionsnummern selbst, - das heißt Sie müssen sich nicht darum - kümmern. - -
-
-
+ Der Mechanismus der symbolischen Links wird nur für + &linux;-Binärdateien benötigt. Nach einer Weile wird es eine + ausreichende Menge an &linux;-Bibliotheken auf dem System + geben, sodass Sie neu installierte &linux;-Anwendungen ohne + zusätzlichen Aufwand auf dem System laufen lassen + können.
- Linux ELF-Binärdateien installieren + &linux; ELF-Binärdateien installieren + Linux ELF-Binärdatei @@ -333,75 +215,81 @@ libc.so.4 (DLL Jump 4.5pl26) => /lib/ ELF-Binärdateien benötigen manchmal eine zusätzliche Kennzeichnung. Wenn Sie versuchen, eine nicht - gekennzeichnete ELF-Binärdatei auszuführen, - werden Sie eine Fehlermeldung ähnlich der folgenden - erhalten: + gekennzeichnete ELF-Binärdatei auszuführen, werden Sie eine + Fehlermeldung ähnlich der folgenden erhalten: &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort - Damit der FreeBSD-Kernel eine Linux-ELF-Datei von einer - FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug + Damit der &os;-Kernel eine &linux;-ELF-Datei von einer + &os;-ELF-Datei unterscheiden kann, gibt es das Werkzeug &man.brandelf.1;. &prompt.user; brandelf -t Linux my-linux-elf-binary GNU Werkzeuge - Die GNU Werkzeuge schreiben nun automatisch die - passende Kennzeichnungsinformation in die ELF-Binärdateien, - so dass Sie diesen Schritt in Zukunft nur noch selten benötigen - werden. + + Die GNU Werkzeuge schreiben nun automatisch die passende + Kennzeichnungsinformation in die ELF-Binärdateien, so dass Sie + diesen Schritt in Zukunft nur noch selten benötigen. - Installieren einer beliebigen RPM-basierten Linuxanwendung + Installieren einer <acronym>RPM</acronym>-basierten + &linux;-Anwendung - &os; besitzt seine eigene Paketdatenbank und diese wird dazu - verwendet, um alle Ports (auch &linux;-Ports) zu verfolgen. Deshalb - wird die &linux; RPM-Datenbank nicht benutzt (fehlende - Unterstützung). - - Falls Sie jedoch eine beliebige RPM-basierte &linux;-Anwendung - installieren wollen, erreichen Sie das mittels: + Wenn Sie eine &linux; RPM-basierte + Anwendung installieren möchten, installieren Sie zunächst den + Port oder das Paket archivers/rpm4. + Anschließend kann der Superuser das folgende Kommando + benutzen, um ein .rpm zu + installieren: &prompt.root; cd /compat/linux -&prompt.root; rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id +&prompt.root; rpm2cpio < /pfad/zum/linux.archiv.rpm | cpio -id - Benutzen Sie dann brandelf auf die installierten - ELF-Binärdateien (nicht die Bibliotheken!). Sie werden keine - saubere Deinstallation hinbekommen, aber evtl. helfen ein paar Tests - weiter. + Fall notwendig, benutzen Sie brandelf + auf den installierten ELF-Binärdateien. Beachten Sie, dass + dies eine saubere Deinstallation verhindert. Namensauflösung konfigurieren - Wenn DNS nicht funktioniert, oder Sie folgende Fehlermeldung - erhalten: + Wenn DNS nicht funktioniert, oder die + folgende Fehlermeldung erscheint: resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword - müssen sie /compat/linux/etc/host.conf - wie folgt anlegen: + müssen Sie + /compat/linux/etc/host.conf wie folgt + bearbeiten: order hosts, bind multi on Diese Reihenfolge legt fest, dass zuerst - /etc/hosts und anschließend DNS - durchsucht werden. Wenn - /compat/linux/etc/host.conf nicht vorhanden - ist, finden Linux-Anwendungen FreeBSD's + /etc/hosts und anschließend + DNS durchsucht werden. Wenn + /compat/linux/etc/host.conf nicht + vorhanden ist, nutzen &linux;-Anwendungen /etc/host.conf und - beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie - keinen Nameserver (in /etc/resolv.conf) + beschweren sich über die inkompatible &os;-Syntax. Wenn Sie + in /etc/resolv.conf keinen Nameserver konfiguriert haben, sollten Sie den Eintrag bind entfernen.
+ &mathematica; installieren @@ -1290,169 +1178,126 @@ export PATH genau so, wie Sie dies auch unter Linux tun würden. + ?> Weiterführende Themen - Wenn Sie sich fragen, wie die Linux-Binärkompatibilität - unter FreeBSD realisiert wurde, sollten Sie diesen Abschnitt lesen. - Der Großteil der folgenden Informationen stammt aus einer - E-Mail, die von Terry Lambert (tlambert@primenet.com) - an die FreeBSD-Chat-Mailingliste - (freebsd-chat@FreeBSD.org) geschrieben wurde - (Message ID: <199906020108.SAA07001@usr09.primenet.com>). + Dieser Abschnitt beschreibt wie die + &linux;-Binärkompatibilität funktioniert. Die folgenden + Informationen stammen aus einer E-Mail, die von Terry Lambert + (tlambert@primenet.com) an &a.chat; geschrieben + wurde (Message ID: + <199906020108.SAA07001@usr09.primenet.com>). - - Wie funktioniert es? execution class loader - FreeBSD verfügt über eine execution class - loader genannte Abstraktion. Dabei handelt es sich um einen - Eingriff in den &man.execve.2; Systemaufruf. - - FreeBSD verfügt über eine Liste von Ladern, anstelle - eines einzigen, auf #! - zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte - auszuführen. + &os; verfügt über eine + execution class loader genannte Abstraktion. + Dabei handelt es sich um einen Eingriff in den &man.execve.2; + Systemaufruf. Historisch gesehen untersuchte der einzige, auf - UNIX-Plattformen vorhandene Lader die "magische Zahl" + &unix;-Plattformen vorhandene Lader die "magische Zahl" (in der Regel die ersten 4 oder 8 Bytes der Datei), um festzustellen, ob der Binärtyp dem System bekannt war. War dies der Fall, wurde der Binärlader aufgerufen. Wenn es sich nicht um den zum System gehörigen Binärtyp - handelte, gab &man.execve.2; einen Fehler zurück, - und die Shell versuchte stattdessen, die Datei als Shell-Befehl - auszuführen. - - Dabei wurde als Standardeinstellung was auch immer die - aktuelle Shell ist festgelegt. + handelte, gab &man.execve.2; einen Fehler zurück, und die + Shell versuchte stattdessen, die Datei als Shell-Befehl + auszuführen. Dabei wurde als Standardeinstellung + was auch immer die aktuelle Shell ist + festgelegt. Später wurde ein Hack in &man.sh.1; eingefügt, der die zwei ersten Zeichen untersuchte. Wenn diese :\n entsprachen, - wurde stattdessen die &man.csh.1;-Shell aufgerufen - (wir glauben, dass dies zuerst von SCO umgesetzt wurde). + wurde stattdessen die &man.csh.1;-Shell aufgerufen. - FreeBSD versucht heute eine Liste von Ladern, unter denen - sich ein allgemeiner Lader für Interpreter befindet. Der - auszuführende Interpreter wird im ersten, durch - Leerzeichen getrennten Feld, der #!-Zeile - angegeben. Lässt sich der Interpreter nicht ermitteln, - wird auf /bin/sh zurückgegriffen. + FreeBSD verfügt über eine Liste von Ladern, anstelle + eines einzigen, auf #! + zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte + auszuführen. ELF - - Für die Linux ABI-Unterstützung erkennt FreeBSD - die magische Zahl als ELF-Binärdatei (Zu diesem Zeitpunkt wird - nicht zwischen FreeBSD, &solaris;, Linux oder anderen Systemen - unterschieden, die über ELF-Binärdateien - verfügen.). - Solaris - Der ELF-Lader sucht nach einer speziellen - Kennzeichnung, die aus einem Kommentarabschnitt - in der ELF-Datei besteht, und die in SVR4/&solaris; ELF - Binärdateien nicht vorhanden ist. - - Damit Linux-Binärdateien (unter FreeBSD) funktionieren, - müssen sie als Linux - gekennzeichnet werden, und zwar durch - &man.brandelf.1;: + Für die &linux; ABI-Unterstützung + erkennt &os; die magische Zahl als ELF-Binärdatei. Der + ELF-Lader sucht nach einer speziellen + Kennzeichnung, die aus einem + Kommentarabschnitt in der ELF-Datei besteht, und die in + SVR4/&solaris; ELF Binärdateien nicht vorhanden ist. + + Damit &linux;-Binärdateien unter &os; funktionieren, müssen + sie mit &man.brandelf.1; als Linux + gekennzeichnet werden: &prompt.root; brandelf -t Linux file - Nachdem dies geschehen ist, erkennt der ELF-Lader die - Linux-Kennzeichnung der Datei. - ELF - brandelf + ELF + Kennzeichnung Wenn der ELF-Lader die Linux-Kennzeichnung sieht, wird ein Zeiger in der proc-Struktur - ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert - (in einem traditionellen &unix; System wäre das ein - sysent[]-Strukturfeld, das die Systemaufrufe - enthält). Der Prozess wird weiterhin speziell gekennzeichnet, + ersetzt. Alle Systemaufrufe werden durch diesen Zeiger + indiziert. Der Prozess wird weiterhin speziell gekennzeichnet, so dass der Trap-vector im Signal-trampoline-code eine spezielle - Behandlung erfährt und das Linux-Kernelmodul verschiedene + Behandlung erfährt und das &linux;-Kernelmodul verschiedene kleinere Korrekturen vornehmen kann. - Der Linux-Systemaufrufvektor enthält neben anderen + Der &linux;-Systemaufrufvektor enthält neben anderen Dingen eine Liste der sysent[]-Einträge, deren Adressen sich im Kernelmodul befinden. - Wenn ein Linux-Programm einen Systemaufruf ausführt, - dereferenziert die Trap-Behandlungsroutine den Zeiger auf die - Eintrittspunkte für die Systemaufrufe und erhält damit die - Linux-Eintrittspunkte und nicht die FreeBSD-Eintrittspunkte. + Wenn ein &linux;-Programm einen Systemaufruf ausführt, + dereferenziert die Trap-Behandlungsroutine den Zeiger für den + Systemaufruf aus der proc-Struktur und + erhält damit die &linux;-Eintrittspunkte für den + Systemaufruf. Zusätzlich verändert der - Linuxmodus die Systempfade dynamisch; genauso, wie dies die + &linux;-Modus die Systempfade dynamisch; genauso, wie dies die Option beim Einbinden von Dateisystemen - macht (Achtung: nicht das Dateisystem unionfs!). - Zuerst wird die Datei im Verzeichnis /compat/linux/Originalpfad - gesucht, danach, wenn sie dort nicht gefunden - wurde, wird sie im FreeBSD-Verzeichnis - /Originalpfad - gesucht. Dadurch wird sichergestellt, dass - Binärdateien, die zur Ausführung andere - Binärdateien benötigen, ausgeführt - werden können (so dass alle Linux-Werkzeuge unter der - ABI laufen). Dies bedeutet auch, - dass Linux-Binärdateien FreeBSD-Binärdateien - laden und ausführen können, wenn keine passenden - Linux-Binärdateien vorhanden sind. Ein in - /compat/linux plaziertes &man.uname.1; kann - damit Linux-Programmen vorgaukeln, dass sie auf einem Linux-System - laufen. - - Im Endeffekt gibt es einen Linux-Kernel innerhalb des - FreeBSD-Kernels. Die Sprungtabellen für Linux- - beziehungsweise FreeBSD-Systemaufrufe verweisen allerdings auf - dieselben Funktionen, die Kerneldienste wie Dateisystemoperationen, - Operationen für den virtuellen Speicher, - Signalübermittlung und System V IPC bereitstellen, - Der einzige Unterschied ist, dass Binärdateien unter FreeBSD - FreeBSD-glue-Funktionen verwenden. - Linux-Binärdateien hingegen verwenden die - Linux-glue-Funktionen. Die meisten - älteren Betriebssysteme hatten ihre eigenen - glue-Funktionen: Funktionsadressen - in einem globalen, statischen sysent[] - Strukturfeld an Stelle von Funktionsadressen, die durch - einen dynamisch initialisierten Zeiger aus der - proc Struktur, die den Aufruf gemacht hatte, - dereferenziert wurden. - - Welche ist die echte FreeBSD-ABI? Das spielt keine Rolle. - Grundsätzlich ist der einzige Unterschied (zurzeit - ist das so; dies könnte sich in zukünftigen - Versionen leicht ändern und wird sich wahrscheinlich - auch ändern), dass die - FreeBSD-glue-Funktionen statisch in - den Kernel gelinkt sind, und dass die - Linux-glue-Funktionen statisch gelinkt - oder über ein Modul eingebunden werden können. - - Ja, aber ist das wirkliche eine Emulation? Nein. Es ist eine - Implementierung eines ABIs, keine Emulation. Es ist kein Emulator - (oder Simulator, um der nächsten Frage zuvorzukommen) - beteiligt. - - Warum wird es manchmal Linux-Emulation genannt? - Um es schwerer zu machen, FreeBSD zu verkaufen. Wirklich, das kommt - daher, weil dies zu einer Zeit implemtiert wurde, - in der es kein anderes Wort - (als Emulation) gab, das beschrieb, was vor sich ging. - Wenn der Kernel nicht entsprechend konfiguriert wurde oder das - Modul geladen wurde, war es falsch zu behaupten, FreeBSD würde - Linux-Binärprogramme ausführen. Man benötigte - ein Wort, das beschrieb, was da geladen - wurde – daher Der Linux-Emulator. - + macht. Zuerst wird die Datei im Verzeichnis + /compat/linux/Originalpfad gesucht, wenn + sie dort nicht gefunden wurde, wird sie im Verzeichnis + /Originalpfad gesucht. Dadurch wird + sichergestellt, dass Binärdateien, die zur Ausführung andere + Binärdateien benötigen, ausgeführt werden können (so dass alle + &linux;-Werkzeuge unter der ABI laufen). + Dies bedeutet auch, dass &linux;-Binärdateien + &os;-Binärdateien laden und ausführen können, wenn keine + passenden &linux;-Binärdateien vorhanden sind. Ein in + /compat/linux plaziertes &man.uname.1; + kann damit &linux;-Programmen vorgaukeln, dass sie auf einem + &linux;-System laufen. + + Im Endeffekt gibt es einen &linux;-Kernel innerhalb des + &os;-Kernels. Die Sprungtabellen für &linux;- beziehungsweise + &os;-Systemaufrufe verweisen allerdings auf dieselben + Funktionen, die Kerneldienste wie Dateisystemoperationen, + Operationen für den virtuellen Speicher, Signalübermittlung + und System V IPC bereitstellen. Der einzige + Unterschied ist, dass Binärdateien unter &os; + &os;-glue-Funktionen verwendet werden. + &linux;-Binärdateien hingegen verwenden die + &linux;-glue-Funktionen. + &os;-glue-Funktionen sind statisch in + den Kernel gelinkt, + &linux;-glue-Funktionen sind statisch + gelinkt oder können über ein ladbares Kernelmodul eingebunden + werden. + + Technisch gesehen ist dies nicht wirklich eine Emulation, + sondern eine ABI-Implementation. Es wird + manchmal &linux; Emulation genannt, da es zu + einer Zeit implementiert wurde, in der es kein anderes Wort + gab, das beschrieb, was vor sich ging. Es war falsch zu + behaupten, &os; würde &linux;-Binärprogramme ausführen, da der + Code nicht unter &os; übersetzt wurde.