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:
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.koAls 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 Hoofdstuk 9, 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.29Alle 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:
Opmerking:
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.27en 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.29Als 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 omlibc.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
Opmerking:
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
AbortOm 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.
Als DNS niet werkt of de bovenstaande melding ontstaat, dan
moet /compat/linux/etc/host.conf
ingesteld
worden met daarin:
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
.