Update to r48090:

Patch to get straight to r48090.

Reviewed by:	bcr
Differential Revision:	https://reviews.freebsd.org/D6440
This commit is contained in:
Bjoern Heidotting 2016-05-18 19:55:47 +00:00
parent eecf38c92c
commit aea8b161eb
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=48830

View file

@ -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
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="linuxemu">
<info><title>Linux-Binärkompatibilität</title>
<info><title>&linux;-Binärkompatibilität</title>
<authorgroup>
<author><personname><firstname>Jim</firstname><surname>Mock</surname></personname><contrib>Restrukturiert und teilweise aktualisiert von </contrib></author>
<!-- 22 Mar 2000 -->
@ -22,8 +22,6 @@
</authorgroup>
</info>
<sect1 xml:id="linuxemu-synopsis">
<title>Übersicht</title>
<indexterm>
@ -34,298 +32,182 @@
<secondary>Linux</secondary>
</indexterm>
<para>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
<quote>das Neueste und Beste</quote> 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.</para>
<para>&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;.</para>
<para>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 <application>&staroffice;</application>,
<application>Open Office</application>, die Linux-Versionen von
<application>&adobe;&nbsp;&acrobat;</application>,
<application>&realplayer;</application>,
<application>&oracle;</application>,
<application>Doom</application>,
<application>Quake</application> 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.</para>
<para>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.</para>
<para>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.</para>
<para>Nach dem Lesen dieses Kapitels werden Sie wissen:</para>
<para>Nach dem Lesen dieses Kapitels werden Sie</para>
<itemizedlist>
<listitem>
<para>wissen, wie Sie die Linux-Binärkompatibilität
installieren bzw. aktivieren.</para>
<para>Wie Sie die &linux;-Binärkompatibilität
aktivieren.</para>
</listitem>
<listitem>
<para>Wissen, wie man zusätzliche Linux-Systembibliotheken
unter FreeBSD installiert.</para>
<para>Wie zusätzliche &linux;-Systembibliotheken installiert
werden.</para>
</listitem>
<listitem>
<para>Linux-Anwendungen unter FreeBSD installieren können.</para>
<para>Wie Sie &linux;-Anwendungen unter &os;
installieren.</para>
</listitem>
<listitem>
<para>Wissen, wie die Linux-Binärkompatibilität
unter FreeBSD verwirklicht wurde.</para>
<para>Wie die &linux;-Binärkompatibilität unter &os;
implementiert ist.</para>
</listitem>
</itemizedlist>
<para>Bevor Sie dieses Kapitel lesen, sollten Sie</para>
<para>Bevor Sie dieses Kapitel lesen, sollten Sie wissen:</para>
<itemizedlist>
<listitem>
<para>wissen, wie man Software Dritter installiert
(<xref linkend="ports"/>).</para>
<para>Wie Sie <link linkend="ports">
Software von Drittanbietern installieren</link>.</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="linuxemu-lbc-install">
<title>Installation</title>
<title>Konfiguration der &linux;-Binärkompatibilität</title>
<indexterm><primary>KLD (kernel loadable object)</primary></indexterm>
<indexterm><primary>Ports-Sammlung</primary></indexterm>
<para>Die Linux-Binärkompatibilität ist per Voreinstellung
nicht aktiviert. Der einfachste Weg, dies zu tun, ist das
<literal>Linux</literal> KLD (<quote>Kernel LoaDable object</quote>)
zu laden. Dies erreichen Sie durch die Eingabe des folgenden
Befehls:</para>
<para>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.</para>
<para>Bevor Sie versuchen den Port zu bauen, laden Sie das
&linux;-Kernelmodul, da ansonsten der Bau fehlschlägt:</para>
<screen>&prompt.root; <userinput>kldload linux</userinput></screen>
<para>Wollen Sie die Linux-Binärkompatibilität dauerhaft
aktivieren, sollten Sie die folgende Zeile in
<filename>/etc/rc.conf</filename> einfügen:</para>
<programlisting>linux_enable="YES"</programlisting>
<para>Der &man.kldstat.8;-Befehl kann benutzt werden, um
festzustellen, ob KLD geladen wurde:</para>
<para>Prüfen Sie, ob das Modul geladen wurde:</para>
<screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.ko</screen>
<para>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
<package>emulators/linux_base-c6</package>. So installieren Sie
das Paket:</para>
<screen>&prompt.root; <userinput>printf "compat.linux.osrelease=2.6.18\n" >> /etc/sysctl.conf</userinput>
&prompt.root; <userinput>sysctl compat.linux.osrelease=2.6.18</userinput>
&prompt.root; <userinput>pkg install emulators/linux_base-c6</userinput></screen>
<para>Wollen Sie die &linux;-Binärkompatibilität beim Systemstart
aktivieren, fügen Sie folgende Zeile in
<filename>/etc/rc.conf</filename> hinzu:</para>
<programlisting>linux_enable="YES"</programlisting>
<indexterm>
<primary>Kerneloptionen</primary>
<secondary>COMPAT_LINUX</secondary>
</indexterm>
<para>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
<literal>options COMPAT_LINUX</literal>
hinzu. Anschließend installieren Sie Ihren neuen Kernel
wie in <xref linkend="kernelconfig"/> beschrieben.</para>
<para>Benutzer, die es vorziehen, &linux;-Binärkompatibilität
statisch in den Kernel zu linken, müssen
<literal>options COMPAT_LINUX</literal> in die
Kernelkonfigurationsdatei aufnehmen und anschließend einen neuen
Kernel installieren. Dies ist in <xref linkend="kernelconfig"/>
beschrieben.</para>
<sect2 xml:id="linuxemu-libs-manually">
<title>Manuelle Installation zusätzlicher Bibliotheken</title>
<sect2>
<title>Linux-Laufzeitbibliotheken installieren</title>
<indexterm>
<primary>Linux</primary>
<secondary>Linux-Laufzeitbibliotheken installieren</secondary>
<primary>Gemeinsam benutzte Bibliotheken</primary>
</indexterm>
<para>Dies kann auf zwei Arten geschehen, entweder über den
<link linkend="linuxemu-libs-port">linux_base</link>-Port
oder durch <link linkend="linuxemu-libs-manually">manuelle
Installation</link> der Bibliotheken.</para>
<para>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.</para>
<sect3 xml:id="linuxemu-libs-port">
<title>Installation unter Verwendung des linux_base-Ports</title>
<indexterm><primary>Ports-Sammlung</primary></indexterm>
<para>Mit <command>ldd</command> können Sie unter &linux;
bestimmen, welche gemeinsam benutzten Bibliotheken eine
Anwendung benötigt. Wenn Sie herausfinden wollen, welche
Bibliotheken <command>linuxdoom</command> benötigt, können Sie
folgenden Befehl auf einem &linux;-System ausführen, welches
<application>Doom</application> installiert hat:</para>
<para>Dies ist die einfachste Methode, um die Laufzeitbibliotheken
zu installieren. Sie funktioniert genauso wie die
Installation eines beliebigen anderen Ports aus der
<link xlink:href="file://localhost/usr/ports/">Ports-Sammlung</link>.
Dazu machen Sie einfach folgendes:</para>
<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-f10</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen>
<note>
<para>Bei &os;-Systemen vor &os;&nbsp;8.0 müssen Sie den Port
<package>emulators/linux_base-fc4</package>
anstatt <package>emulators/linux_base-f10</package>
installieren.</para>
</note>
<para>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.</para>
<note>
<para>Unter Umständen gibt es mehrere Versionen des
Ports <package>emulators/linux_base</package>.
Die Ports entsprechen unterschiedlichen Versionen
verschiedener Linux-Distributionen Sie sollten den
Port installieren, der am besten die Anforderungen
der Linux-Anwendung erfüllt.</para>
</note>
</sect3>
<sect3 xml:id="linuxemu-libs-manually">
<title>Manuelle Installation der Bibliotheken</title>
<para>Wenn Sie die <quote>Ports</quote>-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
<quote>virtuellen</quote> 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
<filename>/lib/libc.so</filename> lädt, versucht FreeBSD
zuerst, <filename>/compat/linux/lib/libc.so</filename> laden.
Ist diese Datei nicht vorhanden, wird
<filename>/lib/libc.so</filename> geladen. Systembibliotheken
sollten daher besser in den <quote>virtuellen</quote> Verzeichnisbaum
<filename>/compat/linux/lib</filename> als in den vom
Linux-<command>ld.so</command> vorgeschlagenen installiert
werden.</para>
<para>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.</para>
</sect3>
<sect3>
<title>Installation zusätzlicher Systembibliotheken</title>
<indexterm><primary>Shared-Libraries</primary></indexterm>
<para>Was passiert, wenn Sie den <filename>linux_base</filename>-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 <systemitem class="username">root</systemitem> angemeldet
sein):</para>
<para>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:</para>
<informalexample>
<para>Nehmen wir an, Sie haben FTP verwendet, um die
Linux-Binärversion von <application>Doom</application>
zu bekommen und haben sie auf Ihrem Linux-System installiert.
Nun können Sie überprüfen, welche
Systembibliotheken das Programm benötigt, indem Sie
<command>ldd linuxdoom</command> eingeben. Das Resultat
sieht dann so aus:</para>
<screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
<screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<indexterm><primary>symbolische Links</primary></indexterm>
<para>Sie müssten nun alle Dateien aus der
letzten Spalte kopieren und sie unter
<filename>/compat/linux</filename> 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:</para>
<para>Kopieren Sie alle Dateien aus der letzten Spalte der
Ausgabe von einem &linux;-System auf das &os;-System in das
Verzeichnis <filename>/compat/linux</filename>. 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:</para>
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -&gt; libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
<blockquote>
<note>
<para>Beachten Sie, dass wenn Sie bereits eine
Linux-Systembibliothek einer zur ersten Spalte
passenden Hauptversionsnummer (laut
<command>ldd</command>-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:</para>
<para>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.</para>
<screen>/compat/linux/lib/libc.so.4.6.27
<para>Folgende Bibliotheken existieren bereits auf dem
&os;-System:</para>
<screen>/compat/linux/lib/libc.so.4.6.27$
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>
<para>und Sie haben eine neue Binärdatei, die
laut <command>ldd</command>
eine neuere Bibliothek benötigt:</para>
<para><command>ldd</command> zeigt an, dass eine Anwendung eine
neuere Version benötigt:</para>
<screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
<screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
<para>Wenn diese sich nur um ein oder zwei Stellen
in der Unterversionsnummer unterscheiden, müssen
Sie <filename>/lib/libc.so.4.6.29</filename>
nicht auf Ihr System kopieren, da das Programm auch
mit der etwas älteren Version ohne Probleme
funktionieren sollte. Wenn Sie wollen,
können Sie <filename>libc.so</filename> aber
dennoch ersetzen (das heißt aktualisieren), was dann zu
folgender Ausgabe führt:</para>
<para>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 <filename>libc.so</filename>
durch die neuere Version ersetzen:</para>
<screen>/compat/linux/lib/libc.so.4.6.29
<screen>/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
</note>
</blockquote>
<blockquote>
<note>
<para>Der Mechanismus der symbolischen Links wird
<emphasis>nur</emphasis> 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.</para>
</note>
</blockquote>
</informalexample>
</sect3>
<para>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.</para>
</sect2>
<sect2>
<title>Linux ELF-Binärdateien installieren</title>
<title>&linux; ELF-Binärdateien installieren</title>
<indexterm>
<primary>Linux</primary>
<secondary>ELF-Binärdatei</secondary>
@ -333,75 +215,81 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<para>ELF-Binärdateien benötigen manchmal eine zusätzliche
<quote>Kennzeichnung</quote>. Wenn Sie versuchen, eine nicht
gekennzeichnete ELF-Binärdatei auszuführen,
werden Sie eine Fehlermeldung ähnlich der folgenden
erhalten:</para>
gekennzeichnete ELF-Binärdatei auszuführen, werden Sie eine
Fehlermeldung ähnlich der folgenden erhalten:</para>
<screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
ELF binary type not known
Abort</screen>
<para>Damit der FreeBSD-Kernel eine Linux-ELF-Datei von einer
FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug
<para>Damit der &os;-Kernel eine &linux;-ELF-Datei von einer
&os;-ELF-Datei unterscheiden kann, gibt es das Werkzeug
&man.brandelf.1;.</para>
<screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen>
<indexterm><primary>GNU Werkzeuge</primary></indexterm>
<para>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.</para>
<para>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.</para>
</sect2>
<sect2>
<title>Installieren einer beliebigen RPM-basierten Linuxanwendung</title>
<title>Installieren einer <acronym>RPM</acronym>-basierten
&linux;-Anwendung</title>
<para>&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).</para>
<para>Falls Sie jedoch eine beliebige RPM-basierte &linux;-Anwendung
installieren wollen, erreichen Sie das mittels:</para>
<para>Wenn Sie eine &linux; <acronym>RPM</acronym>-basierte
Anwendung installieren möchten, installieren Sie zunächst den
Port oder das Paket <package>archivers/rpm4</package>.
Anschließend kann der Superuser das folgende Kommando
benutzen, um ein <filename>.rpm</filename> zu
installieren:</para>
<screen>&prompt.root; <userinput>cd /compat/linux</userinput>
&prompt.root; <userinput>rpm2cpio -q &lt; /path/to/linux.archive.rpm | cpio -id</userinput></screen>
&prompt.root; <userinput>rpm2cpio &lt; /pfad/zum/linux.archiv.rpm | cpio -id</userinput></screen>
<para>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.</para>
<para>Fall notwendig, benutzen Sie <command>brandelf</command>
auf den installierten ELF-Binärdateien. Beachten Sie, dass
dies eine saubere Deinstallation verhindert.</para>
</sect2>
<sect2>
<title>Namensauflösung konfigurieren</title>
<para>Wenn DNS nicht funktioniert, oder Sie folgende Fehlermeldung
erhalten:</para>
<para>Wenn <acronym>DNS</acronym> nicht funktioniert, oder die
folgende Fehlermeldung erscheint:</para>
<screen>resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword</screen>
<para>müssen sie <filename>/compat/linux/etc/host.conf</filename>
wie folgt anlegen:</para>
<para>müssen Sie
<filename>/compat/linux/etc/host.conf</filename> wie folgt
bearbeiten:</para>
<programlisting>order hosts, bind
multi on</programlisting>
<para>Diese Reihenfolge legt fest, dass zuerst
<filename>/etc/hosts</filename> und anschließend DNS
durchsucht werden. Wenn
<filename>/compat/linux/etc/host.conf</filename> nicht vorhanden
ist, finden Linux-Anwendungen FreeBSD's
<filename>/etc/hosts</filename> und anschließend
<acronym>DNS</acronym> durchsucht werden. Wenn
<filename>/compat/linux/etc/host.conf</filename> nicht
vorhanden ist, nutzen &linux;-Anwendungen
<filename>/etc/host.conf</filename> und
beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie
keinen Nameserver (in <filename>/etc/resolv.conf</filename>)
beschweren sich über die inkompatible &os;-Syntax. Wenn Sie
in <filename>/etc/resolv.conf</filename> keinen Nameserver
konfiguriert haben, sollten Sie den Eintrag
<literal>bind</literal> entfernen.</para>
</sect2>
</sect1>
<?ignore
While the installer works, the binaries do not. As of Oct 2013,
Linux emulation is 32-bit but the trial version of Mathematica is
only available as 64-bit. This section should be revisited if Linux
emulation gets 64-bit binary support.
<sect1 xml:id="linuxemu-mathematica">
<info><title>&mathematica; installieren</title>
<authorgroup>
@ -1290,169 +1178,126 @@ export PATH</programlisting>
genau so, wie Sie dies auch unter Linux tun würden.</para>
</sect2>
</sect1>
?>
<sect1 xml:id="linuxemu-advanced">
<title>Weiterführende Themen</title>
<para>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 (<email>tlambert@primenet.com</email>)
an die FreeBSD-Chat-Mailingliste
(<email>freebsd-chat@FreeBSD.org</email>) geschrieben wurde
(Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).</para>
<para>Dieser Abschnitt beschreibt wie die
&linux;-Binärkompatibilität funktioniert. Die folgenden
Informationen stammen aus einer E-Mail, die von Terry Lambert
(<email>tlambert@primenet.com</email>) an &a.chat; geschrieben
wurde (Message ID:
<literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).</para>
<sect2>
<title>Wie funktioniert es?</title>
<indexterm><primary>execution class loader</primary></indexterm>
<para>FreeBSD verfügt über eine <quote>execution class
loader</quote> genannte Abstraktion. Dabei handelt es sich um einen
Eingriff in den &man.execve.2; Systemaufruf.</para>
<para>&os; verfügt über eine
<quote>execution class loader</quote> genannte Abstraktion.
Dabei handelt es sich um einen Eingriff in den &man.execve.2;
Systemaufruf.</para>
<para>Historisch gesehen untersuchte der einzige, auf
&unix;-Plattformen vorhandene Lader die "magische Zahl"
(in der Regel die ersten 4 oder 8&nbsp;Bytes der Datei), um
festzustellen, ob der Binärtyp dem System bekannt war.
War dies der Fall, wurde der Binärlader aufgerufen.</para>
<para>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
<quote>was auch immer die aktuelle Shell ist</quote>
festgelegt.</para>
<para>Später wurde ein Hack in &man.sh.1; eingefügt,
der die zwei ersten Zeichen untersuchte. Wenn diese
<literal>:\n</literal> entsprachen,
wurde stattdessen die &man.csh.1;-Shell aufgerufen.</para>
<para>FreeBSD verfügt über eine Liste von Ladern, anstelle
eines einzigen, auf <literal>#!</literal>
zurückgreifenden Laders, um Shell-Interpreter oder Shell-Skripte
auszuführen.</para>
<para>Historisch gesehen untersuchte der einzige, auf
UNIX-Plattformen vorhandene Lader die "magische Zahl"
(in der Regel die ersten 4 oder 8&nbsp;Bytes der Datei), um
festzustellen, ob der Binärtyp dem System bekannt war.
War dies der Fall, wurde der Binärlader aufgerufen.</para>
<para>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.</para>
<para>Dabei wurde als Standardeinstellung <quote>was auch immer die
aktuelle Shell ist</quote> festgelegt.</para>
<para>Später wurde ein Hack in &man.sh.1; eingefügt,
der die zwei ersten Zeichen untersuchte. Wenn diese
<literal>:\n</literal> entsprachen,
wurde stattdessen die &man.csh.1;-Shell aufgerufen
(wir glauben, dass dies zuerst von SCO umgesetzt wurde).</para>
<para>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 <literal>#!</literal>-Zeile
angegeben. Lässt sich der Interpreter nicht ermitteln,
wird auf <filename>/bin/sh</filename> zurückgegriffen.</para>
<indexterm><primary>ELF</primary></indexterm>
<para>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.).</para>
<indexterm><primary>Solaris</primary></indexterm>
<para>Der ELF-Lader sucht nach einer speziellen
<emphasis>Kennzeichnung</emphasis>, die aus einem Kommentarabschnitt
in der ELF-Datei besteht, und die in SVR4/&solaris; ELF
Binärdateien nicht vorhanden ist.</para>
<para>Für die &linux; <acronym>ABI</acronym>-Unterstützung
erkennt &os; die magische Zahl als ELF-Binärdatei. Der
ELF-Lader sucht nach einer speziellen
<emphasis>Kennzeichnung</emphasis>, die aus einem
Kommentarabschnitt in der ELF-Datei besteht, und die in
SVR4/&solaris; ELF Binärdateien nicht vorhanden ist.</para>
<para>Damit Linux-Binärdateien (unter FreeBSD) funktionieren,
müssen sie als <literal> Linux</literal>
<emphasis>gekennzeichnet</emphasis> werden, und zwar durch
&man.brandelf.1;:</para>
<para>Damit &linux;-Binärdateien unter &os; funktionieren, müssen
sie mit &man.brandelf.1; als <literal>Linux</literal>
<emphasis>gekennzeichnet</emphasis> werden:</para>
<screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
<para>Nachdem dies geschehen ist, erkennt der ELF-Lader die
<literal>Linux</literal>-Kennzeichnung der Datei.</para>
<indexterm>
<primary>ELF</primary>
<secondary><command>brandelf</command></secondary>
<primary>ELF</primary>
<secondary>Kennzeichnung</secondary>
</indexterm>
<para>Wenn der ELF-Lader die <literal>Linux</literal>-Kennzeichnung
sieht, wird ein Zeiger in der <literal>proc</literal>-Struktur
ersetzt. Alle Systemaufrufe werden durch diesen Zeiger indiziert
(in einem traditionellen &unix; System wäre das ein
<literal>sysent[]</literal>-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.</para>
<para>Der Linux-Systemaufrufvektor enthält neben anderen
<para>Der &linux;-Systemaufrufvektor enthält neben anderen
Dingen eine Liste der <literal>sysent[]</literal>-Einträge,
deren Adressen sich im Kernelmodul befinden.</para>
<para>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.</para>
<para>Wenn ein &linux;-Programm einen Systemaufruf ausführt,
dereferenziert die Trap-Behandlungsroutine den Zeiger für den
Systemaufruf aus der <literal>proc</literal>-Struktur und
erhält damit die &linux;-Eintrittspunkte für den
Systemaufruf.</para>
<para>Zusätzlich <emphasis>verändert</emphasis> der
Linuxmodus die Systempfade dynamisch; genauso, wie dies die
&linux;-Modus die Systempfade dynamisch; genauso, wie dies die
Option <option>union</option> beim Einbinden von Dateisystemen
macht (Achtung: <emphasis>nicht</emphasis> das Dateisystem unionfs!).
Zuerst wird die Datei im Verzeichnis <filename>/compat/linux/Originalpfad</filename>
gesucht, <emphasis>danach</emphasis>, wenn sie dort nicht gefunden
wurde, wird sie im FreeBSD-Verzeichnis
<filename>/Originalpfad</filename>
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
<filename>/compat/linux</filename> plaziertes &man.uname.1; kann
damit Linux-Programmen vorgaukeln, dass sie auf einem Linux-System
laufen.</para>
macht. Zuerst wird die Datei im Verzeichnis
<filename>/compat/linux/Originalpfad</filename> gesucht, wenn
sie dort nicht gefunden wurde, wird sie im Verzeichnis
<filename>/Originalpfad</filename> 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 <acronym>ABI</acronym> 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
<filename>/compat/linux</filename> plaziertes &man.uname.1;
kann damit &linux;-Programmen vorgaukeln, dass sie auf einem
&linux;-System laufen.</para>
<para>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&nbsp;V&nbsp;IPC bereitstellen,
Der einzige Unterschied ist, dass Binärdateien unter FreeBSD
FreeBSD-<emphasis>glue</emphasis>-Funktionen verwenden.
Linux-Binärdateien hingegen verwenden die
Linux-<emphasis>glue</emphasis>-Funktionen. Die meisten
älteren Betriebssysteme hatten ihre eigenen
<emphasis>glue</emphasis>-Funktionen: Funktionsadressen
in einem globalen, statischen <literal>sysent[]</literal>
Strukturfeld an Stelle von Funktionsadressen, die durch
einen dynamisch initialisierten Zeiger aus der
<literal>proc</literal> Struktur, die den Aufruf gemacht hatte,
dereferenziert wurden.</para>
<para>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&nbsp;V&nbsp;IPC bereitstellen. Der einzige
Unterschied ist, dass Binärdateien unter &os;
&os;-<emphasis>glue</emphasis>-Funktionen verwendet werden.
&linux;-Binärdateien hingegen verwenden die
&linux;-<emphasis>glue</emphasis>-Funktionen.
&os;-<emphasis>glue</emphasis>-Funktionen sind statisch in
den Kernel gelinkt,
&linux;-<emphasis>glue</emphasis>-Funktionen sind statisch
gelinkt oder können über ein ladbares Kernelmodul eingebunden
werden.</para>
<para>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-<emphasis>glue</emphasis>-Funktionen statisch in
den Kernel gelinkt sind, und dass die
Linux-<emphasis>glue</emphasis>-Funktionen statisch gelinkt
oder über ein Modul eingebunden werden können.</para>
<para>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.</para>
<para>Warum wird es manchmal <quote>Linux-Emulation</quote> 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 &ndash; daher <quote>Der Linux-Emulator</quote>.</para>
</sect2>
<para>Technisch gesehen ist dies nicht wirklich eine Emulation,
sondern eine <acronym>ABI</acronym>-Implementation. Es wird
manchmal <quote>&linux; Emulation</quote> 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.</para>
</sect1>
</chapter>