---
title: Hoofdstuk 11. Linux® binaire compatibiliteit
part: Deel II. Algemene taken
prev: books/handbook/printing
next: books/handbook/partiii
showBookMenu: true
weight: 14
params:
  path: "/books/handbook/linuxemu/"
---

[[linuxemu]]
= Linux® binaire compatibiliteit
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 11
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/linuxemu/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[linuxemu-synopsis]]
== Overzicht

FreeBSD levert binaire compatibiliteit met verscheidene andere UNIX(R) achtige besturingssystemen, waaronder Linux(R). Op dit moment kan de vraag gesteld worden waarom FreeBSD nu precies Linux(R)-binairen moet kunnen draaien. Het antwoord is dat veel bedrijven en ontwikkelaars alleen ontwikkelen voor Linux(R), omdat dat het nieuwste "hebbeding" is in de wereld van computers. Dat laat FreeBSD gebruikers al zeurend achter bij diezelfde bedrijven en ontwikkelaars om originele FreeBSD versies van hun applicaties. Het probleem is dat veel van deze bedrijven zich niet goed realiseren hoeveel mensen hun product zouden gebruiken als er ook FreeBSD versies van waren en de meesten blijven alleen voor Linux(R) ontwikkelen. Dus wat moet een FreeBSD gebruiker doen? Hier komt de Linux(R) binaire compatibiliteit van FreeBSD om de hoek kijken.

In een notendop stelt de compatibiliteit FreeBSD in staat om rond de 90% van alle Linux(R) applicaties zonder wijzigingen te draaien. Dit omvat applicaties zoals StarOffice(TM), de Linux(R) versie van man:getenv[3], Adobe(R) Acrobat(R), RealPlayer(R), Oracle(R), WordPerfect(R), Doom, Quake en meer. Er wordt zelfs gemeld dat in sommige gevallen Linux(R)-binairen beter presteren op FreeBSD dan op Linux(R).

Er zijn echter enkele Linux(R)-specifieke besturingssysteemeigenschappen die niet door FreeBSD ondersteund worden. Linux(R)-binairen werken niet op FreeBSD als ze overvloedig gebruik maken van i386(TM) specifieke aanroepen, zoals het aanzetten van de virtuele 8086 modus.

Na het lezen van dit hoofdstuk weet de lezer:

* Hoe Linux(R) binaire compatibiliteit op een systeem aan te zetten;
* Hoe aanvullende Linux(R) gedeelde bibliotheken te installeren;
* Hoe Linux(R) applicaties op een FreeBSD systeem te installeren;
* De implementatiedetails van Linux(R) compatibiliteit in FreeBSD.

Aangeraden voorkennis:

* Hoe extra software van derden te installeren (crossref:ports[ports,Applicaties installeren. pakketten en ports]).

[[linuxemu-lbc-install]]
== Installatie

Linux(R) binaire compatibiliteit staat standaard niet aan. De gemakkelijkste manier om deze functionaliteit aan te zetten is door het `linux` KLD object ("Kernel LoaDable object") te laden. Deze module kan geladen worden door het volgende commando als `root` uit te voeren:

[source,shell]
....
# kldload linux
....

Als Linux(R) compatibiliteit altijd aan moet staan, dan moet de volgende regel aan [.filename]#/etc/rc.conf# toegevoegd worden:

[.programlisting]
....
linux_enable="YES"
....

Met man:kldstat[8] kan gecontroleerd worden of de KLD geladen is:

[source,shell]
....
% kldstat
Id Refs Address    Size     Name
 1    2 0xc0100000 16bd8    kernel
 7    1 0xc24db000 d000     linux.ko
....

Als het om enige reden ongewenst of onmogelijk is de KLD te laden, dan kan de Linux(R) binaire compatibiliteit statisch in de kernel gecompileerd worden door `options COMPAT_LINUX` aan het kernelinstellingenbestand toe te voegen. Daarna kan de nieuwe kernel zoals beschreven in crossref:kernelconfig[kernelconfig,De FreeBSD-kernel instellen] geïnstalleerd worden.

=== Linux(R) runtime bibliotheken installeren

Dit kan op twee manieren gedaan worden: door de <<linuxemu-libs-port,linux_base>> port te gebruiken of door ze <<linuxemu-libs-manually,handmatig>> te installeren.

[[linuxemu-libs-port]]
==== Installeren uit de linux_base port

Dit is verreweg de gemakkelijkste weg om te bewandelen om de runtime bibliotheken te installeren. Het is net als het installeren van andere ports uit de crossref:ports[ports,Portscollectie]. Dit kan met het volgende commando:

[source,shell]
....
# cd /usr/ports/emulators/linux_base-f10
# make install distclean
....

[NOTE]
====
Op FreeBSD-systemen vóór FreeBSD 8.0 dient u de port package:emulators/linux_base-fc4[] in plaats van package:emulators/linux_base-f10[] te gebruiken.
====

Nu is er werkende Linux(R) binaire compatibiliteit. Sommige programma's kunnen klagen over onjuiste kleine versies van de systeembibliotheken. Over het algemeen schijnt dit echter geen probleem te zijn.

