====== Linux-Software auf FreeBSD betreiben ====== * **[[https://docs.freebsd.org/de/books/handbook/linuxemu/]]** * [[http://www.freebsd.org/doc/de/books/handbook/linuxemu.html]] * [[http://www.freebsd.org/doc/de/books/handbook/linuxemu-lbc-install.html]] 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... ;-)