--- title: Κεφάλαιο 11. Συμβατότητα με Εκτελέσιμα του Linux part: Μέρος II. Βασικές Εργασίες prev: books/handbook/printing next: books/handbook/partiii showBookMenu: true weight: 14 params: path: "/books/handbook/linuxemu/" --- [[linuxemu]] = Συμβατότητα με Εκτελέσιμα του Linux :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 11 :partnums: :source-highlighter: rouge :experimental: :images-path: books/handbook/linuxemu/ ifdef::env-beastie[] ifdef::backend-html5[] :imagesdir: ../../../../images/{images-path} endif::[] ifndef::book[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] toc::[] endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] toc::[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [[linuxemu-synopsis]] == Σύνοψη Το FreeBSD παρέχει binary συμβατότητα (εκτελέσιμων) με αρκετά άλλα λειτουργικά τύπου UNIX(R), συμπεριλαμβανομένου και του Linux. Σε αυτό το σημείο, μπορεί να αναρωτιέστε γιατί ακριβώς χρειάζεται το FreeBSD να μπορεί να τρέξει εκτελέσιμα Linux; H απάντηση σε αυτή την ερώτηση είναι αρκετά απλή. Πολλές εταιρίες και προγραμματιστές αναπτύσσουν εφαρμογές μόνο για Linux, μια και είναι πολύ "της μόδας" στο κόσμο των υπολογιστών. Αυτό αναγκάζει εμάς τους υπόλοιπους, που χρησιμοποιούμε το FreeBSD, να πιέζουμε τις ίδιες αυτές εταιρίες και προγραμματιστές να δημιουργήσουν κανονικές εκδόσεις των εφαρμογών τους για FreeBSD. Το πρόβλημα είναι, ότι οι περισσότερες από αυτές τις εταιρίες δεν αντιλαμβάνονται πραγματικά πόσοι περισσότεροι άνθρωποι θα χρησιμοποιούσαν το προϊόν τους αν είχαν εκδόσεις και για FreeBSD, και οι περισσότερες συνεχίζουν να αναπτύσσουν μόνο για Linux. Άρα τι μπορεί να κάνει ένας χρήστης του FreeBSD; Εδώ έρχεται να βοηθήσει η binary συμβατότητα του FreeBSD με το Linux. Εν συντομία, η συμβατότητα επιτρέπει στους χρήστες του FreeBSD να εκτελέσουν περίπου το 90% όλων των Linux εφαρμογών χωρίς μετατροπές. Αυτό περιλαμβάνει εφαρμογές όπως το StarOffice(TM), την Linux έκδοση του man:getenv[3], Adobe(R) Acrobat(R), RealPlayer(R), Oracle(R), WordPerfect(R), Doom, Quake, και περισσότερα. Έχει επίσης αναφερθεί ότι σε κάποιες περιπτώσεις, τα εκτελέσιμα του Linux έχουν καλύτερη απόδοση στο FreeBSD από ότι στο Linux. Υπάρχουν ωστόσο κάποια συγκεκριμένα για το Linux στοιχεία του λειτουργικού που δεν υποστηρίζονται στο FreeBSD. Τα εκτελέσιμα του Linux δεν θα δουλέψουν στο FreeBSD αν χρησιμοποιούν πολλές εξειδικευμένες κλήσεις i386(TM), όπως για παράδειγμα την ενεργοποίηση της εικονικής κατάστασης 8086. Αφού διαβάσετε αυτό το κεφάλαιο, θα ξέρετε: * Πως να ενεργοποιήσετε την συμβατότητα εκτελέσιμων με το Linux στο σύστημα σας. * Πως να εγκαταστήσετε πρόσθετες κοινόχρηστες βιβλιοθήκες του Linux. * Πως να εγκαταστήσετε εφαρμογές του Linux στο FreeBSD. * Τις λεπτομέρειες της υλοποίησης της συμβατότητας με το Linux στο FreeBSD. Πριν διαβάσετε αυτό το κεφάλαιο, θα πρέπει: * Να γνωρίζετε πως θα εγκαταστήσετε πρόσθετο λογισμικό τρίτου κατασκευαστή (crossref:ports[ports,Εγκατάσταση Εφαρμογών: Πακέτα και Ports]). [[linuxemu-lbc-install]] == Εγκατάσταση Η συμβατότητα με εκτελέσιμα του Linux δεν είναι ενεργή εξ' αρχής. Ο ευκολότερος τρόπος για να ενεργοποιήσετε αυτή τη λειτουργία είναι να φορτώσετε το KLD (άρθρωμα) `linux` ("Kernel LoaDable object"). Μπορείτε να φορτώσετε αυτό το άρθρωμα στον πυρήνα δίνοντας τη παρακάτω εντολή ως `root`: [source,shell] .... # kldload linux .... Αν θέλετε να έχετε πάντα ενεργοποιημένη τη συμβατότητα με Linux, τότε θα χρειαστεί να προσθέσετε τη παρακάτω γραμμή στο [.filename]#/etc/rc.conf#: [.programlisting] .... linux_enable="YES" .... Η εντολή man:kldstat[8] μπορεί να χρησιμοποιηθεί για να ελεγχθεί αν το KLD είναι φορτωμένο: [source,shell] .... % kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko .... Αν για κάποιο λόγο δεν θέλετε ή δε μπορείτε να φορτώσετε το KLD, τότε μπορείτε να συνδέσετε στατικά την υποστήριξη εκτελέσιμων του Linux στον πυρήνα με το να προσθέσετε την επιλογή `options COMPAT_LINUX` στο αρχείων ρυθμίσεων του πυρήνα. Στη συνέχεια μπορείτε να εγκαταστήσετε τον νέο πυρήνα όπως περιγράφεται στο crossref:kernelconfig[kernelconfig,Ρυθμίζοντας τον Πυρήνα του FreeBSD]. === Εγκατάσταση των Linux Runtime Libraries Αυτό μπορεί να γίνει με δύο τρόπους. Είτε με τη χρήση του <> port, ή με <> εγκατάσταση τους. [[linuxemu-libs-port]] ==== Εγκατάσταση μέσω του linux_base Port Αυτός είναι κατά γενική ομολογία ο ευκολότερος τρόπος για την εγκατάσταση των runtime libraries. Είναι η ίδια διαδικασία εγκατάστασης που ακολουθείται και για οποιοδήποτε άλλο port από τη crossref:ports[ports,Συλλογή των Ports]. Απλά κάντε το παρακάτω: [source,shell] .... # cd /usr/ports/emulators/linux_base-f10 # make install distclean .... [NOTE] ==== Αν χρησιμοποιείτε κάποια έκδοση του FreeBSD πριν την 8.0, θα πρέπει να εγκαταστήσετε το port package:emulators/linux_base-fc4[] αντί για το package:emulators/linux_base-f10[]. ==== Θα πρέπει τώρα να έχετε κανονική συμβατότητα με εκτελέσιμα του Linux. Μερικά προγράμματα παραπονιούνται ότι οι βιβλιοθήκες συστήματος (system libraries) δεν είναι στη τελευταία τους έκδοση. Γενικά όμως, αυτό δεν αποτελεί κανένα πρόβλημα. [NOTE] ==== Μπορούν να υπάρχουν πολλαπλές εκδόσεις του package:emulators/linux_base[], που να αντιστοιχούν στις διαφορετικές εκδόσεις των διανομών Linux. Θα πρέπει να κάνετε εγκατάσταση των ports που προαπαιτούνται από τις εφαρμογές Linux τις οποίες θέλετε να εγκαταστήσετε. ==== [[linuxemu-libs-manually]] ==== Χειροκίνητη εγκατάσταση των Libraries Αν δεν έχετε εγκαταστήσει την συλλογή των "ports", μπορείτε να εγκαταστήσετε τις βιβλιοθήκες χειροκίνητα. Θα χρειαστείτε τα Linux shared libraries τα οποία απαιτεί το πρόγραμμα. Επίσης, θα χρειαστεί να δημιουργήσετε και έναν κατάλογο "shadow root", [.filename]#/compat/linux#, για τις βιβλιοθήκες Linux που θα υπάρχουν στο FreeBSD. Οποιαδήποτε κοινές βιβλιοθήκες (shared libraries) οι οποίες χρησιμοποιούνται από εφαρμογές Linux και εκτελούνται στο FreeBSD θα κοιτάξουν πρώτα σε αυτόν τον κατάλογο. Επομένως, αν μια εφαρμογή Linux φορτώσει για παράδειγμα το [.filename]#/lib/libc.so#, το FreeBSD θα προσπαθήσει να φορτώσει πρώτα το [.filename]#/compat/linux/lib/libc.so#, και αν αυτό δεν υπάρχει, τότε θα προσπαθήσει να φορτώσει το [.filename]#/lib/libc.so#. Τα shared libraries θα πρέπει να εγκατασταθούν στο shadow tree [.filename]#/compat/linux/lib# αντί για τις τοποθεσίες που αναφέρει το `ld.so` στο Linux. Γενικά, τουλάχιστον στις πρώτες σας εγκαταστάσεις εφαρμογών Linux, θα χρειαστεί να ψάξετε για τις κοινές βιβλιοθήκες από τα αντίστοιχα εκτελέσιμα. Μετά από κάποιο διάστημα θα έχετε ένα ικανοποιητικό αριθμό Linux shared libraries στο σύστημά σας και πλέον δε θα χρειάζεται επιπλέον εργασία πέρα από την εγκατάσταση της εφαρμογής. ==== Εγκατάσταση Πρόσθετων Shared Libraries Και τι γίνεται στη περίπτωση που έχετε εγκαταστήσει το [.filename]#linux_base# port και οι εφαρμογές σας ακόμη παραπονιούνται για shared libraries που λείπουν; Πώς μπορείτε να ξέρετε ποια shared libraries χρειάζεται κάποια εφαρμογή, και που μπορείτε να τα βρείτε; Βασικά, υπάρχουν 2 επιλογές (για να ακολουθήσετε τις παρακάτω οδηγίες θα πρέπει να είστε `root` στο σύστημά σας). Αν έχετε πρόσβαση σε κάποιο μηχάνημα Linux, ρίξτε μια ματιά στα shared libraries που χρειάζεται μια εφαρμογή, και αντιγράψτε τα στο FreeBSD. Δείτε το παρακάτω παράδειγμα: Ας υποθέσουμε ότι κατεβάσατε μέσω FTP το εκτελέσιμο του Doom για το Linux, και το βάλατε στο Linux σύστημα στο οποίο έχετε πρόσβαση. Μπορείτε στη συνέχεια να ελέγξετε ποια shared libraries χρειάζεται η εφαρμογή με την εντολή `ldd linuxdoom`, όπως: [source,shell] .... % 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 .... Θα χρειαστεί να πάρετε όλα τα αρχεία από τη τελευταία στήλη, και να τα αντιγράψετε στον κατάλογο [.filename]#/compat/linux#, και να δημιουργήσετε προς αυτά τους αντίστοιχους συμβολικούς δεσμούς (symbolic links) με τα ονόματα της πρώτης στήλης. Αυτό σημαίνει ότι πρακτικά, θα έχετε αυτά τα αρχεία στο σύστημα σας: [source,shell] .... /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 .... [NOTE] ==== Σημειώστε ότι αν έχετε ήδη κάποιο Linux shared library που ο αριθμός έκδοσης είναι ο ίδιος με αυτόν της πρώτης στήλης του `ldd`, δε θα χρειαστεί να αντιγράψετε το αρχείο όπως αυτό ονομάζεται στη τελευταία στήλη, τα υπάρχοντα αρχεία θα πρέπει να κάνουν τη δουλειά τους. Σας συμβουλεύουμε όμως να αντιγράψετε το shared library αν είναι κάποια νεότερη έκδοση. Μπορείτε να διαγράψετε τα παλιά αρχεία, αρκεί όμως να ανανεώσετε τους συμβολικούς δεσμούς ώστε να οδηγούν στα νέα αρχεία. Επομένως, αν έχετε τις παρακάτω βιβλιοθήκες στο σύστημά σας: [source,shell] .... /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 .... και βρείτε μια εφαρμογή η οποία ζητάει μια νεότερη έκδοση μέσω του `ldd`: [source,shell] .... libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 .... Αν η διαφορά της έκδοσης στο τελευταία ψηφίο είναι μόνο μίας ή δύο εκδόσεων, τότε μην σας απασχολεί η αντιγραφή του [.filename]#/lib/libc.so.4.6.29#, γιατί το πρόγραμμα θα πρέπει να τρέχει κανονικά και με τη λίγο παλαιότερη έκδοση. Παρ' όλα αυτά, αν θέλετε, μπορείτε να αντικαταστήσετε το [.filename]#libc.so# και έτσι θα έχετε το παρακάτω: [source,shell] .... /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 .... ==== [NOTE] ==== Ο μηχανισμός των συμβολικών συνδέσμων χρειάζεται _μόνο_ για τις εφαρμογές του Linux. Ο runtime linker του FreeBSD κοιτάει μόνος του για τις πιο πρόσφατες εκδόσεις των βιβλιοθηκών και έτσι δε χρειάζεται να σας απασχολεί. ==== === Εγκατάσταση των Linux ELF Binaries Τα ELF binaries χρειάζονται μερικές φορές ένα ακόμα βήμα, το "branding". Αν προσπαθήσετε να τρέξετε ένα εκτελέσιμο ELF χωρίς branding, τότε θα σας εμφανιστεί το παρακάτω σφάλμα: [source,shell] .... % ./my-linux-elf-binary ELF binary type not known Abort .... Για να βοηθήσετε τον πυρήνα του FreeBSD να ξεχωρίσει ένα ELF του FreeBSD από ένα του Linux, χρησιμοποιήστε την εντολή man:brandelf[1]. [source,shell] .... % brandelf -t Linux my-linux-elf-binary .... To GNU toolchain, ομάδα πρόγραμμα GNU, τοποθετεί πλέον αυτόματα τα κατάλληλα χαρακτηριστικά στα εκτελέσιμα ELF, επομένως το παραπάνω βήμα θα χρειάζεται όλο και λιγότερο στο μέλλον. === Εγκατάσταση μιας Τυχαίας Linux RPM Εφαρμογής Το FreeBSD διαθέτει την δική του βάση δεδομένων για τα πακέτα, η οποία χρησιμοποιείται για όλα τα ports (και για αυτά που προέρχονται από το Linux(R)). Για το λόγο αυτό, η βάση δεδομένων Linux(R) RPM δεν χρησιμοποιείται (δεν υποστηρίζεται). Αν ωστόσο χρειάζεται να εγκαταστήσετε μια οποιαδήποτε εφαρμογή του Linux(R) που βασίζεται σε πακέτο RPM, μπορείτε να το επιτύχετε με τον παρακάτω τρόπο: [source,shell] .... # cd /compat/linux # rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id .... Χρησιμοποιήστε την man:brandelf[1] για να τυποποιήσετε κατάλληλα τα εκτελέσιμα (όχι τις βιβλιοθήκες!) ως εφαρμογές Linux(R). Δεν θα μπορείτε να απεγκαταστήσετε τις εφαρμογές με καθαρό τρόπο, αλλά θα μπορέσετε να κάνετε τις δοκιμές που επιθυμείτε. === Ρύθμιση του Hostname Resolver Αν το DNS δε δουλεύει ή αν σας εμφανίζεται το παρακάτω σφάλμα: [source,shell] .... resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword .... Θα χρειαστεί να ρυθμίσετε το [.filename]#/compat/linux/etc/host.conf# ώστε να περιέχει: [.programlisting] .... order hosts, bind multi on .... Η σειρά εδώ δηλώνει ότι αρχικά ελέγχεται το αρχείο [.filename]#/etc/hosts# και στη συνέχεια ο DNS server. Όταν το [.filename]#/compat/linux/etc/host.conf# δεν είναι διαθέσιμο, οι εφαρμογές Linux χρησιμοποιούν το [.filename]#/etc/host.conf# του FreeBSD και παραπονιούνται ότι η σύνταξη του αρχείου δεν είναι σωστή. Θα πρέπει να αφαιρέσετε την αναφορά στο `bind` αν δεν έχετε ρυθμίσει ένα name server μέσω του [.filename]#/etc/resolv.conf#. [[linuxemu-mathematica]] == Εγκαθιστώντας το Mathematica(R) Το κείμενο αυτό περιγράφει τη διαδικασία εγκατάστασης της έκδοσης Linux του Mathematica(R) 5.X σε ένα σύστημα FreeBSD. Μπορείτε να αγοράσετε την κανονική ή μαθητική έκδοση του Mathematica(R) για Linux, απευθείας από τη Wolfram στο http://www.wolfram.com/[http://www.wolfram.com/]. === Το Πρόγραμμα Εγκατάστασης του Mathematica(R) Αρχικά, θα πρέπει να πείτε στο FreeBSD ότι τα εκτελέσιμα για Linux του Mathematica(R) κάνουν χρήση του Linux ABI. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να ορίσετε τον τύπο του ELF ως Linux σε όλες τις εφαρμογές που δεν είναι ήδη branded, κάνοντας χρήση της εντολής: [source,shell] .... # sysctl kern.fallback_elf_brand=3 .... Αυτό θα κάνει το FreeBSD να υποθέσει ότι τα εκτελέσιμα ELF που δεν είναι branded, κάνουν χρήση του Linux ABI και έτσι θα μπορείτε να τρέξετε το πρόγραμμα της εγκατάστασης απευθείας από το CDROM. Τώρα, αντιγράψτε το αρχείο [.filename]#MathInstaller# στον σκληρό σας δίσκο: [source,shell] .... # mount /cdrom # cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/ .... Ανοίξτε το αρχείο και αντικαταστήστε το `/bin/sh` στη πρώτη γραμμή με το `/compat/linux/bin/sh`. Αυτό θα σιγουρέψει ότι το πρόγραμμα εγκατάστασης θα τρέχει με την έκδοση man:sh[1] για Linux. Στη συνέχεια, αντικαταστήστε όλες τις εγγραφές `Linux)` με `FreeBSD)` χρησιμοποιώντας έναν συντάκτη κειμένου ή με το παρακάτω script στην επόμενη ενότητα. Αυτό θα πει στο πρόγραμμα εγκατάστασης του Mathematica(R), το οποίο τρέχει την εντολή `uname -s` για να διαπιστώσει το λειτουργικό σύστημα, να αντιμετωπίσει το FreeBSD σαν ένα λειτουργικό παρεμφερές με το Linux. Η εκτέλεση του `MathInstaller` θα ξεκινήσει τώρα την εγκατάσταση του Mathematica(R). === Τροποποιώντας τα Εκτελέσιμα του Mathematica(R) Τα shell scripts τα οποία δημιουργεί το Mathematica(R) κατά τη διαδικασία της εγκατάστασης πρέπει να τροποποιηθούν πριν χρησιμοποιηθούν. Αν επιλέξετε το [.filename]#/usr/local/bin# ως τον κατάλογο για τα εκτελέσιμα του Mathematica(R), θα βρείτε εκεί συμβολικούς δεσμούς (symlinks) προς τα αρχεία [.filename]#math#, [.filename]#mathematica#, [.filename]#Mathematica#, και [.filename]#MathKernel#. Σε κάθε περίπτωση από τις παραπάνω, αντικαταστήστε τις εγγραφές `Linux)` με `FreeBSD)` με κάποιον συντάκτη κειμένου ή με το παρακάτω shell script: [.programlisting] .... #!/bin/sh cd /usr/local/bin for i in math mathematica Mathematica MathKernel do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i rm $i.tmp chmod a+x $i done .... === Αποκτώντας Κωδικό για το Mathematica(R) Όταν εκκινήσετε το Mathematica(R) για πρώτη φορά, θα ερωτηθείτε για έναν κωδικό. Αν δεν έχετε κάποιον κωδικό σε αυτό το στάδιο, τρέξτε το πρόγραμμα `mathinfo` που βρίσκεται στον κατάλογο εγκατάστασης για να σας δοθεί το "machine ID". Το "machine ID" είναι εξ' ολοκλήρου βασισμένο στη διεύθυνση MAC της κάρτας δικτύου που έχετε. Αυτό σημαίνει ότι δεν μπορείτε να τρέξετε το Mathematica(R) σε άλλους υπολογιστές. Όταν εγγραφείτε στη Wolfram, με e-mail, τηλέφωνο ή fax, θα χρειαστεί να δώσετε το "machine ID" και θα σας απαντήσουν με έναν αντίστοιχο κωδικό που θα αποτελείται από μια σειρά αριθμών. === Τρέχοντας το Mathematica(R) Frontend μέσω Δικτύου Το Mathematica(R) κάνει χρήση κάποιων ειδικών γραμματοσειρών για να εμφανίσει χαρακτήρες οι οποίοι δεν υπάρχουν στα συνηθισμένα σετ (ολοκληρώματα, αθροίσματα, Ελληνικά γράμματα, κλπ). To πρωτόκολλο X απαιτεί αυτές οι γραμματοσειρές να υπάρχουν στο _τοπικό_ σύστημα. Αυτό σημαίνει ότι θα χρειαστεί να αντιγράψετε τις γραμματοσειρές αυτές από το CDROM ή από από κάποιον άλλον υπολογιστή που έχει το Mathematica(R). Συνήθως αυτές οι γραμματοσειρές μπορούν να βρεθούν μέσα στο κατάλογο [.filename]#/cdrom/Unix/Files/SystemFiles/Fonts# του CDROM, ή στον κατάλογο [.filename]#/usr/local/mathematica/SystemFiles/Fonts# στον τοπικό σκληρό δίσκο. Οι πραγματικές γραμματοσειρές βρίσκονται σε υποκαταλόγους όπως [.filename]#Type1# και [.filename]#X#. Υπάρχουν αρκετοί τρόποι να τις χρησιμοποιήσετε, οι οποίοι περιγράφονται στη συνέχεια. Ο πρώτος τρόπος είναι να τις αντιγράψετε μέσα σε έναν υπάρχοντα κατάλογο στο [.filename]#/usr/X11R6/lib/X11/fonts#. Θα χρειαστεί όμως να τροποποιήσετε το αρχείο [.filename]#fonts.dir#, ώστε να προσθέσετε τα ονόματα των γραμματοσειρών μέσα σε αυτό, και να αλλάξετε τον αριθμό των γραμματοσειρών στη πρώτη γραμμή. Εναλλακτικά, είναι συνήθως αρκετό να εκτελέσετε απλώς την εντολή man:mkfontdir[1] μέσα στον κατάλογο που έχετε αντιγράψει τις γραμματοσειρές. Ο δεύτερος τρόπος είναι να αντιγράψετε τους παραπάνω καταλόγους μέσα στο [.filename]#/usr/X11R6/lib/X11/fonts#: [source,shell] .... # cd /usr/X11R6/lib/X11/fonts # mkdir X # mkdir MathType1 # cd /cdrom/Unix/Files/SystemFiles/Fonts # cp X/* /usr/X11R6/lib/X11/fonts/X # cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 # cd /usr/X11R6/lib/X11/fonts/X # mkfontdir # cd ../MathType1 # mkfontdir .... Τώρα προσθέστε τους νέους καταλόγους με τις γραμματοσειρές στο font path: [source,shell] .... # xset fp+ /usr/X11R6/lib/X11/fonts/X # xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 # xset fp rehash .... Αν χρησιμοποιείτε το Xorg, μπορείτε να φορτώνετε τις γραμματοσειρές αυτές αυτόματα, προσθέτοντας τους νέους καταλόγους στο αρχείο [.filename]#xorg.conf#. Αν _δεν_ έχετε ήδη έναν κατάλογο με το όνομα [.filename]#/usr/X11R6/lib/X11/fonts/Type1#, μπορείτε να αλλάξετε το όνομα του [.filename]#MathType1# από το παραπάνω παράδειγμα σε [.filename]#Type1#. [[linuxemu-maple]] == Εγκαθιστώντας το Maple(TM) Το Maple(TM) είναι μία εμπορική εφαρμογή μαθηματικών παρόμοια με το Mathematica(R). Θα πρέπει να αγοράσετε το λογισμικό από το http://www.maplesoft.com/[http://www.maplesoft.com/] και στη συνέχεια να κάνετε αίτηση για μια άδεια χρήσης. Για να εγκαταστήσετε το λογισμικό στο FreeBSD, ακολουθήστε τα παρακάτω απλά βήματα. [.procedure] . Εκτελέστε το [.filename]#INSTALL# shell script από το μέσο εγκατάστασης που έχετε. Επιλέξτε "RedHat" όταν ερωτηθείτε από το πρόγραμμα εγκατάστασης. Ο τυπικός κατάλογος είναι ο [.filename]#/usr/local/maple#. . Αν δεν έχετε αγοράσει ακόμη κάποια άδεια για το Maple(TM), αγοράστε μία από το Maple Waterloo Software (http://register.maplesoft.com/[http://register.maplesoft.com/]) και αντιγράψτε το αρχείο που θα σας δοθεί στο [.filename]#/usr/local/maple/license/license.dat#. . Εγκαταστήσετε το FLEXlm license manager εκτελώντας το [.filename]#INSTALL_LIC# shell script το οποία παρέχεται μαζί με το Maple(TM). Δώστε το βασικό όνομα του υπολογιστή σας το οποίο απαιτείται από τον εξυπηρετητή διαχείρισης των αδειών (license server). . Χρησιμοποιήστε το παρακάτω patch στο αρχείο [.filename]#/usr/local/maple/bin/maple.system.type#: + [.programlisting] .... ----- snip ------------------ *** maple.system.type.orig Sun Jul 8 16:35:33 2001 --- maple.system.type Sun Jul 8 16:35:51 2001 *************** *** 72,77 **** --- 72,78 ---- # the IBM RS/6000 AIX case MAPLE_BIN="bin.IBM_RISC_UNIX" ;; + "FreeBSD"|\ "Linux") # the Linux/x86 case # We have two Linux implementations, one for Red Hat and ----- snip end of patch ----- .... + Σημειώστε ότι μετά το `"FreeBSD"|\` δεν πρέπει να εμφανίζεται άλλο κενό διάστημα. + Το patch αυτό οδηγεί το Maple(TM) να αναγνωρίσει το "FreeBSD" σαν ένα σύστημα Linux. Το [.filename]#bin/maple# shell script καλεί το [.filename]#bin/maple.system.type# shell script, το οποίο με τη σειρά του καλεί την εντολή `uname -a` προκειμένου να εντοπιστεί το όνομα του λειτουργικού συστήματος. Αναλόγως με το ποιο λειτουργικό βρεθεί, θα χρησιμοποιηθούν και τα αντίστοιχα εκτελέσιμα αρχεία. . Εκκινήστε τον license server. + Ένας βολικός τρόπος για να εκκινήσετε το `lmgrd` είναι το ακόλουθο script που βρίσκεται στο [.filename]#/usr/local/etc/rc.d/lmgrd.sh#: + [.programlisting] .... ----- snip ------------ #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX export PATH LICENSE_FILE=/usr/local/maple/license/license.dat LOG=/var/log/lmgrd.log case "$1" in start) lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2 echo -n " lmgrd" ;; stop) lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2 ;; *) echo "Usage: `basename $0` {start|stop}" 1>&2 exit 64 ;; esac exit 0 ----- snip ------------ .... . Δοκιμή του Maple(TM): + [source,shell] .... % cd /usr/local/maple/bin % ./xmaple .... + Σε αυτό το σημείο θα πρέπει να είναι όλα έτοιμα και να μην έχετε κανένα πρόβλημα. Μην ξεχάσετε όμως να στείλετε ένα e-mail στη Maplesoft και να τους πείτε ότι θέλετε μια έκδοση που να υποστηρίζεται επίσημα στο FreeBSD. === Συνηθισμένα Προβλήματα * Ίσως δυσκολευτείτε με την λειτουργία του FLEXlm license manager. Επιπλέον τεκμηρίωση μπορείτε να βρείτε στο http://www.globetrotter.com/[http://www.globetrotter.com/]. * Το `lmgrd` είναι γνωστό ότι θέλει το αρχείο της άδειας να έχει συγκεκριμένη μορφή αλλιώς η εκτέλεση του θα αποτύχει. Ένα σωστό αρχείο άδειας χρήσης πρέπει είναι σε γενικές γραμμές όπως το παρακάτω: + [.programlisting] .... # ======================================================= # License File for UNIX Installations ("Pointer File") # ======================================================= SERVER chillig ANY #USE_SERVER VENDOR maplelmg FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \ SN=XXXXXXXXX .... + [NOTE] ==== Ο σειριακός αριθμός και το κλειδί φαίνονται εδώ με 'X'. Το `chillig` είναι το όνομα του συστήματος. ==== + Μπορείτε να τροποποιήσετε το αρχείο της άδειας χρήσης, αρκεί να μην αλλάξετε την γραμμή "FEATURE" (η οποία προστατεύεται από το κλειδί της άδειας). [[linuxemu-matlab]] == Εγκαθιστώντας το MATLAB(R) Το κείμενο αυτό περιγράφει τη διαδικασία εγκατάστασης της Linux έκδοσης του MATLAB(R) 6.5 σε ένα σύστημα FreeBSD. Δουλεύει αρκετά καλά, με εξαίρεση το Java Virtual Machine(TM) (δείτε στο <>). Η Linux έκδοση του MATLAB(R) μπορεί να αγοραστεί απευθείας από την εταιρεία The MathWorks στο http://www.mathworks.com[http://www.mathworks.com]. Σιγουρευτείτε ότι πήρατε και το αρχείο που περιέχει την άδεια χρήσης ή οδηγίες για το πως να το δημιουργήσετε. Μια και θα επικοινωνήσετε με την εταιρεία, πείτε τους ότι θα θέλατε να υπάρχει επίσης υποστήριξη για το FreeBSD. === Εγκατάσταση του MATLAB(R) Για να εγκαταστήσετε το MATLAB(R), κάντε τα παρακάτω: [.procedure] . Εισάγετε το CD και προσαρτήστε το στο σύστημα σας. Συνδεθείτε ως χρήστης `root`, όπως συνιστά το script της εγκατάστασης. Για να ξεκινήσετε το script της εγκατάστασης δώστε την εντολή: + [source,shell] .... # /compat/linux/bin/sh /cdrom/install .... + [TIP] ==== Το πρόγραμμα της εγκατάστασης είναι σε γραφικό περιβάλλον. Αν λαμβάνετε σφάλματα σχετικά με την οθόνη, δώστε την εντολή: `setenv HOME ~USER`, όπου _USER_ είναι ο χρήστης από όπου δώσατε την εντολή man:su[1]. ==== . Όταν ερωτηθείτε για τον κατάλογο του MATLAB(R), δώστε: `/compat/linux/usr/local/matlab`. + [TIP] ==== Για ευκολότερη διαδικασία εγκατάστασης, ορίστε το παρακάτω: `set MATLAB=/compat/linux/usr/local/matlab` στη γραμμή εντολών του κελύφους σας. ==== . Τροποποιήσετε το αρχείο της άδειας (license file) σύμφωνα με τις οδηγίες που λάβατε με την άδεια του MATLAB(R). + [TIP] ==== Μπορείτε να ετοιμάσετε εκ των προτέρων το αρχείο αυτό και να το αντιγράψετε στο [.filename]#$MATLAB/license.dat#, πριν καν σας πει το πρόγραμμα εγκατάστασης να το τροποποιήσετε. ==== . Ολοκλήρωση της Εγκατάστασης Σε αυτό το σημείο, η εγκατάσταση του MATLAB(R) έχει ολοκληρωθεί. Τα επόμενα βήματα χρειάζονται για να μπορέσετε να το δουλέψετε σωστά με το FreeBSD. === Εκκίνηση του License Manager [.procedure] . Δημιουργία συμβολικών συνδέσμων για τα scripts του license manager: + [source,shell] .... # ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW # ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW .... . Δημιουργήστε το αρχείο εκκίνησης [.filename]#/usr/local/etc/rc.d/flexlm.sh#. Το παράδειγμα παρακάτω είναι μια τροποποιημένη έκδοση του [.filename]#$MATLAB/etc/rc.lm.glnx86#. Οι αλλαγές είναι στις τοποθεσίες των αρχείων, και στην εκκίνηση του license manager στο περιβάλλον εξομοίωσης Linux του FreeBSD . + [.programlisting] .... #!/bin/sh case "$1" in start) if [ -f /usr/local/etc/lmboot_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd' fi ;; stop) if [ -f /usr/local/etc/lmdown_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1 fi ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0 .... + [IMPORTANT] ==== Το αρχείο πρέπει να είναι εκτελέσιμο: [source,shell] .... # chmod +x /usr/local/etc/rc.d/flexlm.sh .... Πρέπει επίσης να αντικαταστήσετε το παραπάνω _username_ με ένα υπαρκτό όνομα χρήστη του συστήματος σας (και να μην είναι ο `root`). ==== . Εκκινήστε τον license manager με την εντολή: + [source,shell] .... # /usr/local/etc/rc.d/flexlm.sh start .... [[matlab-jre]] === Σύνδεση με το Περιβάλλον του Java(TM) Runtime Environment Αλλάξτε τον σύνδεσμο τουJava(TM) Runtime Environment (JRE) σε έναν ο οποίος θα δουλεύει στο FreeBSD: [source,shell] .... # cd $MATLAB/sys/java/jre/glnx86/ # unlink jre; ln -s ./jre1.1.8 ./jre .... === Δημιουργήστε το Script Εκκίνησης του MATLAB(R) [.procedure] . Τοποθετήστε το παρακάτω script στο [.filename]#/usr/local/bin/matlab#: + [.programlisting] .... #!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@" .... . Στη συνέχεια δώστε την εντολή `chmod +x /usr/local/bin/matlab`. [TIP] ==== Ανάλογα με την έκδοση του package:emulators/linux_base[], που έχετε, μπορεί να εμφανιστούν μερικά σφάλματα όταν τρέξετε το script. Για να το αποφύγετε αυτό, τροποποιήστε το αρχείο [.filename]#/compat/linux/usr/local/matlab/bin/matlab#, και αλλάξτε τη γραμμή που λέει: [.programlisting] .... if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then .... (στην έκδοση 13.0.1 βρίσκεται στη γραμμή 410) σε αυτή τη γραμμή: [.programlisting] .... if test -L $newbase; then .... ==== === Δημιουργία Script Τερματισμού του MATLAB(R) Τα επόμενα βήματα χρειάζονται για να λύσετε ένα πρόβλημα που υπάρχει με τον τερματισμό του MATLAB(R). [.procedure] . Δημιουργήστε το αρχείο [.filename]#$MATLAB/toolbox/local/finish.m#, και μέσα σε αυτό προσθέστε μόνο τη γραμμή: + [.programlisting] .... ! $MATLAB/bin/finish.sh .... + [NOTE] ==== To `$MATLAB` γράψτε το ακριβώς όπως το βλέπετε. ==== + [TIP] ==== Στον ίδιο κατάλογο, θα βρείτε τα αρχεία [.filename]#finishsav.m# και [.filename]#finishdlg.m#, τα οποία θα σας δίνουν τη δυνατότητα να σώζετε την εργασία σας πριν κλείσετε το πρόγραμμα. Αν πρόκειται να χρησιμοποιήσετε κάποιο από αυτά, προσθέστε του την παραπάνω γραμμή αμέσως μετά την εντολή `save` . ==== . Δημιουργήστε το αρχείο [.filename]#$MATLAB/bin/finish.sh#, το οποίο θα περιέχει τα παρακάτω: + [.programlisting] .... #!/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0 .... . Κάντε το αρχείο εκτελέσιμο: + [source,shell] .... # chmod +x $MATLAB/bin/finish.sh .... [[matlab-using]] === Χρησιμοποιώντας το MATLAB(R) Σε αυτό το σημείο θα πρέπει να είστε έτοιμοι να δώσετε την εντολή `matlab` και να αρχίσετε να χρησιμοποιείτε την εφαρμογή. [[linuxemu-oracle]] == Εγκατάσταση της Oracle(R) === Εισαγωγή Το κείμενο αυτό περιγράφει τη διαδικασία εγκατάστασης των Oracle(R) 8.0.5 και Oracle(R) 8.0.5.1 Enterprise Edition για Linux σε ένα σύστημα FreeBSD. === Εγκατάσταση του Περιβάλλοντος Linux Σιγουρευτείτε ότι έχετε εγκαταστήσει τα package:emulators/linux_base[] και package:devel/linux_devtools[] από τη συλλογή των Ports. Αν αντιμετωπίζετε δυσκολίες με τα παραπάνω, ίσως χρειαστεί να τα εγκαταστήσετε από πακέτα ή από παλιότερες εκδόσεις της συλλογής των Ports. Αν θέλετε να τρέξετε τον intelligent agent, θα χρειαστεί να εγκαταστήσετε και το πακέτο Red Hat Tcl: [.filename]#tcl-8.0.3-20.i386.rpm#. Η εντολή για την εγκατάσταση μέσω του επίσημου RPM port (package:archivers/rpm[]) είναι: [source,shell] .... # rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package .... Η εγκατάσταση του _package_ θα πρέπει να γίνει ομαλά και χωρίς προβλήματα. === Ρυθμίζοντας το Περιβάλλον για την Oracle(R) Πριν την εγκατάσταση της Oracle(R), θα πρέπει να ρυθμίσετε σωστά το περιβάλλον του συστήματός σας. Το παρακάτω κείμενο περιγράφει τι _ακριβώς_ πρέπει να κάνετε για να εκτελέσετε την Oracle(R) για Linux στο FreeBSD, και δεν περιγράφει ότι υπάρχει ήδη στον οδηγό εγκατάστασης της Oracle(R). [[linuxemu-kernel-tuning]] ==== Ρύθμιση του Πυρήνα Όπως περιγράφει ο οδηγός εγκατάστασης της Oracle(R), θα πρέπει να ορίσετε τις τιμές της shared memory στο μέγιστο. Μην χρησιμοποιήσετε το `SHMMAX` στο FreeBSD. Το `SHMMAX` υπολογίζεται απλώς από το `SHMMAXPGS` και το `PGSIZE`. Επομένως καθορίστε το `SHMMAXPGS`. Όλες οι άλλες επιλογές μπορούν να οριστούν όπως περιγράφεται στον οδηγό. Για παράδειγμα: [.programlisting] .... options SHMMAXPGS=10000 options SHMMNI=100 options SHMSEG=10 options SEMMNS=200 options SEMMNI=70 options SEMMSL=61 .... Ορίστε τις τιμές των επιλογών έτσι ώστε να ταιριάζουν στη χρήση της Oracle(R) που θέλετε να κάνετε. Επίσης, επιβεβαιώστε ότι έχετε ενεργοποιήσει τις παρακάτω επιλογές στις ρυθμίσεις του πυρήνα: [.programlisting] .... options SYSVSHM #SysV shared memory options SYSVSEM #SysV semaphores options SYSVMSG #SysV interprocess communication .... [[linuxemu-oracle-account]] ==== Ο Χρήστης Oracle(R) Δημιουργήστε ένα χρήστη συστήματος με όνομα `oracle`, με τον ίδιο τρόπο που θα δημιουργούσατε και οποιονδήποτε άλλον χρήστη. Το μόνο ιδιαίτερο χαρακτηριστικό του χρήστη `oracle` είναι ότι χρειάζεται να του δώσετε ένα κέλυφος Linux. Προσθέστε το `/compat/linux/bin/bash` στο [.filename]#/etc/shells# και ορίστε το κέλυφος του χρήστη `oracle` σε [.filename]#/compat/linux/bin/bash#. [[linuxemu-environment]] ==== Το Περιβάλλον Εκτός των συνηθισμένων μεταβλητών της Oracle(R), όπως οι `ORACLE_HOME` και `ORACLE_SID` θα πρέπει να ορίσετε και τις ακόλουθες μεταβλητές περιβάλλοντος: [.informaltable] [cols="1,1", frame="none", options="header"] |=== | Μεταβλητή | Τιμή |`LD_LIBRARY_PATH` |`$ORACLE_HOME/lib` |`CLASSPATH` |`$ORACLE_HOME/jdbc/lib/classes111.zip` |`PATH` |`/compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin` |=== Σας συνιστούμε να ορίσετε όλες τις μεταβλητές περιβάλλοντος στο αρχείο [.filename]#.profile#. Ένα ολοκληρωμένο παράδειγμα είναι το παρακάτω: [.programlisting] .... ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH ORACLE_SID=ORCL; export ORACLE_SID ORACLE_TERM=386x; export ORACLE_TERM CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip export CLASSPATH PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin export PATH .... === Εγκατάσταση της Oracle(R) Λόγω μια μικρής έλλειψης στον εξομοιωτή του Linux, θα χρειαστεί να δημιουργήσετε έναν κατάλογο με το όνομα [.filename]#.oracle# μέσα στο [.filename]#/var/tmp#, πριν ξεκινήσετε το πρόγραμμα εγκατάστασης. Ο κατάλογος αυτός θα πρέπει να ανήκει στον χρήστη `oracle`. Θα πρέπει τώρα να πραγματοποιήσετε την εγκατάσταση της Oracle(R) δίχως κανένα πρόβλημα. Αν αντιμετωπίζετε όμως ακόμη προβλήματα, ελέγξτε την έκδοση της Oracle(R) που έχετε ή/και τις ρυθμίσεις σας! Αφότου έχετε πραγματοποιήσει την εγκατάσταση της Oracle(R), εφαρμόστε τα patches που περιγράφονται στις δύο παρακάτω ενότητες. Ένα συχνό πρόβλημα είναι ότι δεν γίνεται σωστή εγκατάσταση του προσαρμογέα του πρωτοκόλλου TCP. Αυτό έχει ως αποτέλεσμα να μην μπορείτε να ξεκινήσετε τους TCP listeners. Οι ακόλουθες οδηγίες θα σας βοηθήσουν να λύσετε αυτό το πρόβλημα.: [source,shell] .... # cd $ORACLE_HOME/network/lib # make -f ins_network.mk ntcontab.o # cd $ORACLE_HOME/lib # ar r libnetwork.a ntcontab.o # cd $ORACLE_HOME/network/lib # make -f ins_network.mk install .... Μη ξεχάσετε να τρέξετε ξανά το [.filename]#root.sh# [[linuxemu-patch-root]] ==== Διόρθωση του root.sh Όταν εγκαθιστάτε την Oracle(R), κάποιες ενέργειες, οι οποίες χρειάζονται να γίνουν ως `root`, καταγράφονται σε ένα shell script που λέγεται [.filename]#root.sh#. Το script αυτό δημιουργείται στον κατάλογο [.filename]#orainst#. Εφαρμόστε το παρακάτω patch στο [.filename]#root.sh#, για να μπορέσει να βρει και να χρησιμοποιήσει το `chown`. Εναλλακτικά, τρέξτε το script μέσα από ένα κέλυφος Linux. [.programlisting] .... *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/bin/chown # # Define variables to be used in this script --- 31,37 ---- # This is the default value for CHOWN # It will redefined later in this script for those ports # which have it conditionally defined in ss_install.h ! CHOWN=/usr/sbin/chown # # Define variables to be used in this script .... Όταν δεν κάνετε χρήση του CD για την εγκατάσταση, μπορείτε να περάσετε το patch για το [.filename]#root.sh#, στην πηγή εγκατάστασης. To αρχείο ονομάζεται [.filename]#rthd.sh# και βρίσκεται στον κατάλογο [.filename]#orainst#. [[linuxemu-patch-tcl]] ==== Διόρθωση του genclntsh To script `genclntsh` χρησιμοποιείται για να δημιουργήσει μια shared client library. Τρέξτε το παρακάτω patch για να σβήσετε το καθορισμένο `PATH`: [.programlisting] .... *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998 *************** *** 32,38 **** # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst --- 32,38 ---- # # Explicit path to ensure that we're using the correct commands #PATH=/usr/bin:/usr/ccs/bin export PATH ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst .... === Εκτέλεση της Oracle(R) Αφού έχετε ακολουθήσει αυτές τις οδηγίες, θα πρέπει να μπορείτε να εκτελέσετε την Oracle(R) σαν να βρισκόσασταν σε ένα σύστημα Linux. [[linuxemu-advanced]] == Προχωρημένα Θέματα Αν έχετε την απορία πως λειτουργεί η συμβατότητα με εφαρμογές Linux, τότε θα πρέπει να διαβάσετε τη παρακάτω ενότητα. Τα περισσότερα από όσα έχουν γραφτεί είναι βασισμένα στην {freebsd-chat} και έχουν γραφτεί από τον Terry Lambert mailto:tlambert@primenet.com[tlambert@primenet.com] (Message ID: `<199906020108.SAA07001@usr09.primenet.com>`). === Πως Λειτουργεί; Το FreeBSD περιέχει ένα επίπεδο αφαίρεσης (abstraction) που ονομάζεται "execution class loader". Αυτό βασίζεται στο man:execve[2]. Αυτό που συμβαίνει είναι ότι το FreeBSD έχει μια λίστα φορτωτών (loaders), αντί για ένα που να καταφεύγει σε περίπτωση αποτυχίας στο `#!` για να τρέξει κάποιο shell interpreter ή shell script. Ιστορικά, ο μόνος φορτωτής στη πλατφόρμα του UNIX(R) έλεγχε τον μαγικό αριθμό (γενικά τα πρώτα 4 ή 8 bytes του αρχείου) για να δει αν είναι κάποιο εκτελέσιμο / εφαρμογή γνωστό στο σύστημα, και στην περίπτωση αυτή να καλέσει τον αντίστοιχο φορτωτή. Αν το αρχείο δεν ήταν εκτελέσιμο με βάση τον τύπο του συστήματος, η κλήση στο man:execve[2] επέστρεφε κάποιο σφάλμα, και το shell προσπαθούσε να εκτελέσει το αρχείο σαν shell script. Η γενική ιδέα ήταν "αν δεν είναι εκτελέσιμο, προσπάθησε να το τρέξεις ως shell script με βάση το τρέχον shell ". Αργότερα, βρέθηκε ένας έξυπνος τρόπος ώστε το man:sh[1] να ελέγχει τους πρώτους δύο χαρακτήρες, και αν ήταν `:\n`, τότε καλούσε το shell man:csh[1] (πιστεύουμε πως η λύση αυτή βρέθηκε αρχικά από τη SCO). Αυτό που κάνει τώρα το FreeBSD είναι να διατρέχει τη λίστα με όλους τους φορτωτές, με ένα γενικό φορτωτή `#!` ο οποίος αναγνωρίζει ως διερμηνέα (interpreter) τους χαρακτήρες από το επόμενο κενό μετά το `!` και μέχρι το τέλος, ενώ αν δεν αναγνωριστεί κάποιος, χρησιμοποιείται ως έσχατη λύση το [.filename]##/bin/sh##. Για την υποστήριξη του Linux ABI, το FreeBSD βλέπει τον μαγικό αριθμό του ELF binary (δε αναγνωρίζει τη διαφορά ανάμεσα σε FreeBSD, Solaris(TM), Linux, ή κάποιο άλλο λειτουργικό σύστημα το οποίο χρησιμοποιεί αρχεία τύπου ELF). Ο φορτωτής ELF κοιτάει για ένα ειδικό _brand_, το οποίο είναι μια ενότητα σχολίων μέσα στο ELF image, και το οποίο δεν υπάρχει σε ELF binaries για SVR4/Solaris(TM) Για να λειτουργήσουν τα εκτελέσιμα του Linux, θα πρέπει να γίνουν _branded_ (μαρκαριστούν) ως `Linux` μέσω της man:brandelf[1]: [source,shell] .... # brandelf -t Linux file .... Όταν γίνει αυτό, ο φορτωτής ELF θα βλέπει το `Linux` brand πάνω στο αρχείο. Όταν ο φορτωτής ELF δει το `Linux` brand, θα αντικαταστήσει έναν δείκτη μέσα στη δομή `proc`. Όλες οι κλήσεις του συστήματος ταξινομούνται μέσα από αυτόν τον δείκτη (σε ένα παραδοσιακό σύστημα UNIX(R), ο δείκτης θα ήταν ο πίνακας `sysent[]`, που περιέχει τις κλήσεις του συστήματος (system calls)). Επιπλέον, η διεργασία σημειώνεται για ειδική μεταχείριση του trap vector και άλλες (μικρές) διορθώσεις, τις οποίες χειρίζεται το άρθρωμα πυρήνα της συμβατότητας Linux. Το system call vector του Linux περιέχει, μεταξύ άλλων, μια λίστα με τα δεδομένα του `sysent[]` των οποίων οι διευθύνσεις βρίσκονται μέσα στο άρθρωμα του πυρήνα. Όταν γίνεται μια κλήση συστήματος από μια εφαρμογή Linux, ο κώδικας (trap code) τροποποιεί τον δείκτη της μέσω της δομής που έχει εγγραφεί στο `proc`, και αλλάζει την διεύθυνση ώστε να δείχνει στο σημείο εισόδου της συνάρτησης του Linux, και όχι του FreeBSD. Επίσης, το σύστημα συμβατότητας με Linux μπορεί και προσαρμόζει δυναμικά τις τοποθεσίες αναζήτησης. Ουσιαστικά αυτό κάνει και η επιλογή `union` κατά την προσάρτηση ενός συστήματος αρχείων (_δεν_ εννοούμε εδώ το σύστημα αρχείων `unionfs`!). Αρχικά, γίνεται απόπειρα να βρεθεί το αρχείο στον κατάλογο [.filename]#/compat/linux/original-path#, _και μόνο_ αν αυτό αποτύχει, θα γίνει αναζήτηση στον κατάλογο [.filename]#/original-path#. Με τον τρόπο αυτό σιγουρεύουμε ότι τα εκτελέσιμα που χρειάζονται άλλα εκτελέσιμα θα τρέξουν (για παράδειγμα, το σύνολο εργαλείων του Linux μπορεί να εκτελεστεί μέσω της υποστήριξης του Linux ABI). Επίσης σημαίνει ότι τα εκτελέσιμα του Linux μπορούν να φορτώσουν και να εκτελέσουν αρχεία του FreeBSD αν δεν μπορούν να εντοπίσουν τα αντίστοιχα αρχεία στο Linux. Μπορείτε επίσης να τοποθετήσετε μια εντολή man:uname[1] μέσα στο [.filename]#/compat/linux# προκειμένου τα αρχεία του Linux να μη μπορούν να αναγνωρίσουν ότι δεν χρησιμοποιούνται πραγματικά σε Linux. Ουσιαστικά, υπάρχει ένας πυρήνας Linux μέσα στον πυρήνα του FreeBSD. Οι διάφορες λειτουργίες οι οποίες υλοποιούν όλες τις υπηρεσίες που παρέχονται από τον πυρήνα είναι ίδιες τόσο στον πίνακα κλήσεων συστήματος του FreeBSD όσο και στον αντίστοιχο του Linux: λειτουργίες του συστήματος αρχείων, εικονική μνήμη, διαχείριση σημάτων, System V IPC κλπ. Η μόνη διαφορά είναι ότι το εκτελέσιμα του FreeBSD κάνουν χρήση των συναρτήσεων _glue_ του FreeBSD, ενώ τα εκτελέσιμα του Linux, κάνουν χρήση των συναρτήσεων _glue_ του Linux (πολλά από τα παλιά λειτουργικά είχαν τις δικές τους συναρτήσεις _glue_: οι διευθύνσεις των συναρτήσεων βρίσκονταν στο στατικό πίνακα `sysent[]`, αντί να διευκρινίζονται μέσω ενός δυναμικού δείκτη στη δομή `proc` της διεργασίας που πραγματοποιεί την κλήση). Ποιο είναι όμως το εγγενές FreeBSD ABI; Δεν έχει και πολύ σημασία. Η μόνη βασική διαφορά είναι (κάτι το οποίο μπορεί εύκολα να αλλάξει σε μελλοντικές εκδόσεις, και πολύ πιθανόν να αλλάξει) ότι οι συναρτήσεις _glue_ του FreeBSD είναι στατικά συνδεδεμένες στο πυρήνα, ενώ οι αντίστοιχες του Linux μπορούν είτε να είναι συνδεδεμένες στατικά, είτε να είναι προσβάσιμες μέσω ενός αρθρώματος πυρήνα. Είναι αυτό όμως πραγματική εξομοίωση; Όχι. Είναι μια υλοποίηση του ABI, όχι εξομοίωση. Δεν υπάρχει καμία εξομοίωση (ή προσομοίωση, για να προλάβουμε την επόμενη σας ερώτηση). Τότε γιατί μερικές φορές μιλάμε για "εξομοίωση Linux"; Για να δυσκολευτεί η προώθηση του FreeBSD! Η αρχική υλοποίηση έγινε την εποχή όπου δεν υπήρχε άλλη λέξη που να μπορούσε να περιγράψει το τι ακριβώς γινόταν. Το να λέγαμε ότι το FreeBSD έτρεχε εκτελέσιμα Linux δεν θα ήταν αλήθεια, μια και χρειαζόταν να ενσωματωθεί κάποιος κώδικας στον πυρήνα, ή να φορτωθεί κάποιο άρθρωμα. Χρειαζόταν κάποια λέξη που να περιγράφει τι φορτωνόταν-έτσι προέκυψε ο "εξομοιωτής Linux".