[NOTE]
====
Er kunnen verschillende versies van de package:emulators/linux_base[] port beschikbaar zijn, overeenkomend met verschillende versies van verscheidene Linux(R) distributies. Het is verstandig de port te installeren die het meest voldoet aan de eisen van de Linux(R) applicaties die geïnstalleerd gaan worden.
====

[[linuxemu-libs-manually]]
==== Bibliotheken handmatig installeren

Als de Portscollectie niet is geïnstalleerd, kunnen de bibliotheken met de hand geïnstalleerd worden. Om alles te laten werken moeten de Linux(R) gedeelde bibliotheken waarvan het programma afhankelijk is en de runtime linker geïnstalleerd worden. Ook moet een "shadow root" map aangemaakt worden, [.filename]#/compat/linux#, voor Linux(R) bibliotheken op een FreeBSD systeem. Elke gedeelde bibliotheek die wordt geopend door Linux(R) programma's die op FreeBSD draaien, kijken eerst in deze boomstructuur. Dus als een Linux(R) programma bijvoorbeeld [.filename]#/lib/libc.so# laadt, probeert FreeBSD eerst [.filename]#/compat/linux/lib/libc.so# te openen, en als die niet bestaat, probeert het [.filename]#/lib/libc.so# proberen. Gedeelde bibliotheken moeten in de schaduwmapstructuur geïnstalleerd worden in plaats van in de paden die het Linux(R) `ld.so` rapporteert.

In het algemeen geldt dat alleen de eerste paar keer dat een Linux(R) binary wordt geïnstalleerd op een FreeBSD systeem naar de gedeelde bibliotheken gezocht wordt waar Linux(R)-binairen van afhankelijk zijn. Na een tijd is de verzameling van Linux(R) gedeelde bibliotheken op een systeem voldoende groot om nieuw geïmporteerde Linux(R)-binairen te kunnen draaien zonder enig extra werk.

==== Extra gedeelde bibliotheken installeren

Wat als de [.filename]#linux_base# port is geïnstalleerd en een applicatie nog steeds klaagt over ontbrekende gedeelde bibliotheken? Op zich zijn er twee mogelijkheden (voor het opvolgen van deze instructies zijn `root` rechten op een FreeBSD systeem vereist).

Als er toegang is tot een Linux(R) systeem kan gekeken worden welke gedeelde bibliotheken de applicatie nodig heeft en kunnen ze gekopieerd worden naar het FreeBSD systeem. Dit wordt toegelicht in het volgende voorbeeld:

Stel dat FTP gebruikt is om de Linux(R) binary van Doom op te halen en die op een Linux(R) systeem staat waar toegang tot is. Dan kan met `ldd linuxdoom` gecontroleerd worden welke gedeelde bibliotheken er nodig zijn:

[source,shell]
....
% ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
....

Alle bestanden uit de laatste kolom zijn nodig en moeten onder [.filename]#/compat/linux# komen te staat en de namen uit de eerste kolom moeten er als symbolische links naar verwijzen. Dit betekent dat uiteindelijk deze bestanden op een FreeBSD systeem staan:

[source,shell]
....
/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
....

[NOTE]
====
Als er al een Linux(R) gedeelde bibliotheek met een groot revisienummer overeenstemmend met de eerste kolom van de `ldd` uitvoer is, dan hoeft het bestand uit de laatste kolom niet naar een systeem gekopieerd te worden. Het bestand dat er al staat moet werken. Het is aan te raden om de gedeelde bibliotheek sowieso te kopiëren als het een nieuwere versie is. De oude kan verwijderd worden, zolang de symbolische link maar naar de nieuwe wijst. Dus als deze bibliotheken op een systeem staan:

[source,shell]
....
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
....

en een nieuwe binary zegt een latere versie nodig te hebben volgens de uitvoer van `ldd`:

[source,shell]
....
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
....

Als slechts één of twee versies verouderd zijn in het laatste cijfer, dan hoeft [.filename]#/lib/libc.so.4.6.29# niet gekopieerd te worden, omdat het programma goed moet werken met de ietwat oudere versie. Als er echter behoefte aan is, kan besloten worden om [.filename]#libc.so# sowieso te verplaatsen, en dat resulteert in:

[source,shell]
....
/compat/linux/lib/libc.so.4.6.29
/compat/linux/libc.so.4 -> lbic.so.4.6.29
....

====

[NOTE]
====
Het symbolische linkmechanisme is _alleen_ nodig voor Linux(R)-binairen. De FreeBSD runtime linker zorgt zelf voor het kijken naar passende grote revisienummers en daar hoeft geen zorg over te bestaan.
====

=== Linux(R) ELF-binairen installeren

ELF-binairen hebben soms een extra stap van "branding" nodig. Als er ongemerkte ELF-binairen worden gedraaid, ontstaat er een foutmelding zoals de volgende:

[source,shell]
....
% ./mijn-linux-elf-binary
ELF binary type not known
Abort
....

Om de FreeBSD kernel te helpen FreeBSD ELF-binairen en Linux(R) binairen uit elkaar te houden, kan man:brandelf[1] gebruikt worden.

