Linuxbinaries unter NetBSD ausführen
Autor: Karsten Kruse
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.
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.
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.
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
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.
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.
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.
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.