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.
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.
Nota: 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 comunque libc.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 <[email protected]>.
Per domande su questa documentazione, invia una e-mail a <[email protected]>.