[source,shell]
....
% brandelf -t Linux mijn-linux-elf-binary
....

De GNU gereedschapskist plaatst nu automatisch de juiste merkinformatie in ELF-binairen , dus deze stap zou steeds overbodiger moeten worden in de toekomst.

=== Een willekeurige toepassing gebaseerd op Linux RPM installeren

FreeBSD heeft zijn eigen pakketdatabase die wordt gebruikt om alle ports te volgen (ook Linux(R) ports). De Linux(R) RPM-database wordt dus niet gebruikt (noch ondersteund).

Als u echter een willekeurige toepassing die op Linux(R) RPM is gebaseerd moet installeren kan dit bereikt worden met:

[source,shell]
....
# cd /compat/linux
# rpm2cpio -q < /pad/naar/linux.archief.rpm | cpio -id
....

Draai daarna brandelf op de geïnstalleerde ELF-binairen (niet de bibliotheken!). Een schone deïnstallatie is niet mogelijk, maar het kan helpen met testen.

=== De hostnaamresolver instellen

[source,shell]
....
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
....

Als DNS niet werkt of de bovenstaande melding ontstaat, dan moet [.filename]#/compat/linux/etc/host.conf# ingesteld worden met daarin:

[.programlisting]
....
order hosts, bind
multi on
....

De volgorde geeft aan dat [.filename]#/etc/hosts# als eerste doorzocht wordt en DNS als tweede. Als [.filename]#/compat/linux/etc/host.conf# niet geïnstalleerd is, vinden Linux(R) applicaties [.filename]#/etc/host.conf# van FreeBSD en klagen ze over de incompatibele FreeBSD syntaxis. `bind` moet verwijderd worden als er geen naamserver is ingesteld die gebruik maakt van [.filename]#/etc/resolv.conf#.

[[linuxemu-mathematica]]
== Mathematica(R) installeren

Dit document beschrijft het installatieproces van de Linux(R) versie van Mathematica(R) 5.X op een FreeBSD systeem.

De Linux(R) versie van Mathematica(R) of Mathematica(R) for Students kan direct bij Wolfram besteld worden op http://www.wolfram.com/[http://www.wolfram.com/].

=== De Mathematica(R) Installer draaien

Ten eerste dient FreeBSD te weten dat de Linux-binairen van Mathematica(R) de Linux ABI gebruiken. De gemakkelijkste manier om dit te doen is om het standaard ELF-merk op Linux te zetten voor alle ongemerkte binairen met het commando:

[source,shell]
....
# sysctl kern.fallback_elf_brand=3
....

Dit laat FreeBSD aannemen dat alle ongemerkte ELF-binairen de Linux ABI gebruiken en dus zou de installer rechtstreeks van de CD-ROM moeten kunnen draaien.

Kopieer nu het bestand [.filename]#MathInstaller# naar de harde schijf:

[source,shell]
....
# mount /cdrom
# cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/
....

Vervang binnen dit bestand `/bin/sh` op de eerste regel door `/compat/linux/bin/sh`. Dit zorgt ervoor dat de installer door de Linux-versie van man:sh[1] wordt uitgevoerd. Vervang vervolgens met een tekstverwerker of het onderstaande script in de volgende sectie alle voorkomens van `Linux)` door `FreeBSD)`. Dit zorgt ervoor dat de Mathematica(R) installer, dat `uname -s` gebruikt om het besturingssysteem te bepalen, om FreeBSD als een Linux-achtig besturingssysteem te behandelen. Het aanroepen van `MathInstaller` zal nu Mathematica(R) installeren.

=== De Mathematica(R)-executables wijzigen

De shellscripts die Mathematica(R) aanmaakte tijdens de installatie moeten gewijzigd worden voordat u ze kunt gebruiken. Als u [.filename]#/usr/local/bin# kiest als de map om Mathematica(R)-executables in te plaatsen, zult u in deze map symbolische links naar bestanden genaamd [.filename]#math#, [.filename]#mathematica#, [.filename]#Mathematica#, en [.filename]#MathKernel# aantreffen. Vervang met een tekstverwerker of het volgende shellscript in elk van deze `Linux)` door `FreeBSD`:

[.programlisting]
....
#!/bin/sh
cd /usr/local/bin
for i in math mathematica Mathematica MathKernel
  do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp
  sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i
  rm $i.tmp
  chmod a+x $i
done
....

=== Mathematica(R) wachtwoord opvragen

Wanneer u Mathematica(R) voor de eerste keer start, zal u om een wachtwoord gevraagd worden. Als u nog geen wachtwoord van Wolfram heeft verkregen, draait u het programma `mathinfo` in de installatiemap om uw "machine-ID" te verkrijgen. Dit machine-ID is alleen op het MAC-adres van uw eerste Ethernetkaart gebaseerd, zodat u uw kopie van Mathematica(R) niet op andere machines kunt draaien.

Bij een registratie bij Wolfram, per email, telefoon of fax, wordt het "machine ID" opgegeven en zij reageren met een overeenkomstig wachtwoord dat uit groepen getallen bestaat.

