La compatibilità con i binari Linux non è normalmente
attivata. Il modo più facile per abilitare questa
funzionalità è caricare l'oggetto KLD («Kernel
LoaDable object») linux
. Puoi caricare questo
modulo digitando il comando seguente come
root
:
#
kldload linux
Se vuoi che la compatiblità sia sempre attivata, dovresti
aggiungere questa linea a /etc/rc.conf
:
linux_enable="YES"
Il comando kldstat(8) può essere usato per verificare se KLD sia stato caricato:
%
kldstat
Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko
Se per qualche ragione non vuoi o non puoi caricare KLD, puoi
collegare staticamente la compatibilità Linux nel kernel
aggiungendo options COMPAT_LINUX
al file di
configurazione del kernel. Fatto questo puoi installare il nuovo kernel
come descritto in Capitolo 8, Configurazione del Kernel di FreeBSD.
Questo può essere fatto in due modi, o usando il port linux_base, oppure installandole manualmente.
Questo è di gran lunga il metodo più facile da usare per installare le librerie runtime. È proprio come installare qualunque altro port dalla Collezione dei Port. Semplicemente fai come segue:
#
cd /usr/ports/emulators/linux_base-fc4
#
make install distclean
In questo modo dovresti avere una compatibilità con i binari di Linux funzionante. Alcuni programmi potrebbero lamentarsi per qualche versione minore delle librerie di sistema. In generale, comunque, questo non dovrebbe essere un problema.
Potrebbero essere disponibili più versioni del port emulators/linux_base, corrispondenti a differenti versioni di distribuzioni Linux. Dovresti installare il port che più soddisfa le richieste della applicazione Linux che vuoi installare.
Se non hai installata la collezione di «ports», puoi
comunque installare le librerie manualmente. Hai bisogno delle
librerie condivise di Linux da cui il programma dipende e del runtime
linker.
In più dovrai creare una directory «shadow root»,
/compat/linux
, per le librerie Linux sul tuo
sistema FreeBSD. Tutte le librerie condivise aperte da programmi
Linux che girano sotto FreeBSD cercheranno prima in questo albero.
Per cui, se un programma Linux carica, per esempio,
/lib/libc.so
, FreeBSD prima cercherà di
aprire /compat/linux/lib/libc.so
, e se questa non
esiste, proverà con /lib/libc.so
.
Le librerie condivise dovrebbero essere installate nell'albero shadow
/compat/linux/lib
piuttosto che nei path
che riporta ld.so
di Linux.
Generalmente avrai bisogno di cercare le librerie condivise da cui dipendono i binari di Linux solo per le prime poche installazioni di programmi Linux sul tuo sistema FreeBSD. Dopo un po' avrai a disposizione sul tuo sistema un insieme sufficiente di librerie condivise per Linux da far girare nuovi binari Linux senza alcun sforzo ulteriore.
Cosa succede se installi il port linux_base
e
la tua applicazione si lamenta ancora di librerie condivise che
mancano?
Come fare a sapere quali librerie condivise necessita il binario di
Linux e dove trovarle? Essenzialmente ci sono 2 possibilità
(per seguire queste istruzioni dovrai essere root
sul tuo sistema FreeBSD).
Se hai accesso ad un sistema Linux, guarda quali librerie condivise servono all'applicazione e copiale nel tuo sistema FreeBSD. Guarda all'esempio che segue:
Poniamo che tramite FTP tu abbia recuperato il binario per Linux
di Doom, e l'abbia messo su un sistema
Linux a cui hai accesso. Puoi controllare quali librerie condivise
servono eseguendo ldd linuxdoom
,
così:
%
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
Potresti aver bisogno di recuperare tutti i file dall'ultima
colonna, e di metterli sotto /compat/linux
,
con i nomi nella prima colonna come link simbolici che puntino ad
essi.
Questo significa che alla fine avrai questi file sul tuo sistema
FreeBSD:
/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
Nota:
Nota che se hai già una libreria condivisa di Linux con un numero di revisione maggiore di quello della prima colonna dell'output di
ldd
, non dovrai copiare nel tuo sistema il file elencato nell'ultima colonna, quello che hai dovrebbe funzionare. Si raccomanda di copiare comunque la libreria condivisa se è una versione più recente. Puoi rimuovere quella vecchia, dal momento che crei il link simbolico che punta a quella nuova. Quindi, se hai queste librerie sul tuo sistema:/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27e vedi che un nuovo binario richiede una versione più recente in base all'output di
ldd
:libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Se si tratta solo di una o due versioni precedenti in base alla cifra finale allora non preoccuparti di copiare anche
/lib/libc.so.4.6.29
, perché il programma dovrebbe funzionare bene anche con una versione di poco più vecchia. In ogni caso, se vuoi, puoi decidere di rimpiazzare comunquelibc.so
, e dovrebbe lasciarti con:/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Nota:
Il meccanismo dei link simbolici è richiesto solo per i binari di Linux. Il runtime linker di FreeBSD si occupa da solo di cercare corrispondenti numeri di revisione maggiori e non devi preoccuparti di questo.
I binari ELF possono richiedere un ulteriore passo di «marchiatura». Se provi a far girare un binario ELF non marchiato, incorrerai in un messaggio come il seguente:
%
./my-linux-elf-binary
ELF binary type not known Abort
Per aiutare il kernel di FreeBSD a distinguere un binario ELF di FreeBSD da uno di Linux, usa l'utility brandelf(1).
%
brandelf -t Linux my-linux-elf-binary
Oggi, la GNU toolchain inserisce automaticamente l'appropriata informazione di marchiatura nei binari ELF, così questo passo dovrebbe divenire sempre meno necessario nel futuro.
Se il DNS non funziona o da questo messaggio:
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Dovrai configurare un file
/compat/linux/etc/host.conf
contentente:
order hosts, bind multi on
Qui, l'ordine specifica che /etc/hosts
viene cercato per primo e il DNS per secondo. Quando
/compat/linux/etc/host.conf
non è
installato, le applicazioni Linux trovano il
/etc/host.conf
di FreeBSD e si lamentano della
sintassi incompatibile di FreeBSD. Dovresti rimuovere
bind
se non hai configurato un name server
usando il file /etc/resolv.conf
.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.