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:
#
kldload linux
Wollen Sie die Linux-Binärkompatibilität dauerhaft
aktivieren, sollten Sie die folgende Zeile in
/etc/rc.conf
einfügen:
Der kldstat(8)-Befehl kann benutzt werden, um festzustellen, ob KLD geladen wurde:
%
kldstat
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.koWenn 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 Kapitel 9, Konfiguration des FreeBSD-Kernels beschrieben.
Dies kann auf zwei Arten geschehen, entweder über den linux_base-Port oder durch manuelle Installation der Bibliotheken.
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:
#
cd /usr/ports/emulators/linux_base-f10
#
make install distclean
Bei FreeBSD-Systemen vor FreeBSD 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.
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.
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:
%
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.29Sie 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:
Anmerkung:
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:/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27und 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.29Wenn 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 Sielibc.so
aber dennoch ersetzen (das heißt aktualisieren), was dann zu folgender Ausgabe führt:/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Anmerkung:
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.
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:
%
./my-linux-elf-binary
ELF binary type not known
AbortDamit der FreeBSD-Kernel eine Linux-ELF-Datei von einer FreeBSD-ELF-Datei unterscheiden kann, gibt es das Werkzeug brandelf(1).
%
brandelf -t Linux my-linux-elf-binary
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.
FreeBSD 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:
#
cd /compat/linux
#
rpm2cpio -q < /path/to/linux.archive.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.
Wenn DNS nicht funktioniert, oder Sie folgende Fehlermeldung erhalten:
müssen sie /compat/linux/etc/host.conf
wie folgt anlegen:
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/host.conf
und
beschweren sich über die inkompatible FreeBSD-Syntax. Wenn Sie
keinen Nameserver (in /etc/resolv.conf
)
konfiguriert haben, sollten Sie den Eintrag
bind
entfernen.
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.