=== Het Mathematica(R) frontend over een netwerk draaien

Mathematica(R) gebruikt enkele speciale lettertypen om tekens af te beelden die niet aanwezig zijn in een standaard lettertypeverzameling (integralen, sommen, Griekse letters, enzovoort). Het X-protocol vereist dat deze lettertypen _lokaal_ worden geïnstalleerd. Dit betekent dat deze lettertypen gekopieerd moeten worden vanaf de CD-ROM of vanaf een host met Mathematica(R) erop naar de lokale machine. Deze lettertypen worden meestal opgeslagen in [.filename]#/cdrom/Unix/Files/SystemFiles/Fonts# op de CD-ROM of in [.filename]#/usr/local/mathematica/SystemFiles/Fonts# op de harde schijf. De eigenlijke lettertypen staan in de submap [.filename]#Type1# en [.filename]#X#. Er zijn verschillende manieren om ze te installeren, zoals hieronder staat beschreven.

De eerste manier is om ze te kopiëren in één van de bestaande lettertypenmappen in [.filename]#/usr/X11R6/lib/X11/fonts#. Hiertoe dient [.filename]#fonts.dir# bewerkt te worden door de namen van de lettertypen eraan toe te voegen het aantal lettertypen op de eerste regel te veranderen. Als alternatief kan ook eenvoudig man:mkfontdir[1] in de map gedraaid worden waar de lettertypen heen zijn gekopieerd.

De tweede manier om dit te doen is door de mappen naar [.filename]#/usr/X11R6/lib/X11/fonts# te kopiëren:

[source,shell]
....
# cd /usr/X11R6/lib/X11/fonts
# mkdir X
# mkdir MathType1
# cd /cdrom/Unix/Files/SystemFiles/Fonts
# cp X/* /usr/X11R6/lib/X11/fonts/X
# cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1
# cd /usr/X11R6/lib/X11/fonts/X
# mkfontdir
# cd ../MathType1
# mkfontdir
....

Voeg nu de nieuwe lettertypenmappen toe aan het lettertypenpad:

[source,shell]
....
# xset fp+ /usr/X11R6/lib/X11/fonts/X
# xset fp+ /usr/X11R6/lib/X11/fonts/MathType1
# xset fp rehash
....

Als de Xorg server gebruikt wordt, kunnen deze lettertypenmappen automatisch geladen worden door ze aan [.filename]#xorg.conf# toe te voegen.

Als er nog _geen_ map [.filename]#/usr/X11R6/lib/X11/fonts/Type1# bestaat, kan de naam van de map [.filename]#MathType1# in het bovenstaande voorbeeld veranderd worden naar [.filename]#Type1#.

[[linuxemu-maple]]
== Maple(TM) installeren

Maple(TM) is een commercieel wiskundeprogramma vergelijkbaar met Mathematica(R). De software is te koop op http://www.maplesoft.com/[http://www.maplesoft.com/] en kan daar ook geregistreerd worden voor een licentiebestand. Om deze software op FreeBSD te installeren kunnen de volgende eenvoudige stappen gevolgd worden:

[.procedure]
====

. Voer het [.filename]#INSTALL># shellscript uit van de productdistributie. Kies de "RedHat" optie als daarom wordt gevraagd door het installatieprogramma. Een typische installatiemap zou [.filename]#/usr/local/maple# zijn.
. Bestel, als dat nog niet gedaan is, een licentie voor Maple(TM) van Maple Waterloo Software (http://register.maplesoft.com/[http://register.maplesoft.com/]) en kopieer deze naar [.filename]#/usr/local/maple/license/license.dat#.
. Installeer de FLEXlm licentiebeheerder met het installatieshellscript [.filename]#INSTALL_LIC#, dat geleverd wordt bij Maple(TM). Stel de primaire hostnaam voor de machine in voor de licentieserver.
. Patch het bestand [.filename]#/usr/local/maple/bin/maple.system.type# met het volgende:
+
[.programlisting]
....
   ----- knip ------------------
*** maple.system.type.orig      Sun Jul  8 16:35:33 2001
--- maple.system.type   Sun Jul  8 16:35:51 2001
***************
*** 72,77 ****
--- 72,78 ----
          # the IBM RS/6000 AIX case
          MAPLE_BIN="bin.IBM_RISC_UNIX"
          ;;
+     "FreeBSD"|\
      "Linux")
          # the Linux/x86 case
        # We have two Linux implementations, one for Red Hat and
   ----- knip einde van patch -----
....
+ 
Achter `"FreeBSD"|` mogen geen verdere witvelden staan.
+ 
Deze patch instrueert Maple(TM) om "FreeBSD" als een Linux(R) systeem te herkennen. Het shellscript [.filename]#bin/maple# roept het shellscript [.filename]#bin/maple.system.type# aan, dat op zijn beurt `uname -a` aanroept om achter de naam van het besturingssysteem te komen. Afhankelijk van de naam van het besturingssysteem zoekt het uit welke binairen het moet gebruiken.
. Start de licentieserver.
+ 
Het volgende script, geïnstalleerd als [.filename]#/usr/local/etc/rc.d/lmgrd#, is een gemakkelijke manier om `lmgrd` op te starten:
+
[.programlisting]
....
   ----- knip ------------

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
export PATH

