&linux; binaire compatibiliteit JimMockGeherstructureerd en delen bijgewerkt door Brian N.HandyOrigineel bijgedragen door RichMurphey RenéLadanVertaald door Overzicht &os; levert binaire compatibiliteit met verscheidene andere &unix; achtige besturingssystemen, waaronder &linux;. Op dit moment kan de vraag gesteld worden waarom &os; 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 &os; gebruikers al zeurend achter bij diezelfde bedrijven en ontwikkelaars om originele &os; 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 &os; versies van waren en de meesten blijven alleen voor &linux; ontwikkelen. Dus wat moet een &os; gebruiker doen? Hier komt de &linux; binaire compatibiliteit van &os; om de hoek kijken. In een notendop stelt de compatibiliteit &os; in staat om rond de 90% van alle &linux; applicaties zonder wijzigingen te draaien. Dit omvat applicaties zoals &staroffice;, de &linux; versie van &netscape;, &adobe; &acrobat;, &realplayer;, &oracle;, &wordperfect;, Doom, Quake en meer. Er wordt zelfs gemeld dat in sommige gevallen &linux;-binairen beter presteren op &os; dan op &linux;. Er zijn echter enkele &linux;-specifieke besturingssysteemeigenschappen die niet door &os; ondersteund worden. &linux;-binairen werken niet op &os; 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 &os; systeem te installeren; De implementatiedetails van &linux; compatibiliteit in &os;. Aangeraden voorkennis: Hoe extra software van derden te installeren (). Installatie KLD (kernel loadable object) &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: &prompt.root; kldload linux Als &linux; compatibiliteit altijd aan moet staan, dan moet de volgende regel aan /etc/rc.conf toegevoegd worden: linux_enable="YES" Met &man.kldstat.8; kan gecontroleerd worden of de KLD geladen is: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bd8 kernel 7 1 0xc24db000 d000 linux.ko kernelopties COMPAT_LINUX 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 geïnstalleerd worden. &linux; runtime bibliotheken installeren &linux; &linux; bibliotheken installeren Dit kan op twee manieren gedaan worden: door de linux_base port te gebruiken of door ze handmatig te installeren. Installeren uit de linux_base port Portscollectie 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: &prompt.root; cd /usr/ports/emulators/linux_base-f10 &prompt.root; make install distclean Op &os;-systemen vóór &os; 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. 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; 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 &os; systeem. Elke gedeelde bibliotheek die wordt geopend door &linux; programma's die op &os; draaien, kijken eerst in deze boomstructuur. Dus als een &linux; programma bijvoorbeeld /lib/libc.so laadt, probeert &os; 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 &os; 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. Extra gedeelde bibliotheken installeren gedeelde bibliotheken 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 &os; 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 &os; 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: &prompt.user; 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 symbolische links 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 &os; 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 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: /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: 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 /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: /compat/linux/lib/libc.so.4.6.29 /compat/linux/libc.so.4 -> lbic.so.4.6.29
Het symbolische linkmechanisme is alleen nodig voor &linux;-binairen. De &os; runtime linker zorgt zelf voor het kijken naar passende grote revisienummers en daar hoeft geen zorg over te bestaan.
&linux; ELF-binairen installeren &linux; ELF-binairen ELF-binairen hebben soms een extra stap van branding nodig. Als er ongemerkte ELF-binairen worden gedraaid, ontstaat er een foutmelding zoals de volgende: &prompt.user; ./mijn-linux-elf-binary ELF binary type not known Abort Om de &os; kernel te helpen &os; ELF-binairen en &linux; binairen uit elkaar te houden, kan &man.brandelf.1; gebruikt worden. &prompt.user; brandelf -t Linux mijn-linux-elf-binary GNU gereedschapskist 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 &os; 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: &prompt.root; cd /compat/linux &prompt.root; 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 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 &os; en klagen ze over de incompatibele &os; syntaxis. bind moet verwijderd worden als er geen naamserver is ingesteld die gebruik maakt van /etc/resolv.conf.
&mathematica; installeren BorisHollasBijgewerkt voor Mathematica 5.X door applicaties &mathematica; Dit document beschrijft het installatieproces van de &linux; versie van &mathematica; 5.X op een &os; systeem. De &linux; versie van &mathematica; of &mathematica; for Students kan direct bij Wolfram besteld worden op http://www.wolfram.com/. De &mathematica; Installer draaien Ten eerste dient &os; 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: &prompt.root; sysctl kern.fallback_elf_brand=3 Dit laat &os; 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: &prompt.root; mount /cdrom &prompt.root; 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; installer, dat uname -s gebruikt om het besturingssysteem te bepalen, om &os; als een Linux-achtig besturingssysteem te behandelen. Het aanroepen van MathInstaller zal nu &mathematica; installeren. De &mathematica;-executables wijzigen 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 &os;: #!/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; wachtwoord opvragen Ethernet MAC-adres 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. Het &mathematica; frontend over een netwerk draaien &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 &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 /usr/X11R6/lib/X11/fonts te kopiëren: &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X &prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; cd /usr/X11R6/lib/X11/fonts/X &prompt.root; mkfontdir &prompt.root; cd ../MathType1 &prompt.root; mkfontdir Voeg nu de nieuwe lettertypenmappen toe aan het lettertypenpad: &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash Als de &xorg; server gebruikt wordt, kunnen deze lettertypenmappen automatisch geladen worden door ze aan xorg.conf toe te voegen. lettertypen 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; installeren AaronKaplanBijgedragen door RobertGetschmannMet dank aan applicaties Maple &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 &os; 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 &os; 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: &prompt.user; cd /usr/local/maple/bin &prompt.user; ./xmaple Nu hoort het programma te draaien. Het is belangrijk om Maplesoft te schrijven om ze te laten weten dat een echte &os; 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/. 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. chillig is de hostnaam. Het bewerken van het licentiebestand lukt zolang de regel FEATURE niet verandert (die beschermd is door de licentiesleutel). &matlab; installeren DanPellegBijgedragen door applicaties &matlab; Dit document beschrijft het installatieproces van de &linux; versie van &matlab; 6.5 op een &os; systeem. Het werkt best goed, met uitzondering van de &java.virtual.machine; (zie ). 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 &os; versie gewenst is! &matlab; installeren Om &matlab; te installeren: Laad de installatie-CD-ROM en koppel die aan. Start het installatiescript als root: &prompt.root; /compat/linux/bin/sh /cdrom/install 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; 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: set MATLAB=/compat/linux/usr/local/matlab. 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 &os; systeem. Licentiebeheerder starten Maak symbolische links voor de scriptbestanden van de licentiebeheerder: &prompt.root; ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW &prompt.root; 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: &prompt.root; 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: &prompt.root; service flexlm start De &java; runtime-omgeving linken Verander de &java; Runtime Environment Link naar een die werkt op &os;: &prompt.root; cd $MATLAB/sys/java/jre/glnx86 &prompt.root; unlink jre; ln -s ./jre1.1.8 ./jre &matlab; opstartscript maken 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 &matlab; afsluitscript maken 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 $MATLAB$ is hier letterlijk bedoeld. 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 save ingevoegd te worden. 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: &prompt.root; chmod +x $MATLAB/bin/finish.sh &matlab; gebruiken Nu kan met matlab het programma gestart worden. &oracle; installeren MarcelMoolenaarBijgedragen door applicaties Oracle Voorwoord Hieronder wordt het installatieproces van &oracle; 8.0.5 en &oracle; 8.0.5.1 Enterprise Edition voor &linux; op een &os;-machine beschreven. De &linux;-omgeving installeren 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: &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package De installatie van het package hoort foutloos te verlopen. De &oracle;-omgeving creëren 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 &os; te draaien, en niet wat beschreven staat in de &oracle; installatiehandleiding. Kerneloptimalisatie kerneloptimalisatie Zoals beschreven staat in de &oracle; installatiehandleiding moet de maximale grootte van het gedeelde geheugen ingesteld worden. Op &os; 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 &oracle; 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; 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. Omgeving Naast de normale &oracle; variabelen als ORACLE_HOME en ORACLE_SID moeten de volgende omgevingsvariabelen ingesteld worden: 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 .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 &oracle; installeren 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: &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk ntcontab.o &prompt.root; cd $ORACLE_HOME/lib &prompt.root; ar r libnetwork.a ntcontab.o &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk install Hierna dient root.sh nogmaals te draaien! <filename>root.sh</filename> patchen 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. 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: *** 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; draaien Als de instructies worden gevolgd, draait &oracle; als op &linux; zelf. Gevorderde onderwerpen 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 &a.chat; (Message ID: <199906020108.SAA07001@usr09.primenet.com>). Hoe werkt het? uitvoerklasselader &os; heeft een abstractie met de naam execution class loader. Dit is een wig in de systeemaanroep &man.execve.2;. Wat er gebeurt is dat &os; 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 &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 &os; 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. ELF Voor &linux; ABI-ondersteuning ziet &os; het magische getal als een ELF-binary (het maakt op dit punt geen onderscheid tussen &os;, &solaris;, &linux; of elk ander besturingssysteem dat een ELF-beeldtype heeft). &solaris; 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 &man.brandelf.1;: &prompt.root; brandelf -t Linux bestand Als dit gedaan is, ziet de ELF loader het Linux-merk in het bestand. ELF merken 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 &os;. Verder reroot de &linux;-modus dynamisch lookups. Dit is wat de optie (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 &os;-binairen kunnen laden en draaien als er geen overeenkomende &linux;-binairen zijn en dat er een &man.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 &os;-kernel. De verschillende onderliggende functies die alle functies implementeren die de kernel aanbiedt, zijn dezelfde tabelingangen voor de systeemaanroepen van &os; als van &linux;: bestandssysteembewerkingen, bewerkingen op het virtuële geheugen, signaalaflevering, System V IPC, enzovoort. Het enige verschil is dat &os;-binairen de lijm functies voor &os; 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 &os; 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 &os; 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 &os; 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 &os; &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.