Η συμβατότητα με εκτελέσιμα του Linux δεν είναι ενεργή εξ' αρχής. Ο
ευκολότερος τρόπος για να ενεργοποιήσετε αυτή τη λειτουργία είναι να
φορτώσετε το KLD (άρθρωμα) linux
(“Kernel
LoaDable object”). Μπορείτε να φορτώσετε αυτό το άρθρωμα στον
πυρήνα δίνοντας τη παρακάτω εντολή ως root
:
#
kldload linux
Αν θέλετε να έχετε πάντα ενεργοποιημένη τη συμβατότητα με Linux,
τότε θα χρειαστεί να προσθέσετε τη παρακάτω γραμμή στο
/etc/rc.conf
:
Η εντολή kldstat(8) μπορεί να χρησιμοποιηθεί για να ελεγχθεί αν το KLD είναι φορτωμένο:
%
kldstat
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.koΑν για κάποιο λόγο δεν θέλετε ή δε μπορείτε να φορτώσετε το KLD,
τότε μπορείτε να συνδέσετε στατικά την υποστήριξη εκτελέσιμων του Linux
στον πυρήνα με το να προσθέσετε την επιλογή options
COMPAT_LINUX
στο αρχείων ρυθμίσεων του πυρήνα. Στη συνέχεια
μπορείτε να εγκαταστήσετε τον νέο πυρήνα όπως περιγράφεται στο
Κεφάλαιο 9, Ρυθμίζοντας τον Πυρήνα του FreeBSD.
Αυτό μπορεί να γίνει με δύο τρόπους. Είτε με τη χρήση του linux_base-fc4 port, ή με χειροκίνητη εγκατάσταση τους.
Αυτός είναι κατά γενική ομολογία ο ευκολότερος τρόπος για την εγκατάσταση των runtime libraries. Είναι η ίδια διαδικασία εγκατάστασης που ακολουθείται και για οποιοδήποτε άλλο port από τη Συλλογή των Ports. Απλά κάντε το παρακάτω:
#
cd /usr/ports/emulators/linux_base-f10
#
make install distclean
Αν χρησιμοποιείτε κάποια έκδοση του FreeBSD πριν την 8.0, θα
πρέπει να εγκαταστήσετε το port emulators/linux_base-fc4
αντί για το emulators/linux_base-f10
.
Θα πρέπει τώρα να έχετε κανονική συμβατότητα με εκτελέσιμα του Linux. Μερικά προγράμματα παραπονιούνται ότι οι βιβλιοθήκες συστήματος (system libraries) δεν είναι στη τελευταία τους έκδοση. Γενικά όμως, αυτό δεν αποτελεί κανένα πρόβλημα.
Μπορούν να υπάρχουν πολλαπλές εκδόσεις
του emulators/linux_base
, που να
αντιστοιχούν στις διαφορετικές εκδόσεις των διανομών Linux. Θα
πρέπει να κάνετε εγκατάσταση των ports που προαπαιτούνται από τις
εφαρμογές Linux τις οποίες θέλετε να εγκαταστήσετε.
Αν δεν έχετε εγκαταστήσει την συλλογή των “ports”,
μπορείτε να εγκαταστήσετε τις βιβλιοθήκες χειροκίνητα. Θα
χρειαστείτε τα Linux shared libraries τα οποία απαιτεί το πρόγραμμα.
Επίσης, θα χρειαστεί να δημιουργήσετε και έναν κατάλογο
“shadow root”, /compat/linux
, για
τις βιβλιοθήκες Linux που θα υπάρχουν στο FreeBSD. Οποιαδήποτε κοινές
βιβλιοθήκες (shared libraries) οι οποίες χρησιμοποιούνται από
εφαρμογές Linux και εκτελούνται στο FreeBSD θα κοιτάξουν πρώτα σε
αυτόν τον κατάλογο. Επομένως, αν μια εφαρμογή Linux φορτώσει για
παράδειγμα το /lib/libc.so
, το FreeBSD θα
προσπαθήσει να φορτώσει πρώτα το
/compat/linux/lib/libc.so
,
και αν αυτό δεν υπάρχει, τότε θα προσπαθήσει να φορτώσει
το /lib/libc.so
. Τα shared libraries θα πρέπει
να εγκατασταθούν στο shadow
tree /compat/linux/lib
αντί για τις τοποθεσίες
που αναφέρει το ld.so
στο Linux.
Γενικά, τουλάχιστον στις πρώτες σας εγκαταστάσεις εφαρμογών Linux, θα χρειαστεί να ψάξετε για τις κοινές βιβλιοθήκες από τα αντίστοιχα εκτελέσιμα. Μετά από κάποιο διάστημα θα έχετε ένα ικανοποιητικό αριθμό Linux shared libraries στο σύστημά σας και πλέον δε θα χρειάζεται επιπλέον εργασία πέρα από την εγκατάσταση της εφαρμογής.
Και τι γίνεται στη περίπτωση που έχετε εγκαταστήσει
το linux_base
port και οι εφαρμογές σας ακόμη
παραπονιούνται για shared libraries που λείπουν; Πώς μπορείτε να
ξέρετε ποια shared libraries χρειάζεται κάποια εφαρμογή, και που
μπορείτε να τα βρείτε; Βασικά, υπάρχουν 2 επιλογές (για να
ακολουθήσετε τις παρακάτω οδηγίες θα πρέπει να είστε
root
στο σύστημά σας).
Αν έχετε πρόσβαση σε κάποιο μηχάνημα Linux, ρίξτε μια ματιά στα shared libraries που χρειάζεται μια εφαρμογή, και αντιγράψτε τα στο FreeBSD. Δείτε το παρακάτω παράδειγμα:
Ας υποθέσουμε ότι κατεβάσατε μέσω FTP το εκτελέσιμο του
Doom για το Linux, και το βάλατε
στο Linux σύστημα στο οποίο έχετε πρόσβαση. Μπορείτε στη
συνέχεια να ελέγξετε ποια shared libraries χρειάζεται η εφαρμογή
με την εντολή ldd linuxdoom
, όπως:
%
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Θα χρειαστεί να πάρετε όλα τα αρχεία από τη τελευταία στήλη,
και να τα αντιγράψετε στον
κατάλογο /compat/linux
, και να δημιουργήσετε
προς αυτά τους αντίστοιχους συμβολικούς δεσμούς (symbolic links)
με τα ονόματα της πρώτης στήλης. Αυτό σημαίνει ότι πρακτικά,
θα έχετε αυτά τα αρχεία στο σύστημα σας:
Σημείωση:
Σημειώστε ότι αν έχετε ήδη κάποιο Linux shared library που ο αριθμός έκδοσης είναι ο ίδιος με αυτόν της πρώτης στήλης του
ldd
, δε θα χρειαστεί να αντιγράψετε το αρχείο όπως αυτό ονομάζεται στη τελευταία στήλη, τα υπάρχοντα αρχεία θα πρέπει να κάνουν τη δουλειά τους. Σας συμβουλεύουμε όμως να αντιγράψετε το shared library αν είναι κάποια νεότερη έκδοση. Μπορείτε να διαγράψετε τα παλιά αρχεία, αρκεί όμως να ανανεώσετε τους συμβολικούς δεσμούς ώστε να οδηγούν στα νέα αρχεία. Επομένως, αν έχετε τις παρακάτω βιβλιοθήκες στο σύστημά σας:/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27και βρείτε μια εφαρμογή η οποία ζητάει μια νεότερη έκδοση μέσω του
ldd
:libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Αν η διαφορά της έκδοσης στο τελευταία ψηφίο είναι μόνο μίας ή δύο εκδόσεων, τότε μην σας απασχολεί η αντιγραφή του
/lib/libc.so.4.6.29
, γιατί το πρόγραμμα θα πρέπει να τρέχει κανονικά και με τη λίγο παλαιότερη έκδοση. Παρ' όλα αυτά, αν θέλετε, μπορείτε να αντικαταστήσετε τοlibc.so
και έτσι θα έχετε το παρακάτω:/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Σημείωση:
Ο μηχανισμός των συμβολικών συνδέσμων χρειάζεται μόνο για τις εφαρμογές του Linux. Ο runtime linker του FreeBSD κοιτάει μόνος του για τις πιο πρόσφατες εκδόσεις των βιβλιοθηκών και έτσι δε χρειάζεται να σας απασχολεί.
Τα ELF binaries χρειάζονται μερικές φορές ένα ακόμα βήμα, το “branding”. Αν προσπαθήσετε να τρέξετε ένα εκτελέσιμο ELF χωρίς branding, τότε θα σας εμφανιστεί το παρακάτω σφάλμα:
%
./my-linux-elf-binary
ELF binary type not known
AbortΓια να βοηθήσετε τον πυρήνα του FreeBSD να ξεχωρίσει ένα ELF του FreeBSD από ένα του Linux, χρησιμοποιήστε την εντολή brandelf(1).
%
brandelf -t Linux my-linux-elf-binary
To GNU toolchain, ομάδα πρόγραμμα GNU, τοποθετεί πλέον αυτόματα τα κατάλληλα χαρακτηριστικά στα εκτελέσιμα ELF, επομένως το παραπάνω βήμα θα χρειάζεται όλο και λιγότερο στο μέλλον.
Το FreeBSD διαθέτει την δική του βάση δεδομένων για τα πακέτα, η οποία χρησιμοποιείται για όλα τα ports (και για αυτά που προέρχονται από το Linux®). Για το λόγο αυτό, η βάση δεδομένων Linux® RPM δεν χρησιμοποιείται (δεν υποστηρίζεται).
Αν ωστόσο χρειάζεται να εγκαταστήσετε μια οποιαδήποτε εφαρμογή του Linux® που βασίζεται σε πακέτο RPM, μπορείτε να το επιτύχετε με τον παρακάτω τρόπο:
#
cd /compat/linux
#
rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id
Χρησιμοποιήστε την brandelf(1) για να τυποποιήσετε κατάλληλα τα εκτελέσιμα (όχι τις βιβλιοθήκες!) ως εφαρμογές Linux®. Δεν θα μπορείτε να απεγκαταστήσετε τις εφαρμογές με καθαρό τρόπο, αλλά θα μπορέσετε να κάνετε τις δοκιμές που επιθυμείτε.
Αν το DNS δε δουλεύει ή αν σας εμφανίζεται το παρακάτω σφάλμα:
Θα χρειαστεί να ρυθμίσετε
το /compat/linux/etc/host.conf
ώστε να περιέχει:
Η σειρά εδώ δηλώνει ότι αρχικά ελέγχεται το
αρχείο /etc/hosts
και στη συνέχεια ο DNS server.
Όταν το /compat/linux/etc/host.conf
δεν είναι
διαθέσιμο, οι εφαρμογές Linux χρησιμοποιούν το
/etc/host.conf
του FreeBSD και παραπονιούνται ότι
η σύνταξη του αρχείου δεν είναι σωστή. Θα πρέπει να αφαιρέσετε
την αναφορά στο bind
αν δεν έχετε ρυθμίσει ένα
name server μέσω του /etc/resolv.conf
.
Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την
τεκμηρίωση πριν να επικοινωνήσετε με την
<questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην
<doc@FreeBSD.org>.