LICENSE_FILE=/usr/local/maple/license/license.dat
LOG=/var/log/lmgrd.log

case "$1" in
start)
	lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2
	echo -n " lmgrd"
	;;
stop)
	lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2
	;;
*)
	echo "Usage: `basename $0` {start|stop}" 1>&2
	exit 64
	;;
esac

exit 0
   ----- knip ------------
....
+
. Maple(TM) testen:
+
[source,shell]
....
% cd /usr/local/maple/bin
% ./xmaple
....
+ 
Nu hoort het programma te draaien. Het is belangrijk om Maplesoft te schrijven om ze te laten weten dat een echte FreeBSD versie gewenst is!
====

=== Gemeenschappelijke verborgen gevaren

* De FLEXlm licentiebeheerder kan een lastig programma zijn om mee te werken. Aanvullende documentatie staat op http://www.globetrotter.com/[http://www.globetrotter.com/].
* `lmgrd` staat er bekend om erg kieskeurig over het licentiebestand te zijn en core te dumpen als er een probleem is. Een correct licentiebestand ziet er zo uit:
+
[.programlisting]
....
# =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg

FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
         PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
         ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
         SN=XXXXXXXXX
....
+
[NOTE]
====
Het serienummer en de sleutel zijn vervangen door "X"'en. `chillig` is de hostnaam.
====
+ 
Het bewerken van het licentiebestand lukt zolang de regel "FEATURE" niet verandert (die beschermd is door de licentiesleutel).

[[linuxemu-matlab]]
== MATLAB(R) installeren

Dit document beschrijft het installatieproces van de Linux(R) versie van MATLAB(R) 6.5 op een FreeBSD systeem. Het werkt best goed, met uitzondering van de Java Virtual Machine(TM) (zie <<matlab-jre>>).

De Linux(R) versie van MATLAB(R) kan besteld worden bij The MathWorks op http://www.mathworks.com[http://www.mathworks.com]. Er dient ook een licentiebestand of instructies hoe dat te maken te zijn. Het is belangrijk om Maplesoft te schrijven om ze te laten weten dat een echte FreeBSD versie gewenst is!

=== MATLAB(R) installeren

Om MATLAB(R) te installeren:

[.procedure]
====

. Laad de installatie-CD-ROM en koppel die aan. Start het installatiescript als `root`:
+
[source,shell]
....
# /compat/linux/bin/sh /cdrom/install
....
+
[TIP]
======

Het is een grafisch installatieprogramma. Als er foutmeldingen verschijnen dat het programma geen scherm kan openen, kan `setenv HOME ~GEBRUIKER` uitgevoerd worden, waar _GEBRUIKER_ de gebruiker is waarmee man:su[1] is gedaan.
======
+
. Als om de MATLAB(R) rootmap wordt gevraagd, dient `/compat/linux/usr/local/matlab` opgegeven te worden.
+
[TIP]
======

Voer op de commandoregel het volgende uit om de rest van het installatieproces gemakkelijk te houden: `set MATLAB=/compat/linux/usr/local/matlab`.
======
+
. Wijzig het licentiebestand zoals aangegeven tijdens het verkrijgen van de licentie voor MATLAB(R).
+
[TIP]
======

Dit bestand kan van tevoren gemaakt worden met een tekstverwerker en door het te kopiëren naar [.filename]#$MATLAB/license.dat# voordat het installatieprogramma vraagt om het te bewerken.
======
+
. Maak het installatieproces af.
====

Nu is de installatie van MATLAB(R) compleet. De volgende stappen "lijmen" het aan het FreeBSD systeem.

=== Licentiebeheerder starten

[.procedure]
====

. Maak symbolische links voor de scriptbestanden van de licentiebeheerder:
+
[source,shell]
....
# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
# ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
....
+
. Maak een opstartbestand in [.filename]#/usr/local/etc/rc.d/flexlm#. Onderstaand voorbeeld is een gewijzigde versie van het meegeleverde [.filename]#$MATLAB/etc/rc.lm.glnx86#. De wijzigingen omvatten bestandslocaties en het starten van de licentiebeheerder onder Linux(R)-emulatie.
+
[.programlisting]
....
#!/bin/sh
case "$1" in
  start)
        if [ -f /usr/local/etc/lmboot_TMW ]; then
              /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u gebruikersnaam && echo 'MATLAB_lmgrd'
        fi
        ;;
  stop)
	if [ -f /usr/local/etc/lmdown_TMW ]; then
            /compat/linux/bin/sh /usr/local/etc/lmdown_TMW  > /dev/null 2>&1
	fi
        ;;
  *)
	echo "Usage: $0 {start|stop}"
	exit 1
	;;
esac

exit 0
....
+
[IMPORTANT]
======
Het bestand moet uitvoerbaar zijn:

[source,shell]
....
# chmod +x /usr/local/etc/rc.d/flexlm
....

