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…