www.Newbie-Net.de

NetBSD Linux-Kompatibilität

Linuxbinaries unter NetBSD ausführen

Autor: Karsten Kruse

Inhalt

Vorwort

In dieser Anleitung will ich erklären was die Linux-Kompatibilität unter NetBSD ist, wie sie funktioniert und wie man sie einrichtet. Am Ende sollte es möglich sein sowohl statisch als auch dynamisch gelinkte Linuxprogramme unter NetBSD/i386 auszuführen.

Wie funktioniert die Linux-Kompatibilität?

Ein Programm kommuniziert mit dem Kernel über Systemaufrufe (von der Anwendung zum Kernel) und Signale (vom Kernel zur Anwendung). Ein Systemaufruf erfolgt nicht über einen Namen sondern über eine Nummer, so könnte die Nummer 39 unter NetBSD der Systemaufruf nice() sein, unter Linux aber etwas völlig andere wie z.b. fclose(). Selbst wenn unter NetBSD und Linux die Nummern übereinstimmen ist es wahrscheinlich, dass die Argumente für den Systemaufruf nicht passen. Das ist der Grund warum ein Linuxprogramm nicht ohne weiteres unter NetBSD laufen kann.

Leider gibt es von vielen Programmen, z.b. Sun's JDK oder Opera, keinen verfügbaren Sourcecode, so dass ein Neukompilieren / Portieren das Problem nicht lösen kann. NetBSD wäre aber nicht mein Lieblingsbetriebssystem würde es nicht doch einen Weg geben. Die Linux-Kompatibilität.

Es handelt sich dabei um einen Trick: die Linux-Systemaufrufe die das Linuxprogramm macht werden in NetBSD-Systemaufrufe übersetzt. Das gleiche geschieht mit den Signalen und schon fühlt sich das Linuxprogramm heimisch, es denkt es arbeitet unter einem Linuxkernel. Bei einem statisch gelinkten Programm wäre jetzt alles erledigt, leider sind die meisten Linuxprogramme nicht statisch verfügbar, benötigen also zur Laufzeit noch Zugriff auf Bibliotheken. Auch hier hat das NetBSD-Projekt einen Weg entwickelt das Problem zu lösen.

Die Shared Libraries von Linux werden im Verzeichnis /emul/linux (in Wirklichkeit ein Link auf /usr/pkg/emul/linux) installiert. Das pkg-System hat alles was dazu benötigt wird, es verwendet die Libs der SuSE-Distribution. Natürlich könnte man auch einfach selber die benötigten Libs unter /emul/linux verfügbar machen.

Wie schnell ist die Emulation?

Das Übersetzen der Systemaufrufe braucht nicht viele Ressourcen, einzig der Festplattenzugriff auf die Linux-Libs kostet einige Zeit. Allerdings sollte das nicht wirklich zu spüren sein auf halbwegs gängigen Rechnern. Wer mit einem 486er arbeitet könnte etwas bemerken, Erfahrungsberichte habe ich aber keine.

Kurz gesagt sollte das Linuxprogramm sich genauso schnell anfühlen wie unter Linux auch.

Der Kernel

Wer einen GENERIC-Kernel benutzt braucht hier nicht weiterlesen, er hat alles was man braucht einkompiliert. Alle anderen haben schon selber einen Kernel gebaut, die Schritte wiederhole ich deswegen hier nicht. Die folgende Zeile sollte in der Kernelkonfigurationsdatei zu finden sein:

 option COMPAT_LINUX

Danach wird der Kernel neu kompiliert und gebootet. Folgender Befehl zeigt an, welche Linux-Kernel-Version unser NetBSD-Kernel emuliert wird:

 /sbin/sysctl -n emul.linux.kern.osrelease

procfs

Einige Programme brauchen auch das virtuelle Dateisystem /proc. Die Implementation unter NetBSD heisst procfs. Wer NetBSD-2 oder höher einsetzt, kann die nächsten Zeilen ruhig überpringen, da procfs hier schon voll integriert ist. Für ältere Versionen muß die folgende Zeile in /etc/fstab stehen:

 procfs  /proc   procfs   ro,linux    0 0

Danach wird procfs mit folgendem Kommando gemountet:

 mount /proc

Fertig.

Die Libs

Jetzt müssen noch die benötigten Linuxlibs installiert werden. Ich benutze dazu pkgsrc und gebe folgende Befehle ein:

 cd /usr/pkgsrc/meta-pkgs/suse9
 make install

Nach einiger Zeit sollte dann alles installiert sein. Wer pkgsrc nicht benutzt nimmt pkg_add. Schauen wir mal wie groß die Dateien sind:

  du -sm /usr/pkg/emul/linux/
  118      /usr/pkg/emul/linux/

Rund 118 MB. Es sind alle verfügbaren Libs installiert. Sollte später noch eine fehlen kann man sie sich z.b. von SuSE's FTP-Server downloaden und mit rpm -ivh bal.lib nachinstallieren.

Opera als Beispielanwendung

Als Testprogramm soll Opera installiert werden:

 cd /usr/pkgsrc/www/opera6
 make install

Auch hier gilt: wer pkgsrc nicht benutzt nimmt pkg_add. Nachdem das Programm installiert ist kann es von jedem User gestartet werden.

Nachwort

Das war's schon, viele Programme sollten jetzt ohne große Probleme laufen. Kommentare, Wünsche und Anträge an Karsten Kruse tecneeq(at)tecneeq(dot)de.