Update to r48090:
Patch to get straight to r48090. Reviewed by: bcr Differential Revision: https://reviews.freebsd.org/D6440
This commit is contained in:
parent
eecf38c92c
commit
aea8b161eb
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=48830
1 changed files with 232 additions and 387 deletions
|
@ -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; &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; 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) => /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</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 -> 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</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 -> 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) -> libc.so.4.6.29</screen>
|
||||
<screen>libc.so.4 (DLL Jump 4.5pl26) -> 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 -> 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) => /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 < /path/to/linux.archive.rpm | cpio -id</userinput></screen>
|
||||
&prompt.root; <userinput>rpm2cpio < /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><199906020108.SAA07001@usr09.primenet.com></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><199906020108.SAA07001@usr09.primenet.com></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 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 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 V 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 V 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 – 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>
|
||||
|
|
Loading…
Reference in a new issue