Linux-Software auf FreeBSD betreiben

Ich zeige hier wie man ein Linux-Programm unter FreeBSD betreiben kann.

Als Beispiel wollen wir hier mal "mkvmerge" von Linux nach FreeBSD holen.

…und so macht man das…

# echo 'linux_enable="YES"' >> /etc/rc.conf
# kldstat | egrep 'kernel|linux'
 1   39 0xffffffff80200000 13b15d0  kernel
 2    1 0xffffffff815b2000 46ce0    linux.ko
# portupgrade -NROD emulators/linux_base-f10

Als erstes muss man jetzt daran denken, das die meisten Binärdateien ohne Bibliotheksdateien keinen Mux sagen!

So sehen wir nach, welche Bibliotheksdateien unser mkvmerge benötigt:

#  ldd /usr/bin/mkvmerge
        linux-gate.so.1 =>  (0x00680000)
        libmagic.so.1 => /usr/lib/libmagic.so.1 (0x004e0000)
        libz.so.1 => /lib/libz.so.1 (0x00110000)
        libmatroska.so.0 => /usr/lib/libmatroska.so.0 (0x006d1000)
        libebml.so.0 => /usr/lib/libebml.so.0 (0x008c1000)
        libFLAC.so.8 => /usr/lib/libFLAC.so.8 (0x00b01000)
        libogg.so.0 => /usr/lib/libogg.so.0 (0x00f35000)
        libvorbis.so.0 => /usr/lib/libvorbis.so.0 (0x00ce3000)
        liblzo2.so.2 => /usr/lib/liblzo2.so.2 (0x00f7d000)
        libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x001f7000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x005d9000)
        libboost_regex.so.1.40.0 => /usr/lib/libboost_regex.so.1.40.0 (0x00bf5000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00209000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x001cf000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00a4a000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x002ff000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00125000)
        libicudata.so.42 => /usr/lib/libicudata.so.42 (0xb68f2000)
        libicui18n.so.42 => /usr/lib/libicui18n.so.42 (0x00d0c000)
        libicuuc.so.42 => /usr/lib/libicuuc.so.42 (0x00774000)
        librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x0013e000)
        /lib/ld-linux.so.2 (0x00b52000)

Jetzt auf dem Linux-Rechner alles zusammenpacken:

# ldd /usr/bin/mkvmerge | awk '/\// {print $3}' | egrep -v ^$ | while read AA;do ls -l ${AA};done
lrwxrwxrwx 1 root root 17 2010-05-12 23:33 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
lrwxrwxrwx 1 root root 15 2010-05-12 23:30 /lib/libz.so.1 -> libz.so.1.2.3.3
-rw-r--r-- 1 root root 653372 2008-05-05 12:46 /usr/lib/libmatroska.so.0
-rw-r--r-- 1 root root 138068 2008-03-28 12:55 /usr/lib/libebml.so.0
lrwxrwxrwx 1 root root 16 2010-05-12 23:33 /usr/lib/libFLAC.so.8 -> libFLAC.so.8.2.0
lrwxrwxrwx 1 root root 15 2010-05-12 23:33 /usr/lib/libogg.so.0 -> libogg.so.0.6.0
lrwxrwxrwx 1 root root 18 2010-05-12 23:33 /usr/lib/libvorbis.so.0 -> libvorbis.so.0.4.3
lrwxrwxrwx 1 root root 16 2010-05-12 23:42 /usr/lib/liblzo2.so.2 -> liblzo2.so.2.0.0
lrwxrwxrwx 1 root root 15 2010-09-22 21:12 /lib/libbz2.so.1.0 -> libbz2.so.1.0.4
lrwxrwxrwx 1 root root 17 2010-05-12 23:32 /lib/libexpat.so.1 -> libexpat.so.1.5.2
-rw-r--r-- 1 root root 914308 2010-04-01 03:19 /usr/lib/libboost_regex.so.1.40.0
lrwxrwxrwx 1 root root 19 2010-05-12 23:32 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.13
lrwxrwxrwx 1 root root 14 2010-10-22 21:02 /lib/tls/i686/cmov/libm.so.6 -> libm-2.11.1.so
-rw-r--r-- 1 root root 120368 2010-03-26 23:40 /lib/libgcc_s.so.1
lrwxrwxrwx 1 root root 14 2010-10-22 21:02 /lib/tls/i686/cmov/libc.so.6 -> libc-2.11.1.so
lrwxrwxrwx 1 root root 20 2010-10-22 21:02 /lib/tls/i686/cmov/libpthread.so.0 -> libpthread-2.11.1.so
lrwxrwxrwx 1 root root 18 2010-05-12 23:30 /usr/lib/libicudata.so.42 -> libicudata.so.42.1
lrwxrwxrwx 1 root root 18 2010-05-12 23:30 /usr/lib/libicui18n.so.42 -> libicui18n.so.42.1
lrwxrwxrwx 1 root root 16 2010-05-12 23:30 /usr/lib/libicuuc.so.42 -> libicuuc.so.42.1
lrwxrwxrwx 1 root root 15 2010-10-22 21:02 /lib/tls/i686/cmov/librt.so.1 -> librt-2.11.1.so
# tar cf mkvmerge_libs.tar /usr/bin/mkvmerge /usr/lib/libmagic.so.1 /usr/lib/libmagic.so.1.0.0 /lib/libz.so.1 /lib/libz.so.1.2.3.3 /usr/lib/libmatroska.so.0 /usr/lib/libebml.so.0 /usr/lib/libFLAC.so.8 /usr/lib/libFLAC.so.8.2.0 /usr/lib/libogg.so.0 /usr/lib/libogg.so.0.6.0 /usr/lib/libvorbis.so.0 /usr/lib/libvorbis.so.0.4.3 /usr/lib/liblzo2.so.2 /usr/lib/liblzo2.so.2.0.0 /lib/libbz2.so.1.0 /lib/libbz2.so.1.0.4 /lib/libexpat.so.1 /lib/libexpat.so.1.5.2 /usr/lib/libboost_regex.so.1.40.0 /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.6.0.13 /lib/tls/i686/cmov/libm.so.6 /lib/tls/i686/cmov/libm-2.11.1.so /lib/libgcc_s.so.1 /lib/tls/i686/cmov/libc.so.6 /lib/tls/i686/cmov/libc-2.11.1.so /lib/tls/i686/cmov/libpthread.so.0 /lib/tls/i686/cmov/libpthread-2.11.1.so /usr/lib/libicudata.so.42 /usr/lib/libicudata.so.42.1 /usr/lib/libicui18n.so.42 /usr/lib/libicui18n.so.42.1 /usr/lib/libicuuc.so.42 /usr/lib/libicuuc.so.42.1 /lib/tls/i686/cmov/librt.so.1 /lib/tls/i686/cmov/librt-2.11.1.so

