# kldload linux
This translation may be out of date. To help with the translations please access the FreeBSD translations instance .
FreeBSD levert binaire compatibiliteit met verscheidene andere UNIX® achtige besturingssystemen, waaronder Linux®. Op dit moment kan de vraag gesteld worden waarom FreeBSD nu precies Linux®-binairen moet kunnen draaien. Het antwoord is dat veel bedrijven en ontwikkelaars alleen ontwikkelen voor Linux®, 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® ontwikkelen. Dus wat moet een FreeBSD gebruiker doen? Hier komt de Linux® binaire compatibiliteit van FreeBSD om de hoek kijken.
In een notendop stelt de compatibiliteit FreeBSD in staat om rond de 90% van alle Linux® applicaties zonder wijzigingen te draaien. Dit omvat applicaties zoals StarOffice™, de Linux® versie van getenv(3) , Adobe® Acrobat®, RealPlayer®, Oracle®, WordPerfect®, Doom, Quake en meer. Er wordt zelfs gemeld dat in sommige gevallen Linux®-binairen beter presteren op FreeBSD dan op Linux®.
Er zijn echter enkele Linux®-specifieke besturingssysteemeigenschappen die niet door FreeBSD ondersteund worden. Linux®-binairen werken niet op FreeBSD als ze overvloedig gebruik maken van i386™ specifieke aanroepen, zoals het aanzetten van de virtuele 8086 modus.
Na het lezen van dit hoofdstuk weet de lezer:
Hoe Linux® binaire compatibiliteit op een systeem aan te zetten;
Hoe aanvullende Linux® gedeelde bibliotheken te installeren;
Hoe Linux® applicaties op een FreeBSD systeem te installeren;
De implementatiedetails van Linux® compatibiliteit in FreeBSD.
Aangeraden voorkennis:
Hoe extra software van derden te installeren ( Applicaties installeren. pakketten en ports ).
Linux® 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:
# kldload linux
Als Linux® compatibiliteit altijd aan moet staan, dan moet de volgende regel aan /etc/rc.conf toegevoegd worden:
linux_enable="YES"
Met kldstat(8) kan gecontroleerd worden of de KLD geladen is:
% 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® 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
De FreeBSD-kernel instellen
geïnstalleerd worden.
Dit kan op twee manieren gedaan worden: door de linux_base port te gebruiken of door ze handmatig te installeren.
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 Portscollectie . Dit kan met het volgende commando:
# cd /usr/ports/emulators/linux_base-f10
# make install distclean
|
Op FreeBSD-systemen vóór FreeBSD 8.0 dient u de port emulators/linux_base-fc4 in plaats van emulators/linux_base-f10 te gebruiken. |
Nu is er werkende Linux® binaire compatibiliteit. Sommige programma’s kunnen klagen over onjuiste kleine versies van de systeembibliotheken. Over het algemeen schijnt dit echter geen probleem te zijn.
|
Er kunnen verschillende versies van de emulators/linux_base port beschikbaar zijn, overeenkomend met verschillende versies van verscheidene Linux® distributies. Het is verstandig de port te installeren die het meest voldoet aan de eisen van de Linux® applicaties die geïnstalleerd gaan worden. |
Als de Portscollectie niet is geïnstalleerd, kunnen de bibliotheken met de hand geïnstalleerd worden. Om alles te laten werken moeten de Linux® gedeelde bibliotheken waarvan het programma afhankelijk is en de runtime linker geïnstalleerd worden. Ook moet een "shadow root" map aangemaakt worden,
/compat/linux
, voor Linux® bibliotheken op een FreeBSD systeem. Elke gedeelde bibliotheek die wordt geopend door Linux® programma’s die op FreeBSD draaien, kijken eerst in deze boomstructuur. Dus als een Linux® programma bijvoorbeeld
/lib/libc.so
laadt, probeert FreeBSD eerst
/compat/linux/lib/libc.so
te openen, en als die niet bestaat, probeert het
/lib/libc.so
proberen. Gedeelde bibliotheken moeten in de schaduwmapstructuur geïnstalleerd worden in plaats van in de paden die het Linux®
ld.so
rapporteert.
In het algemeen geldt dat alleen de eerste paar keer dat een Linux® binary wordt geïnstalleerd op een FreeBSD systeem naar de gedeelde bibliotheken gezocht wordt waar Linux®-binairen van afhankelijk zijn. Na een tijd is de verzameling van Linux® gedeelde bibliotheken op een systeem voldoende groot om nieuw geïmporteerde Linux®-binairen te kunnen draaien zonder enig extra werk.
Wat als de
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® 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® binary van Doom op te halen en die op een Linux® systeem staat waar toegang tot is. Dan kan met
ldd linuxdoom
gecontroleerd worden welke gedeelde bibliotheken er nodig zijn:
% 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 /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:
/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
|
Als er al een Linux® gedeelde bibliotheek met een groot revisienummer overeenstemmend met de eerste kolom van de
en een nieuwe binary zegt een latere versie nodig te hebben volgens de uitvoer van
Als slechts één of twee versies verouderd zijn in het laatste cijfer, dan hoeft /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 libc.so sowieso te verplaatsen, en dat resulteert in:
|
|
Het symbolische linkmechanisme is alleen nodig voor Linux®-binairen. De FreeBSD runtime linker zorgt zelf voor het kijken naar passende grote revisienummers en daar hoeft geen zorg over te bestaan. |
ELF-binairen hebben soms een extra stap van "branding" nodig. Als er ongemerkte ELF-binairen worden gedraaid, ontstaat er een foutmelding zoals de volgende:
% ./mijn-linux-elf-binary
ELF binary type not known
Abort
Om de FreeBSD kernel te helpen FreeBSD ELF-binairen en Linux® binairen uit elkaar te houden, kan brandelf(1) gebruikt worden.
% 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.
FreeBSD heeft zijn eigen pakketdatabase die wordt gebruikt om alle ports te volgen (ook Linux® ports). De Linux® RPM-database wordt dus niet gebruikt (noch ondersteund).
Als u echter een willekeurige toepassing die op Linux® RPM is gebaseerd moet installeren kan dit bereikt worden met:
# 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.
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
Als DNS niet werkt of de bovenstaande melding ontstaat, dan moet /compat/linux/etc/host.conf ingesteld worden met daarin:
order hosts, bind multi on
De volgorde geeft aan dat
/etc/hosts
als eerste doorzocht wordt en DNS als tweede. Als
/compat/linux/etc/host.conf
niet geïnstalleerd is, vinden Linux® applicaties
/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
/etc/resolv.conf
.
Dit document beschrijft het installatieproces van de Linux® versie van Mathematica® 5.X op een FreeBSD systeem.
De Linux® versie van Mathematica® of Mathematica® for Students kan direct bij Wolfram besteld worden op http://www.wolfram.com/ .
Ten eerste dient FreeBSD te weten dat de Linux-binairen van Mathematica® 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:
# 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 MathInstaller naar de harde schijf:
# 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
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® 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® installeren.
De shellscripts die Mathematica® aanmaakte tijdens de installatie moeten gewijzigd worden voordat u ze kunt gebruiken. Als u
/usr/local/bin
kiest als de map om Mathematica®-executables in te plaatsen, zult u in deze map symbolische links naar bestanden genaamd
math
,
mathematica
,
Mathematica
, en
MathKernel
aantreffen. Vervang met een tekstverwerker of het volgende shellscript in elk van deze
Linux)
door
FreeBSD
:
#!/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
Wanneer u Mathematica® 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® 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.
Mathematica® 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® erop naar de lokale machine. Deze lettertypen worden meestal opgeslagen in /cdrom/Unix/Files/SystemFiles/Fonts op de CD-ROM of in /usr/local/mathematica/SystemFiles/Fonts op de harde schijf. De eigenlijke lettertypen staan in de submap Type1 en 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 /usr/X11R6/lib/X11/fonts . Hiertoe dient 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 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 /usr/X11R6/lib/X11/fonts te kopiëren:
# 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:
# 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 xorg.conf toe te voegen.
Als er nog geen map /usr/X11R6/lib/X11/fonts/Type1 bestaat, kan de naam van de map MathType1 in het bovenstaande voorbeeld veranderd worden naar Type1 .
Maple™ is een commercieel wiskundeprogramma vergelijkbaar met Mathematica®. De software is te koop op 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:
Voer het INSTALL> shellscript uit van de productdistributie. Kies de "RedHat" optie als daarom wordt gevraagd door het installatieprogramma. Een typische installatiemap zou /usr/local/maple zijn.
Bestel, als dat nog niet gedaan is, een licentie voor Maple™ van Maple Waterloo Software ( http://register.maplesoft.com/ ) en kopieer deze naar /usr/local/maple/license/license.dat .
Installeer de FLEXlm licentiebeheerder met het installatieshellscript INSTALL_LIC , dat geleverd wordt bij Maple™. Stel de primaire hostnaam voor de machine in voor de licentieserver.
Patch het bestand /usr/local/maple/bin/maple.system.type met het volgende:
----- 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™ om "FreeBSD" als een Linux® systeem te herkennen. Het shellscript
bin/maple
roept het shellscript
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
/usr/local/etc/rc.d/lmgrd
, is een gemakkelijke manier om
lmgrd
op te starten:
----- 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™ testen:
% 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!
De FLEXlm licentiebeheerder kan een lastig programma zijn om mee te werken. Aanvullende documentatie staat op 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:
# =======================================================
# 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
|
Het serienummer en de sleutel zijn vervangen door "X"'en.
|
Het bewerken van het licentiebestand lukt zolang de regel "FEATURE" niet verandert (die beschermd is door de licentiesleutel).
Dit document beschrijft het installatieproces van de Linux® versie van MATLAB® 6.5 op een FreeBSD systeem. Het werkt best goed, met uitzondering van de Java Virtual Machine™ (zie De Java™ runtime-omgeving linken ).
De Linux® versie van MATLAB® kan besteld worden bij The MathWorks op 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!
Om MATLAB® te installeren:
Laad de installatie-CD-ROM en koppel die aan. Start het installatiescript als
root
:
# /compat/linux/bin/sh /cdrom/install
|
Het is een grafisch installatieprogramma. Als er foutmeldingen verschijnen dat het programma geen scherm kan openen, kan
|
Als om de MATLAB® rootmap wordt gevraagd, dient
/compat/linux/usr/local/matlab
opgegeven te worden.
|
Voer op de commandoregel het volgende uit om de rest van het installatieproces gemakkelijk te houden:
|
Wijzig het licentiebestand zoals aangegeven tijdens het verkrijgen van de licentie voor MATLAB®.
|
Dit bestand kan van tevoren gemaakt worden met een tekstverwerker en door het te kopiëren naar $MATLAB/license.dat voordat het installatieprogramma vraagt om het te bewerken. |
Maak het installatieproces af.
Nu is de installatie van MATLAB® compleet. De volgende stappen "lijmen" het aan het FreeBSD systeem.
Maak symbolische links voor de scriptbestanden van de licentiebeheerder:
# ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW
# ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW
Maak een opstartbestand in /usr/local/etc/rc.d/flexlm . Onderstaand voorbeeld is een gewijzigde versie van het meegeleverde $MATLAB/etc/rc.lm.glnx86 . De wijzigingen omvatten bestandslocaties en het starten van de licentiebeheerder onder Linux®-emulatie.
#!/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
|
Het bestand moet uitvoerbaar zijn:
Ook moet bovenstaande
gebruikersnaam
vervangen worden door een geldige gebruikersnaam op het systeem (maar niet door
|
Start de licentiebeheerder op met het commando:
# service flexlm start
Verander de Java™ Runtime Environment Link naar een die werkt op FreeBSD:
# cd $MATLAB/sys/java/jre/glnx86
# unlink jre; ln -s ./jre1.1.8 ./jre
Plaats het volgende startscript in /usr/local/bin/matlab :
#!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"
Geef vervolgens het commando
chmod +x /usr/local/bin/matlab
.
|
Afhankelijk van de versie van emulators/linux_base , kunnen er fouten optreden als dit script draait. Om dat te voorkomen, dient in /compat/linux/usr/local/matlab/bin/matlab de regel: if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then (in versie 13.0.1 staat dit op regel 410) veranderd te worden in: if test -L $newbase; then |
Het volgende is nodig om een probleem op te lossen dat samenhangt met het onjuist afsluiten van MATLAB®.
Maak het bestand $MATLAB/toolbox/local/finish.m dat alleen de volgende regel bevat:
! $MATLAB/bin/finish.sh
|
|
|
In dezelfde map staan de bestanden
finishsav.m
en
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
|
Maak het bestand $MATLAB/bin/finish.sh , dat het volgende bevat:
#!/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0
Maak het bestand uitvoerbaar:
# chmod +x $MATLAB/bin/finish.sh
Hieronder wordt het installatieproces van Oracle® 8.0.5 en Oracle® 8.0.5.1 Enterprise Edition voor Linux® op een FreeBSD-machine beschreven.
Uit de Portscollectie dienen emulators/linux_base en 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: tcl-8.0.3-20.i386.rpm . Het algemene commando om pakketten te installeren met de officiële RPM port ( archivers/rpm ) is:
# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package
De installatie van het package hoort foutloos te verlopen.
Voordat Oracle® geïnstalleerd kan worden, moet een juiste omgeving opgezet worden. Dit document beschrijft alleen welke speciale dingen gedaan moeten worden om Oracle® voor Linux® op FreeBSD te draaien, en niet wat beschreven staat in de Oracle® installatiehandleiding.
Zoals beschreven staat in de Oracle® 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:
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® ingesteld worden.
Ook de volgende opties dienen in het kernelinstellingenbestand te staan:
options SYSVSHM #SysV gedeeld geheugen options SYSVSEM #SysV semaforen options SYSVMSG #SysV interprocescommunicatie
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® shell moet hebben. Dat kan door
/compat/linux/bin/bash
toe te voegen aan
/etc/shells
en de shell voor het
oracle
account in te stellen op
/compat/linux/bin/bash
.
Naast de normale Oracle® variabelen als
ORACLE_HOME
en
ORACLE_SID
moeten de volgende omgevingsvariabelen ingesteld worden:
| Variabele | Waarde |
|---|---|
|
|
|
|
|
|
|
|
|
Het is aan te raden om alle omgevingsvariabelen in .profile in te stellen. Een volledig voorbeeld is:
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
Wegens een kleine inconsistentie in de Linux® emulator moet de map
.oracle
aangemaakt worden in
/var/tmp
voordat het installatieprogramma wordt gestart. De gebruiker
oracle
moet de eigenaar van deze map zijn. Nu hoort Oracle® zonder problemen te installeren. Bij problemen dienen eerst de Oracle® distributie en/of de instellingen gecontroleerd te worden! Nadat Oracle® 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:
# 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 root.sh nogmaals te draaien!
Als Oracle® geïnstalleerd wordt, worden sommige acties die als
root
moeten worden uitgevoerd geregistreerd in een shellscript met de naam
root.sh
. Dit script komt in de map
orainst
te staan. De volgende patch dient uitgevoerd te worden op
root.sh
om het de juiste locatie van
chown
te laten gebruiken of als alternatief kan het script onder een originele Linux® shell gedraaid worden
*** 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® niet vanaf een CD-ROM wordt geïnstalleerd, kan de broncode van root.sh aangepast worden. Die heet rthd.sh en staat in de map orainst in de broncodestructuur.
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:
*** 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
Hier wordt beschreven hoe de Linux® binaire compatibiliteit werkt. Het meeste van wat nu volgt is sterk gebaseerd op een e-mailbericht van Terry Lambert
tlambert@primenet.com
aan
FreeBSD babbel mailinglijst
(Message ID:
<
199906020108.SAA07001@usr09.primenet.com
>
).
FreeBSD heeft een abstractie met de naam "execution class loader". Dit is een wig in de systeemaanroep 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® 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 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
sh(1)
om de eerste twee tekens te onderzoeken en als die bestonden uit
:\n
voerde het in plaats hiervan de
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
/bin/sh
.
Voor Linux® ABI-ondersteuning ziet FreeBSD het magische getal als een ELF-binary (het maakt op dit punt geen onderscheid tussen FreeBSD, Solaris™, Linux® 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™ ELF-binairen.
Om Linux®-binairen werkend te krijgen, moeten ze
gemerkt
worden als het type
Linux
met
brandelf(1)
:
# 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® 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® kernelmodule worden afgehandeld.
De Linux® kernelmodule bevat naast andere dingen een lijst van
sysent[]
-ingangen waarvan de adressen in de kernelmodule staan.
Als een systeemaanroep door de Linux®-binary wordt aangeroepen, verwijdert de valstrikcode de referentie aan de functiepointer van de systeemaanroep en geeft die de ingangspunten van de systeemaanroep van Linux® en niet van FreeBSD.
Verder
reroot
de Linux®-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
/compat/linux/origineel-pad
op te zoeken en
vervolgens
alleen als dat mislukt, wordt het bestand in
/origineel-pad
opgezocht. Dit zorgt ervoor dat binairen die andere binairen nodig hebben kunnen draaien (zo kan bijvoorbeeld de Linux®-gereedschapskist geheel onder Linux® ABI-ondersteuning draaien). Dit betekent ook dat Linux®-binairen FreeBSD-binairen kunnen laden en draaien als er geen overeenkomende Linux®-binairen zijn en dat er een
uname(1)
-opdracht in de mappenstructuur
/compat/linux
gezet kan worden om er zeker van te zijn dat Linux®-binairen niet kunnen weten dat ze niet op Linux® draaien.
Effectief bevindt er zich een Linux®-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®: 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®-binairen de
lijm
-functies voor Linux® 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® 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®-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®-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®-emulator".
Last modified on : 18 februari 2025 by Fernando Apesteguía