A bináris Linux kompatibilitás
alapértelmezés szerint nem engedélyezett.
Legkönnyebben úgy tudjuk elérhetővé
tenni, ha betöltjük a linux
nevű
KLD modult ("Kernel LoaDable"). Ehhez
root
felhasználóként a
következőket kell begépelni:
#
kldload linux
Ha minden egyes rendszerindítás során
engedélyezni szeretnénk a bináris
kompatibilitást, akkor tegyük bele az
/etc/rc.conf
állományba ezt a
sort:
linux_enable="YES"
A modul betöltődését a kldstat(8) paranccsal tudjuk ellenőrizni:
%
kldstat
Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko
Ha valamiért nem akarjuk vagy nem éppen nem
tudjuk betölteni a modult, akkor a bináris Linux
kompatibilitást az options COMPAT_LINUX
beállítással be is tudjuk
építeni a rendszermagba. Ennek pontos
menetét a 8. fejezet - A FreeBSD rendszermag testreszabásaben találjuk
meg.
A linuxos könyvtárakat két módon is felrakhatjuk: egyrészt a linux_base port telepítésével, másrészt manuálisan.
A futtatókönyvtárakat a lehető legegyszerűbben a emulators/linux_base porton keresztül tudjuk telepíteni. Teljesen úgy történik, mint a Portgyűjtemény akármelyik másik portjának telepítése. Csupán ennyit kell beírnunk:
#
cd /usr/ports/emulators/linux_base-f10
#
make install distclean
A FreeBSD 8.0 kiadását megelőző változataiban az emulators/linux_base-f10 port helyett az emulators/linux_base-fc4 portot használjuk.
A telepítés végeztével kaptunk is egy működő bináris Linux kompatibilitást, habár egyes programok még panaszkodhatnak a rendszerkönyvtárak alverzióit illetően. Általánosságban véve ez azonban nem okoz nagyobb gondot.
A emulators/linux_base portnak több változata is használható, melyek az egyes Linux disztribúcióknak feleltethetőek meg. Ilyenkor mindig érdemes közülük azt választani, amelyik a leginkább megfelel a telepíteni kívánt linuxos alkalmazás igényeinek.
Ha korábban még nem telepítettük
volna a Portgyűjteményt, akkor egyénileg
kell felraknunk az egyes könyvtárakat.
Közülük azokra lesz
szükségünk, amelyeket maga az
alkalmazás is használni akar, valamint a
futásidejű linkerre. Emellett még a FreeBSD
rendszerünkön levő Linux binárisok
számára a /compat/linux
könyvtárban létre kell hoznunk a
gyökér ún.
"árnyékkönyvtárát"
is. A FreeBSD alatt elindított Linux programok
először ebben a könyvtárban
fogják keresni a hozzájuk tartozó osztott
könyvtárakat. Így tehát, amikor egy
linuxos program betölti például a
/lib/libc.so
függvénykönyvtárat, akkor a FreeBSD
először a
/compat/linux/lib/libc.so
állományt próbálja meg megnyitni,
majd ha az nem létezik, akkor a
/lib/libc.so
állományt. Az
osztott könyvtárak ezért a
/compat/linux/lib
árnyékkönyvtárba
telepítendőek, és nem oda, ahova a linuxos
ld.so
mutat.
Általánosságban szólva eleinte elég csak azokat az osztott könyvtárakat megkeresni és felrakni, amelyekre a telepítendő linuxos alkalmazásunknak ténylegesen szüksége van. Egy idő után úgyis összegyűlnek azok a fontosabb függvénykönyvtárak, amelyek segítségével már minden további ráfordítás nélkül futtatni tudjuk a frissen importált programokat.
Mit tegyünk, ha az emulators/linux_base port
telepítése után az alkalmazás
még mindig hiányol néhány osztott
könyvtárat? Honnan tudhatjuk meg, hogy milyen
osztott könyvtárak kellenek majd egy Linux
bináris használatához, és honnan
szerezzük be ezeket? Erre alapvetőn két
lehetőségünk van (az
utasításokat root
felhasználóként kell majd
végrehajtanunk).
Ha hozzáférünk egy Linux rendszerhez, akkor szedjük össze az alkalmazásunk futtatásához szükséges osztott könyvtárakat, és másoljuk ezeket a FreeBSD partíciójára. Például:
Tegyük fel, hogy FTP-n keresztül
leszedtük a Doom Linux
változatát, és felraktuk egy
általunk elérhető Linux rendszerre. Az
ldd linuxdoom
parancs
segítségével ki tudjuk deríteni,
milyen osztott könyvtárak kellenek majd
nekünk:
%
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
Az utolsó oszlopban levő
állományokat másoljuk át,
tegyük ezeket a /compat/linux
könyvtárba, és hozzunk létre az
első oszlopban szereplő szimbolikus linkeket.
Így tehát a következő
állományok kellenének:
/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
Megjegyzés:
Ha már rendelkezünk az
ldd
kimenetének első oszlopában szereplő főverziószámú osztott könyvtárral, akkor nem kell átmásolni az utolsó oszlopban levő állományokat, hiszen így is működnie kellene mindennek. Ha viszont egy újabb változattal találkozunk, akkor érdemes mégis inkább átmásolni. Miután a szimbolikus linkeket átirányítottuk az új változatra, a régit akár törölhetjük is. Ha például ezek a könyvtárak elérhetőek a rendszerünkön:/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27Észrevesszük, hogy az
ldd
kimenetében az új bináris egy újabb változatot igényel:libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Ha csak az utolsó jegyében marad le valamivel a verziószám, akkor nem kell különösebben aggódnunk a
/lib/libc.so.4.6.29
miatt sem, hiszen a programnak egy picivel korábbi verzióval is remekül kellene tudnia működni. Természetesen, ha akarjuk, ettől függetlenül lecserélhetjük alibc.so
állományt, ami ezt eredményezi:/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Megjegyzés:
A szimbolikus linkek karbantartása csak a Linux binárisok esetén szükséges. A FreeBSD saját futásidejű linkere magától megkeresi a megfelelő főverziószámú könyvtárakat, ezért emiatt általában nem kell aggódni.
Az ELF binárisok futtatása előtt néha még szükség van a "megbélyegzés" (branding) használatára is. Ha egy bélyegezetlen ELF binárist akarunk elindítani, akkor a következő hibaüzenetet kapjuk:
%
./egy-linux-elf-bináris
ELF binary type not known Abort
A FreeBSD rendszermagjának a brandelf(1) paranccsal tudunk segíteni a FreeBSD és a Linux binárisainak megkülönböztetésében.
%
brandelf -t Linux egy-linux-elf-bináris
A GNU által fejlesztett eszközök manapság már automatikusan elhelyezik az ELF binárisok azonosításához szükséges bélyegeket, ezért ez a lépés a jövőben egyre inkább feleslegessé válik.
A FreeBSD a telepített (akár linuxos) alkalmazások nyomonkövetésére saját csomagadatbázissal rendelkezik, amelynek következtében a Linux(R) által felkínált RPM adatbázisokat nem támogatja.
Ennek ellenére akármelyik RPM alapú Linux(R) alkalmazás telepíthető rendszerünkre a következő módon:
#
cd /compat/linux
#
rpm2cpio -q < /a/linuxos/allomány.helye.rpm | cpio -id
Ezt követően a brandelf(1) segítségével állítsuk be az ELF binárisokat (könyvtárakat viszont ne!) megfelelő típusúra. Ekkor ugyan nem leszünk képesek rendesen eltávolítani az így telepített szoftvert, de ez a módszer teszteléshez megfelelő.
Ha a névfeloldás (DNS) valamiért nem működne, vagy egy ehhez hasonló üzenetet kapunk:
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Akkor a /compat/linux/etc/host.conf
állományba be kell illesztenünk a
következő sorokat:
order hosts, bind multi on
Az itt megszabott sorrend szerint először az
/etc/hosts
állományt
nézi át, és majd csak ezután
próbálja meg feloldani a nevet. Ha a
/compat/linux/etc/host.conf
állomány nem létezik, akkor a linuxos
alkalmazás a FreeBSD /etc/host.conf
állományát találja meg, és
panaszkodni fog a FreeBSD eltérő
formátumára. Távolítsuk el a
bind
szócskát, ha nem
állítottunk be névszervert az
/etc/resolv.conf
állományhoz.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.