dann auf den FreeBSD-Rechner rüber schieben und dann auf den FreeBSD-Rechner einloggen:

# scp mkvmerge_libs.tar root@server:
# ssh root@server

Natürlich sollte die Linux-Emulation bereits installiert sein, sonst kann man das z.B. so schnell nachholen:

# portinstall emulators/linux_base-f10

Dann kann es losgehen, auspacken und fertig:

# tar xf /root/mkvmerge_libs.tar -C /usr/compat/linux/

…möglicherweise muss man die eine oder andere Datei mit einem Branding versehen:

# cd /usr/compat/linux/
# brandelf -t Linux usr/bin/mkvmerge
# brandelf -t Linux lib/libz.so.1.2.3.3
# brandelf -t Linux lib/libbz2.so.1.0.4
# brandelf -t Linux lib/libexpat.so.1.5.2
# brandelf -t Linux lib/tls/i686/cmov/libm-2.11.1.so
# brandelf -t Linux lib/tls/i686/cmov/libc-2.11.1.so
# brandelf -t Linux lib/tls/i686/cmov/libpthread-2.11.1.so
# brandelf -t Linux lib/tls/i686/cmov/librt-2.11.1.so
# brandelf -t Linux lib/libgcc_s.so.1
# brandelf -t Linux usr/lib/libmagic.so.1.0.0
# brandelf -t Linux usr/lib/libmatroska.so.0
# brandelf -t Linux usr/lib/libebml.so.0
# brandelf -t Linux usr/lib/libFLAC.so.8.2.0
# brandelf -t Linux usr/lib/libogg.so.0.6.0
# brandelf -t Linux usr/lib/libvorbis.so.0.4.3
# brandelf -t Linux usr/lib/liblzo2.so.2.0.0
# brandelf -t Linux usr/lib/libboost_regex.so.1.40.0
# brandelf -t Linux usr/lib/libstdc++.so.6.0.13
# brandelf -t Linux usr/lib/libicudata.so.42.1
# brandelf -t Linux usr/lib/libicui18n.so.42.1
# brandelf -t Linux usr/lib/libicuuc.so.42.1

Prinzipiell sollte jetzt alles funktionieren, allerdings habe ich noch das Problem, dass bei mir diese Fehlermeldung kommt:

# /usr/compat/linux/usr/bin/mkvmerge: error while loading shared libraries: /usr/lib/libmagic.so.1: ELF file OS ABI invalid

Er soll die Lib "/usr/compat/linux/usr/lib/libmagic.so.1" verwenden, aber dummerweise versucht er die Lib "/usr/lib/libmagic.so.1" zu verwenden, die gibt es aber nicht im System…

…dafür habe ich zur Zeit auch noch keine Lösung. :-(

In den meisten Fällen funktioniert das aber nach dieser Anleitung… ;-)