Ook moet bovenstaande _gebruikersnaam_ vervangen worden door een geldige gebruikersnaam op het systeem (maar niet door `root`).
======
+
. Start de licentiebeheerder op met het commando:
+
[source,shell]
....
# service flexlm start
....
====

[[matlab-jre]]
=== De Java(TM) runtime-omgeving linken

Verander de Java(TM) Runtime Environment Link naar een die werkt op FreeBSD:

[source,shell]
....
# cd $MATLAB/sys/java/jre/glnx86
# unlink jre; ln -s ./jre1.1.8 ./jre
....

=== MATLAB(R) opstartscript maken

[.procedure]
====

. Plaats het volgende startscript in [.filename]#/usr/local/bin/matlab#:
+
[.programlisting]
....
#!/bin/sh
/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
....
+
. Geef vervolgens het commando `chmod +x /usr/local/bin/matlab`.
====

[TIP]
====

Afhankelijk van de versie van package:emulators/linux_base[], kunnen er fouten optreden als dit script draait. Om dat te voorkomen, dient in [.filename]#/compat/linux/usr/local/matlab/bin/matlab# de regel:

[.programlisting]
....
if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then
....

(in versie 13.0.1 staat dit op regel 410) veranderd te worden in:

[.programlisting]
....
if test -L $newbase; then
....

====

=== MATLAB(R) afsluitscript maken

Het volgende is nodig om een probleem op te lossen dat samenhangt met het onjuist afsluiten van MATLAB(R).

[.procedure]
====

. Maak het bestand [.filename]#$MATLAB/toolbox/local/finish.m# dat alleen de volgende regel bevat:
+
[.programlisting]
....
! $MATLAB/bin/finish.sh
....
+
[NOTE]
======
`$MATLAB$` is hier letterlijk bedoeld.
======
+
[TIP]
======

In dezelfde map staan de bestanden [.filename]#finishsav.m# en [.filename]#finishdlg.m#, die de mogelijkheid geven om de werkomgeving te bewaren vóór het afsluiten. Als één van deze scripts gebruikt wordt, dient de bovenstaande regel direct na het commando `save` ingevoegd te worden.
======
+
. Maak het bestand [.filename]#$MATLAB/bin/finish.sh#, dat het volgende bevat:
+
[.programlisting]
....
#!/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &
exit 0
....
+
. Maak het bestand uitvoerbaar:
+
[source,shell]
....
# chmod +x $MATLAB/bin/finish.sh
....
====

[[matlab-using]]
=== MATLAB(R) gebruiken

Nu kan met `matlab` het programma gestart worden.

[[linuxemu-oracle]]
== Oracle(R) installeren

=== Voorwoord

Hieronder wordt het installatieproces van Oracle(R) 8.0.5 en Oracle(R) 8.0.5.1 Enterprise Edition voor Linux(R) op een FreeBSD-machine beschreven.

=== De Linux(R)-omgeving installeren

Uit de Portscollectie dienen package:emulators/linux_base[] en package:devel/linux_devtools[] geïnstalleerd te zijn. Als er problemen zijn met deze ports, kan het zijn dat de pakketten of oudere versies uit de Portscollectie gebruikt moeten worden.

Om de intelligente agent te draaien, moet ook het Red Hat Tcl package geïnstalleerd worden: [.filename]#tcl-8.0.3-20.i386.rpm#. Het algemene commando om pakketten te installeren met de officiële RPM port (package:archivers/rpm[]) is:

[source,shell]
....
# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package
....

De installatie van het _package_ hoort foutloos te verlopen.

=== De Oracle(R)-omgeving creëren

Voordat Oracle(R) geïnstalleerd kan worden, moet een juiste omgeving opgezet worden. Dit document beschrijft alleen welke _speciale_ dingen gedaan moeten worden om Oracle(R) voor Linux(R) op FreeBSD te draaien, en niet wat beschreven staat in de Oracle(R) installatiehandleiding.

[[linuxemu-kernel-tuning]]
==== Kerneloptimalisatie

Zoals beschreven staat in de Oracle(R) installatiehandleiding moet de maximale grootte van het gedeelde geheugen ingesteld worden. Op FreeBSD moet `SHMMAX` niet gebruikt worden. `SHMMAX` wordt slechts uit `SHMMAXPGS` en `PGSIZE` berekend. Daarom dient `SHMMAXPGS` gedefinieerd te worden. Alle andere opties kunnen gebruikt worden zoals in de handleiding staat beschreven. Bijvoorbeeld:

[.programlisting]
....
options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61
....

Deze opties kunnen naargelang het gebruik van Oracle(R) ingesteld worden.

Ook de volgende opties dienen in het kernelinstellingenbestand te staan:

[.programlisting]
....
options SYSVSHM #SysV gedeeld geheugen
options SYSVSEM #SysV semaforen
options SYSVMSG #SysV interprocescommunicatie
....

[[linuxemu-oracle-account]]
==== Oracle(R) account

Creeër een `oracle` account op dezelfde manier als elk ander account. Het `oracle` account is alleen bijzonder in het opzicht dat het een Linux(R) shell moet hebben. Dat kan door `/compat/linux/bin/bash` toe te voegen aan [.filename]#/etc/shells# en de shell voor het `oracle` account in te stellen op [.filename]#/compat/linux/bin/bash#.

[[linuxemu-environment]]
==== Omgeving

Naast de normale Oracle(R) variabelen als `ORACLE_HOME` en `ORACLE_SID` moeten de volgende omgevingsvariabelen ingesteld worden:

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Variabele
| Waarde

|`LD_LIBRARY_PATH`
|`$ORACLE_HOME/lib`

|`CLASSPATH`
|`$ORACLE_HOME/jdbc/lib/classes111.zip`

|`PATH`
|`/compat/linux/bin; /compat/linux/sbin; /compat/linux/usr/bin; /compat/linux/usr/sbin; /bin; /sbin; /usr/bin; /usr/sbin; /usr/local/bin; $ORACLE_HOME/bin`
|===

Het is aan te raden om alle omgevingsvariabelen in [.filename]#.profile# in te stellen. Een volledig voorbeeld is:

[.programlisting]
....
ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH
....

=== Oracle(R) installeren

Wegens een kleine inconsistentie in de Linux(R) emulator moet de map [.filename]#.oracle# aangemaakt worden in [.filename]#/var/tmp# voordat het installatieprogramma wordt gestart. De gebruiker `oracle` moet de eigenaar van deze map zijn. Nu hoort Oracle(R) zonder problemen te installeren. Bij problemen dienen eerst de Oracle(R) distributie en/of de instellingen gecontroleerd te worden! Nadat Oracle(R) is geïnstalleerd, moeten de patches uit de volgende twee secties geïnstalleerd worden.

Een veelvoorkomend probleem is dat de adapter voor het TCP-protocol niet goed is geïnstalleerd. De consequentie daarvan is dat er geen TCP-listeners gestart kunnen worden. De volgende acties helpen om dit probleem op te lossen:

[source,shell]
....
# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk ntcontab.o
# cd $ORACLE_HOME/lib
# ar r libnetwork.a ntcontab.o
# cd $ORACLE_HOME/network/lib
# make -f ins_network.mk install
....

Hierna dient [.filename]#root.sh# nogmaals te draaien!

[[linuxemu-patch-root]]
==== [.filename]#root.sh# patchen

Als Oracle(R) geïnstalleerd wordt, worden sommige acties die als `root` moeten worden uitgevoerd geregistreerd in een shellscript met de naam [.filename]#root.sh#. Dit script komt in de map [.filename]#orainst# te staan. De volgende patch dient uitgevoerd te worden op [.filename]#root.sh# om het de juiste locatie van `chown` te laten gebruiken of als alternatief kan het script onder een originele Linux(R) shell gedraaid worden

[.programlisting]
....
*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown
#
# Define variables to be used in this script
--- 31,37 ----
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown
#
# Define variables to be used in this script
....

Als Oracle(R) niet vanaf een CD-ROM wordt geïnstalleerd, kan de broncode van [.filename]#root.sh# aangepast worden. Die heet [.filename]#rthd.sh# en staat in de map [.filename]#orainst# in de broncodestructuur.

[[linuxemu-patch-tcl]]
==== genclntsh patchen

Het script `genclntsh` wordt gebruikt om éán enkele gedeelde bibliotheek voor de cliënt aan te maken. Het wordt gebruikt tijdens het maken van de demonstraties. Met de volgende patch wordt de definitie van `PATH` uitgecommentarieerd:

[.programlisting]
....
*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
....

=== Oracle(R) draaien

Als de instructies worden gevolgd, draait Oracle(R) als op Linux(R) zelf.

[[linuxemu-advanced]]
== Gevorderde onderwerpen

Hier wordt beschreven hoe de Linux(R) binaire compatibiliteit werkt. Het meeste van wat nu volgt is sterk gebaseerd op een e-mailbericht van Terry Lambert mailto:tlambert@primenet.com[tlambert@primenet.com] aan {freebsd-chat} (Message ID: `<199906020108.SAA07001@usr09.primenet.com>`).

=== Hoe werkt het?

FreeBSD heeft een abstractie met de naam "execution class loader". Dit is een wig in de systeemaanroep man:execve[2].

Wat er gebeurt is dat FreeBSD een lijst van loaders heeft, in plaats van een enkele loader die terugvalt op de `#!` loader voor het draaien van elke shellinterpreter of shellscript.

Vroeger onderzocht de enige loader op het UNIX(R) platform het magische getal (in het algemeen de eerste 4 of 8 bytes van het bestand) om te zien of het een binary was die het systeem kende en als dat het geval was laadde het de binaire loader.

Als het niet het binaire type voor het systeem was, faalde de aanroep naar man:execve[2] en probeerde de shell het als shellopdrachten uit te voeren.

Deze aanname was een standaard voor "wat de huidige shell ook is."

Later werd er een hack gemaakt voor man:sh[1] om de eerste twee tekens te onderzoeken en als die bestonden uit `:\n` voerde het in plaats hiervan de man:csh[1] shell uit (het idee is dat SCO de hack als eerste maakte).

Wat FreeBSD nu doet is door een lijst van loaders gaan met een generieke `#!` loader die kennis heeft van interpreters in de zin van de karakters die volgen op de volgende witruimte tot de laatste, met uiteindelijk een terugval op [.filename]##/bin/sh##.

Voor Linux(R) ABI-ondersteuning ziet FreeBSD het magische getal als een ELF-binary (het maakt op dit punt geen onderscheid tussen FreeBSD, Solaris(TM), Linux(R) of elk ander besturingssysteem dat een ELF-beeldtype heeft).

De ELF loader zoekt naar een gespecialiseerd _merk_, dat een commentaargedeelte in het ELF-beeld is en dat niet aanwezig is in SVR4/Solaris(TM) ELF-binairen.

Om Linux(R)-binairen werkend te krijgen, moeten ze _gemerkt_ worden als het type `Linux` met man:brandelf[1]:

[source,shell]
....
# brandelf -t Linux bestand
....

Als dit gedaan is, ziet de ELF loader het `Linux`-merk in het bestand.

Als de ELF loader het `Linux`-merk tegenkomt, verplaatst de loader een pointer in de `proc`-structuur. Alle systeemaanroepen worden met deze pointer geïndexeerd (in een traditioneel UNIX(R) systeem is dit de `sysent[]`-structuurarray, die de systeemaanroepen bevat). Ook wordt het proces gemerkt voor speciale behandeling door de valstrikvector van de signaal-trampolinecode samen met nog meer (kleine) aanpassingen die door de Linux(R) kernelmodule worden afgehandeld.

De Linux(R) kernelmodule bevat naast andere dingen een lijst van `sysent[]`-ingangen waarvan de adressen in de kernelmodule staan.

Als een systeemaanroep door de Linux(R)-binary wordt aangeroepen, verwijdert de valstrikcode de referentie aan de functiepointer van de systeemaanroep en geeft die de ingangspunten van de systeemaanroep van Linux(R) en niet van FreeBSD.

Verder _reroot_ de Linux(R)-modus dynamisch lookups. Dit is wat de optie `union` (_niet_ het `unionfs` bestandssysteemtype!) voor het aankoppelen van bestandssystemen effectief doet. Eerst wordt een poging gedaan om het bestand in de map [.filename]#/compat/linux/origineel-pad# op te zoeken en _vervolgens_ alleen als dat mislukt, wordt het bestand in [.filename]#/origineel-pad# opgezocht. Dit zorgt ervoor dat binairen die andere binairen nodig hebben kunnen draaien (zo kan bijvoorbeeld de Linux(R)-gereedschapskist geheel onder Linux(R) ABI-ondersteuning draaien). Dit betekent ook dat Linux(R)-binairen FreeBSD-binairen kunnen laden en draaien als er geen overeenkomende Linux(R)-binairen zijn en dat er een man:uname[1]-opdracht in de mappenstructuur [.filename]#/compat/linux# gezet kan worden om er zeker van te zijn dat Linux(R)-binairen niet kunnen weten dat ze niet op Linux(R) draaien.

Effectief bevindt er zich een Linux(R)-kernel in de FreeBSD-kernel. De verschillende onderliggende functies die alle functies implementeren die de kernel aanbiedt, zijn dezelfde tabelingangen voor de systeemaanroepen van FreeBSD als van Linux(R): bestandssysteembewerkingen, bewerkingen op het virtuële geheugen, signaalaflevering, System V IPC, enzovoort. Het enige verschil is dat FreeBSD-binairen de _lijm_ functies voor FreeBSD krijgen en dat de Linux(R)-binairen de _lijm_-functies voor Linux(R) krijgen (de meeste oudere besturingssystemen hadden alleen hun eigen _lijm_-functies: adressen van functies die in een statische globale `sysent[]` structuurarray werden opgeslagen, in plaats van adressen van functies waarvan dynamisch een geïnitialiseerde pointer wordt verwijderd in de `proc`-structuur van het proces dat de aanroep doet).

Welke is de eigenlijke FreeBSD ABI? Dat maakt niet uit. Eigenlijk is het enige verschil dat (op dit moment; dit kan eenvoudig veranderen in een toekomstige uitgave, en dat gebeurt waarschijnlijk na deze uitgave) de _lijm_-functies van FreeBSD statisch gelinkt zijn in de kernel en dat de _lijm_-functies van Linux(R) zowel statisch gelinkt kunnen worden als dat ze door een kernelmodule worden benaderd.

Maar is dit nu echt emulatie? Nee. Het is een ABI-implementatie, geen emulatie. Er is geen emulator (of simulator, om de volgende vraag voor te zijn) bij betrokken.

Dus waarom wordt het dan soms "Linux(R)-emulatie" genoemd? Om het moeilijk te maken om FreeBSD te verkopen! Serieus, het is zo omdat de historische implementatie in een tijd werd gedaan toen er echt geen ander woord was om te beschrijven wat er aan de hand was, om te zeggen dat FreeBSD Linux(R)-binairen draaide was niet waar als de code niet in de kernel gecompileerd werd of als een module geladen werd en er moest een woord zijn voor hetgeen geladen werd. Vandaar "de Linux(R)-emulator".
