Δημιουργία του δικού σας πυρήνα Linux

Μερικές φορές μπορεί να χρειαστεί να φτιάξετε το δικό σας Πυρήνας Linux. Οι λόγοι για αυτό μπορεί να είναι οι εξής:

  • Χρειάζεστε έναν καθαρό πυρήνα, χωρίς ενημερώσεις κώδικα διανομής.
  • θέλετε να εφαρμόσετε τα δικά σας patches (από τα οποία υπάρχουν πολλά).
  • θέλετε να συναρμολογήσετε έναν πυρήνα για να ταιριάζει στη διαμόρφωση του υλικού σας, να πετάξετε περιττά πράγματα από αυτόν ή/και να τον προσαρμόσετε για συγκεκριμένες εργασίες.
  • θέλετε να συμπεριλάβετε ένα πειραματικό πρόγραμμα οδήγησης ή σύστημα αρχείων στον πυρήνα που δεν περιλαμβάνεται "βανίλια"πυρήνα (για παράδειγμα ZFSή Raiser 4);
Δεν υπάρχει τίποτα περίπλοκο στη συναρμολόγηση του πυρήνα. Είναι σημαντικό μόνο να καταλάβετε γιατί γίνεται αυτό και επίσης να μην αγγίξετε εκείνες τις παραμέτρους που δεν καταλαβαίνετε. Σε αυτό το σημείωμα θα περιγράψω δύο παραδείγματα κατασκευής πυρήνα σε Βασισμένο στο Debianδιανομές. Στο πρώτο παράδειγμα, θα δείξω πόσο εύκολο είναι να συναρμολογήσετε έναν καθαρό, αποκαλούμενο πυρήνα «βανίλιας» (όπως κυκλοφορεί από Linus Torvalds ), και στο δεύτερο - πώς να εφαρμόσετε τις δικές σας ενημερώσεις κώδικα και να βελτιστοποιήσετε τον πυρήνα. Θα γράψω αμέσως δύο προειδοποιήσεις:
  • θα πρέπει να ξαναφτιάχνετε τον πυρήνα κάθε φορά που ενημερώνεται (κατεβάστε το "update patch", εφαρμόστε το και συναρμολογήστε τον πυρήνα).
  • ο ανακατασκευασμένος πυρήνας ενδέχεται να μην λειτουργεί εάν το σύστημά σας χρησιμοποιεί ορισμένες εισβολές για να διασφαλίσει τη λειτουργικότητα αυτού ή του άλλου εξοπλισμού.
  • Εάν ο πυρήνας έχει ρυθμιστεί εσφαλμένα, ειδικά στην περίπτωση αγράμματης ή αλόγιστης εφαρμογής patches, μπορείτε είτε να καταλήξετε με ένα σύστημα που είναι τρομερά αργό είτε να το χάσετε εντελώς.
ΟΛΕΣ ΟΙ ΕΝΕΡΓΕΙΕΣ ΠΟΥ ΚΑΝΕΤΕ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ!

Απλή συναρμολόγηση πυρήνα χωρίς μπαλώματα.

Ο πηγαίος κώδικας του πυρήνα Linux είναι διαθέσιμος στο kernel.org. Υπάρχουν επίσης "ενημέρωση ενημερώσεων κώδικα". Τι χρειαζόμαστε? Λήψη από τον ιστότοπο tarball(αρχειοθέτηση) με την πιο πρόσφατη σταθερή έκδοση του πυρήνα (τη στιγμή της σύνταξης, αυτή είναι η έκδοση 4.3 ). Λήψη με οποιονδήποτε βολικό τρόπο. Στη συνέχεια χρειαζόμαστε εργαλεία για τη συναρμολόγηση:

sudo apt install build-essential gcc kernel-package patch
sudo apt-get build-dep linux

Αφού εγκατασταθούν όλα απαραίτητα εργαλεία, αποσυσκευάστε το αρχείο με τον κώδικα του πυρήνα σε οποιονδήποτε βολικό κατάλογο. Ας είναι /home/user/KERNEL, Οπου "χρήστης"- όνομα χρήστη συστήματος. Στη συνέχεια, ανοίξτε ένα τερματικό και πηγαίνετε εκεί:

cd /home/user/KERNEL

Το μόνο που μένει είναι να συναρμολογήσουμε τον πυρήνα:

fakeroot make-kpkg -j 3 --initrd --append-to-version=-custom kernel_image kernel_headers #-j 3

Νούμερο 3 μετά ι- αυτός είναι ο αριθμός των πυρήνων του επεξεργαστή σας + 1. Δηλαδή, για επεξεργαστή διπλού πυρήνα είναι 3, για επεξεργαστή 4 πυρήνων είναι 5 και ούτω καθεξής.
-έθιμο- εδώ μπορείτε να καθορίσετε ένα βολικό όνομα για τον πυρήνα για να διευκολύνετε τη διάκρισή του από το όνομα διανομής.
kernel_imageΚαι kernel_headers- αυτός είναι ο ίδιος ο πυρήνας και τα αρχεία κεφαλίδας του, αντίστοιχα. Κεφαλίδεςαπαραίτητο για τη συναρμολόγηση προγραμμάτων οδήγησης και μονάδων πυρήνα, καθώς και για ορισμένους άλλους σκοπούς. Μετά την εκτέλεση αυτής της εντολής, θα αρχίσουν να εμφανίζονται πολλές ερωτήσεις διαμόρφωσης πυρήνα. Επειδή αφήνουμε τα πάντα ως προεπιλογή, απλώς πατήστε Enter μέχρι να ξεκινήσει η κατασκευή. Ανάλογα με την ισχύ του υπολογιστή σας, η συναρμολόγηση μπορεί να διαρκέσει από 15-20 λεπτά έως αρκετές ώρες. Μετά τη συναρμολόγηση, στον κατάλογο /home/χρήστηςθα εμφανιστούν δύο deb πακέτο: πυρήνας και κεφαλίδες. Εγκαταστήστε τα με την εντολή:

sudo dpkg -i linux-image-4.3*deb linux-headers-4.3*deb
sudo update-grub

Και επανεκκίνηση. Στο μενού GRUB μπορείτε τώρα να επιλέξετε έναν διαφορετικό πυρήνα για την εκκίνηση του συστήματος.

Κατασκευή του πυρήνα χρησιμοποιώντας patches και πρόσθετες ρυθμίσεις.

Αυτή τη φορά θα δημιουργήσουμε έναν βελτιστοποιημένο πυρήνα για εργασία με ήχο και βίντεο, καθώς και για μεγαλύτερη ανταπόκριση του συστήματος. Για να γίνει αυτό, θα εφαρμόσουμε δύο ενημερώσεις κώδικα: το λεγόμενο patch σε πραγματικό χρόνο ( PREEMPT RT) και μια ενημερωμένη έκδοση κώδικα για τον μεταγλωττιστή GCCγια να προσθέσετε πρόσθετες επιλογές για βελτιστοποιήσεις επεξεργαστή. Καταρχάς, τι είναι το patch; Patch είναι αρχείο κειμένου, το οποίο δημιουργείται από το πρόγραμμα διαφ, που περιέχει αλλαγές κώδικα σε ορισμένα μέρη, τα οποία, κατά την εφαρμογή της ενημέρωσης κώδικα, εισάγονται στα σωστά σημεία. Επειδή RT patchβγαίνει με μεγάλη καθυστέρηση, η τελευταία του έκδοση είναι για πυρήνας 4.1. Ωστόσο, αυτό δεν είναι τόσο σημαντικό. Χρησιμοποιώντας το ίδιο σχήμα, κατεβάστε τον πυρήνα 4.1 από το kernel.org και αποσυσκευάστε τον σε έναν κατάλογο /home/user/KERNEL-CUSTOM. Τώρα κατεβάστε τα patches. PREEMPT_RT και ενημερωμένη έκδοση κώδικα GCC. Από τα ληφθέντα αρχεία, χρειαζόμαστε αρχεία με επέκταση .patch, τα οποία πρέπει να τοποθετηθούν στον κατάλογο με τον πηγαίο κώδικα του πυρήνα. Δηλαδή μέσα /home/user/KERNEL-CUSTOM. Πριν εφαρμόσετε ενημερώσεις κώδικα, πρέπει να βεβαιωθείτε ότι δεν υπάρχουν σφάλματα. Ανοίξτε το τερματικό:

cd /home/user/KERNEL-CUSTOM
patch -p1 -i patch-4.1.13-rt15.patch --dry-run


Επιλογή --στεγνό τρέξιμοσας επιτρέπει να προσομοιώσετε την εφαρμογή μιας ενημέρωσης κώδικα χωρίς να κάνετε αλλαγές σε αρχεία. Εάν δεν εντοπιστούν σφάλματα (δείτε στιγμιότυπο οθόνης) - αποδεχτείτε την ενημερωμένη έκδοση κώδικα χωρίς την επιλογή --στεγνό τρέξιμο. Εκτελέστε παρόμοιες ενέργειες με το δεύτερο έμπλαστρο. Μην εφαρμόζετε περισσότερα από ένα έμπλαστρα τη φορά!Τώρα πρέπει να ρυθμίσουμε τον πυρήνα μας. Έχουμε τις ακόλουθες επιλογές για να διαλέξετε:

κάντε διαμόρφωση- ερωτήσεις σχετικά με τη διαμόρφωση ενός ή άλλου υποσυστήματος πυρήνα θα εμφανίζονται στο τερματικό μία προς μία. Μια εξαιρετικά μακρά και κουραστική διαδικασία. Ας το ξεχάσουμε :)
κάντε oldconfig- θα χρησιμοποιηθεί η διαμόρφωση του τρέχοντος πυρήνα. Εφόσον συναρμολογούμε το δικό μας από την αρχή, αυτή η μέθοδος είναι επίσης άχρηστη.
κάντε defconfig- παρόμοια με την προηγούμενη, μόνο οι τιμές θα είναι από προεπιλογή. Ο τρόπος που το έθεσαν οι προγραμματιστές του πυρήνα. Παρόμοια με την πρώτη μέθοδο συναρμολόγησης.
κάντε το menuconfig- ψευδογραφική διεπαφή βασισμένη στη βιβλιοθήκη Nurses. Στην οθόνη θα εμφανιστεί μια διεπαφή με ένα βολικό ιεραρχικό μενού. Ελέγχει χρησιμοποιώντας την κατεύθυνση, το διάστημα και Πλήκτρα TAB. Συνιστάται εάν χτίζετε τον πυρήνα σε ένα σύστημα που δεν έχει γραφικό κέλυφος.
κάντε το gconfig GTK, συνιστάται στα GNOME, Mate, Xfce, Cinnamon, Unity και άλλα που χρησιμοποιούν GTK.
κάντε xconfig- Βασισμένο σε GUI Qt. Συνιστάται στο KDE. Εφόσον το σύστημά μου χρησιμοποιεί KDE, θα χρησιμοποιήσω αυτήν τη μέθοδο. Εκτός από αυτό, υπάρχουν μερικές ακόμη μέθοδοι, αλλά η εφαρμογή τους δεν διαφέρει. Έτσι, αφού εφαρμόσουμε τα patches, ξεκινάμε κάντε xconfigκαι αυτό είναι που εμφανίζεται μπροστά μας:


Πρώτα απ 'όλα, απενεργοποιήστε dynticks. Για να το κάνουμε αυτό πηγαίνουμε στο Υποσύστημα Timersκαι επιλέξτε Περιοδικοί χρονοδιακόπτες


Τώρα το καλύτερο μέρος. Ας πάμε στο Τύπος και χαρακτηριστικά επεξεργαστή, ψάχνει για ένα αντικείμενο Οικογένεια επεξεργαστώνκαι υποδείξτε τη σειρά του επεξεργαστή σας. Για παράδειγμα, αν έχετε Intel Core i5-4xxx, υποδεικνύω Χάσγουελ(επεξεργαστής 4ης γενιάς). Εάν δεν είστε σίγουροι ακριβώς, μπορείτε να επιλέξετε το στοιχείο Εγγενείς βελτιστοποιήσεις που ανιχνεύονται αυτόματα από το GCC. Σε αυτήν την περίπτωση, κατά τη συναρμολόγηση, ο ίδιος ο μεταγλωττιστής θα καθορίσει τι υποστηρίζει ο επεξεργαστής σας και θα περιλαμβάνει όλες τις δυνατότητες του.


Πηγαίνετε παρακάτω και ενεργοποιήστε την παράμετρο Πλήρης προκαταρκτικός πυρήνας (RT). Λειτουργία σκληρού σε πραγματικό χρόνο.


Κάντε κύλιση παρακάτω και στην παράγραφο Συχνότητα χρονοδιακόπτηρυθμίστε τη συχνότητα διακοπής του συστήματος σε 1000 Hz


Απενεργοποιούμε εντελώς οποιαδήποτε εξοικονόμηση ενέργειας. Είναι σημαντικό! Στα αριστερά ψάχνουμε για ένα αντικείμενο Διαχείριση ενέργειας και επιλογές ACPIκαι καταργήστε την επιλογή ACPI. Απενεργοποιήστε επίσης την εξοικονόμηση ενέργειας CPU

Αυτό είναι όλο. Εάν επιθυμείτε (και μελετήστε προσεκτικά την τεκμηρίωση), μπορείτε να εισέλθετε πρόσθετες αλλαγέςστη διαμόρφωση (απενεργοποίηση επιπλέον οδηγούς, χρησιμοποιήστε πρόσθετα υποσυστήματα και ούτω καθεξής). Τώρα αποθηκεύουμε τις ρυθμίσεις μέσω Αρχείο - Αποθήκευση, κλείστε τον διαμορφωτή και συναρμολογήστε τον πυρήνα:

fakeroot make-kpkg -j 3 --initrd --append-to-version=-rt-custom kernel_image kernel_headers #-j 3
sudo update-grub

Στον υπολογιστή μου με επεξεργαστή Intel Core i3-550 (3,2 GHz), η αύξηση της απόδοσης ήταν αρκετά αισθητή. Αλλά το πιο σημαντικό πράγμα είναι όταν εργάζεστε μέσα LMMSΚαι Kdenlive, περιοδικός τραυλισμός, αποσυγχρονισμός κομματιών ήχου και βίντεο, καθώς και πάγωμα όταν Βαρύ φορτίοστον σκληρό δίσκο. Συμπέρασμα - λειτουργεί! Τέλος, θα περιγράψω δύο τροποποιημένους πυρήνες, οι οποίοι είναι πολύ δημοφιλείς στους κύκλους του Linux:

PF-πυρήνας- το πιο δημοφιλές σετ μπαλωμάτων από τον Ουκρανό Alexander Natalenko (γνωστός και ως post-factum). Αυτό είναι ένα σύνολο ενημερώσεων κώδικα που δεν περιλαμβάνονται στον κύριο πυρήνα, αλλά παρέχουν αυξημένη απόκριση του συστήματος, παρέχουν ένα εναλλακτικό υποσύστημα αδρανοποίησης που είναι ταχύτερο από το κύριο και επίσης μειώνουν τη χρήση μνήμης χρησιμοποιώντας μια τεχνική συγκέντρωσης πανομοιότυπες σελίδες. Το σετ περιλαμβάνει:

  • Προγραμματιστής διεργασιών BFS από τον Con Kolivas με πρόσθετες διορθώσειςαπό τον Alfred Chen?
  • Προγραμματιστής εισόδου/εξόδου BFQ από τους Paolo Valente, Arianna Avanzini και Mauro Marinoni.
  • υποσύστημα αδρανοποίησης TuxOnIce από τον Nigel Cunningham.
  • εφαρμογή της τεχνικής για τη συγχώνευση πανομοιότυπων σελίδων στη μνήμη UKSM από το Nai Xia.
  • patch από το Graysky, επεκτείνοντας τη λίστα των επεξεργαστών για βελτιστοποίηση πυρήνα από τον μεταγλωττιστή (αυτόν που εφαρμόσαμε παραπάνω)
Τροποποιημένο αποθετήριο πυρήνα. Επίσημη ιστοσελίδα .

Zen-πυρήνας- το δεύτερο πιο δημοφιλές σετ, αλλά το πρώτο όσον αφορά τον αριθμό των μπαλωμάτων. Ο πυρήνας Zen χρησιμοποιεί έναν συνδυασμό πολλών έργων, ενημερώνει τον κώδικα μέσω ενός αποθετηρίου git και έχει επίσης πολλά πράγματα ειδικά για το Zen που στοχεύουν στην κάλυψη των περισσότερων αναγκών των χρηστών σε έναν ενιαίο πυρήνα. Ορισμένα χαρακτηριστικά της ενημέρωσης κώδικα: drm-next, ασύρματη δοκιμή, επιλογή προγραμματιστών CPU (CFS/BFS), προγραμματιστής εισόδου/εξόδου BFQ, aufs, unionfs, reiser4, tuxonice, PHC και πολλά άλλα πράγματα που είναι εξαιρετικά για τη βελτιστοποίηση συστημάτων επιτραπέζιων υπολογιστών ή φορητούς υπολογιστές. Όλα αυτά είναι διαθέσιμα με τη μορφή ενός εμπλάστρου στον πυρήνα της βανίλιας. Επίσημη ιστοσελίδα . Αποθετήριο GIT. Πακέτα για Debian/Ubuntu.

Αυτό μάλλον είναι όλο για σήμερα. Περισσότερες πληροφορίες μπορείτε να βρείτε στους συνδέσμους του άρθρου. Όλα όσα περιγράφονται στο άρθρο έχουν δοκιμαστεί από εμένα σε πολλές διαμορφώσεις.

Σε μια μεγάλη οικογένεια λειτουργικών συστημάτων που βασίζονται σε GNU/Linux. Σίγουρα έχετε ακούσει ότι αυτοί οι κωδικοί είναι ανοιχτοί, διανέμονται ελεύθερα και δωρεάν. Λένε, πάρε όποιον θέλεις, αλλά συμμορφωθείς μόνο με τους όρους της άδειας GPL, κάτι που δεν είναι καθόλου δύσκολο. Ωστόσο, λίγοι άνθρωποι εξηγούν αρκετά ξεκάθαρα ποια είναι η ουσία αυτού του φαινομένου, ποιο είναι το νόημά του. Επομένως, θα επιχειρήσουμε μια τέτοια εξήγηση.

Η ουσία εν συντομία

Όλα ξεκίνησαν το 1991, όταν ο Φινλανδός φοιτητής Linus Torvalds έκανε διαθέσιμους στο κοινό τους κωδικούς πυρήνα του νέου λειτουργικού συστήματος Linux. Γιατί στα ανοιχτά; Γιατί στήριξε. Αλλά μάλλον το γνωρίζετε ήδη αυτό (ή το ανακαλύπτετε εύκολα). Θα δώσουμε προσοχή σε σημεία που απαιτούν σαφή ταξινόμηση.

Linux

Το Linux δεν είναι λειτουργικό σύστημα, αλλά μόνο ο πυρήνας. Ένα σύνολο λύσεων λογισμικού απαραίτητες για την εκκίνηση ενός υπολογιστή και τη λειτουργία των στοιχείων του («υλισμικό»), τη βάση για τη λειτουργία άλλων προγραμμάτων.

ΑΝΤΙΛΟΠΗΣ ΤΗΣ ΑΦΡΙΚΗΣ

Το GNU είναι ένα σύνολο απλών εφαρμογών που υπήρχαν ακόμη και πριν από την εμφάνιση του παραπάνω πυρήνα. Αυτά τα προγράμματα επιτρέπουν σε ένα άτομο να πραγματοποιήσει τουλάχιστον κάποια αλληλεπίδραση με τον υπολογιστή και όχι απλώς να κοιτάζει επίμονα την οθόνη. Ο πηγαίος κώδικας είναι επίσης ανοιχτός, φυσικά.

Το GNU/Linux είναι ένα λειτουργικό σύστημα, όχι απλώς ένας πυρήνας. Αντί για GNU μπορεί να υπάρχει κάτι άλλο, για παράδειγμα Dalvik στο Android.

Οδηγοί

Η τεχνολογία αναπτύσσεται, ο αριθμός του υλικού υπολογιστών αυξάνεται, ο εξοπλισμός εξελίσσεται. Και κάθε προϊόν χρειάζεται έναν οδηγό για να λειτουργήσει. Έτσι, ορισμένοι οδηγοί βιδώνονται απευθείας στον πυρήνα. Αν είναι δωρεάν (Ελεύθερο Λογισμικό), όπως το GNU και το Linux, τότε οι κωδικοί είναι σίγουρα ανοιχτοί.

Λοιπόν, όταν δεν υπάρχουν κατάλληλα δωρεάν προγράμματα οδήγησης, τότε δεν μπορεί να γίνει τίποτα, πρέπει να εγκαταστήσετε ιδιόκτητα. Το αν οι κωδικοί τους είναι ανοιχτοί εξαρτάται μόνο από τους κατασκευαστές υλικού.

Εφαρμογές

Προσαρμοσμένες εφαρμογές που σχετίζονται με την κατηγορία Ανοιχτή πηγή, κατασκευάζονται συχνά σε εκδόσεις για διαφορετικά λειτουργικά συστήματα. Δεν αποτελούν μέρος του Linux. Είναι αλήθεια ότι ορισμένα είναι τυπικά για μια συγκεκριμένη διανομή ή γραφικό κέλυφος, αλλά δεν αποτελούν μέρος του πυρήνα.

Φυσικά, οι κωδικοί για όλες τις επιλογές είναι ανοιχτοί - για όλα τα υποστηριζόμενα λειτουργικά συστήματα. Η ίδια κατάσταση ισχύει για διάφορες επιχειρήσεις κοινής ωφέλειας.

Ποιος το φτιάχνει

Ο πυρήνας του Linux βελτιώνεται από μια ομάδα ενθουσιωδών. Μερικές φορές συμμετέχει και ο ίδιος ο Linus Torvalds. Ο κώδικας του πυρήνα, συσκευασμένος σε ένα αρχείο, μπορεί να ληφθεί από το kernel.org για επακόλουθη ανεξάρτητη μεταγλώττιση.

Οι οδηγοί, αν είναι δωρεάν, γίνονται επίσης συχνά από κοινότητες. Για εκτυπωτή, σαρωτή, κάρτα βίντεο, Προσαρμογέας Wi-Fi... Γενικά, υπάρχουν πολλά για τι.

Για παράδειγμα, το πακέτο Gutenprint, το οποίο είναι ένα ολόκληρο σύνολο προγραμμάτων οδήγησης για πολλά μοντέλα εκτυπωτών. Επιπλέον, η ποιότητα εκτύπωσης είναι συχνά συγκρίσιμη με τους δείκτες που παράγονται όταν χρησιμοποιούνται "εγγενή" προγράμματα οδήγησης κατασκευαστών.

Μερικές φορές οι ίδιοι οι κατασκευαστές υλικού ανοίγουν τον κώδικα με κάποια κατάλληλη άδεια, όπως η GPL ή η BSD. Τέτοια γεγονότα προκαλούν συνήθως απερίγραπτη χαρά στους υποστηρικτές του Open Source.

Όπως μπορείτε ήδη να μαντέψετε, προσαρμοσμένες εφαρμογέςδημιουργούνται επίσης είτε από κοινότητες είτε από μεμονωμένους ενθουσιώδεις. Ωστόσο, στις εμπορικές εταιρείες αρέσει επίσης να διαφημίζονται δίνοντας στον πληθυσμό μέρος των προϊόντων τους με τη μορφή Ελεύθερου Λογισμικού. Ένα εντυπωσιακό παράδειγμα: σουίτα γραφείουΤο OpenOffice.org δημοσιεύτηκε από την Oracle για μεγάλο χρονικό διάστημα.

Επιπλέον, ορισμένες εταιρείες κατασκευάζουν ακόμη και ολόκληρα κιτ διανομής. κόκκινο καπέλο, SuSE, Xandros παίρνουν χρήματα για έτοιμες προς χρήση δυαδικές συναρμολογήσεις, αλλά δεν έχουν το δικαίωμα να κρύψουν τους κωδικούς. Δηλαδή, αυτοί οι κωδικοί, όπως και να επεξεργάζονται, πρέπει να παραμένουν ανοιχτοί. Αυτή είναι μια απαίτηση της άδειας GPL.

Ποιος το χρησιμοποιεί

Ένας προγραμματιστής κοιτάζει το λογισμικό και σκέφτεται: "Είναι καλό, αλλά μπορεί να γίνει καλύτερα!" Πραγματοποιεί λήψη ενός αρχείου με κώδικα από τον ιστότοπο του προγραμματιστή και το βελτιώνει. Μαζί του έχει μια ομάδα ειδικών που επιθυμούν να συμμετάσχουν και ένα νέο έργο γεννιέται.

Έτσι εμφανίζονται τα "forks" (από το αγγλικό "fork", που σε αυτήν την περίπτωση μεταφράζεται ως "branch"). Νέα προγράμματα βασισμένα στη βάση κώδικα των υπαρχόντων.

Για παράδειγμα, από καλή συσκευή αναπαραγωγής ήχουΤο Amarok έγινε ακόμα καλύτερο - Clementine. Και από τη σουίτα εφαρμογών γραφείου OpenOffice.org - LibreOffice, η οποία αναπτύσσεται γρήγορα και πολλά υποσχόμενη.

Έτσι, ολόκληρα λειτουργικά συστήματα κλωνοποιούνται χρησιμοποιώντας αυτήν την αρχή. Το δωρεάν λειτουργικό σύστημα CentOS έχει μεταγλωττιστεί από τους πηγαίους κώδικες του επί πληρωμή Red Hat Enterprise Linux. Φυσικά, τα αφεντικά της Red Hat πιθανότατα δαγκώνουν τους αγκώνες τους από απογοήτευση, αλλά δεν μπορούν να κάνουν τίποτα αφού δεν κατέχουν τον πηγαίο κώδικα.

Ωστόσο, σε αυτή την περίπτωση, η τροποποίηση καταλήγει κυρίως στην αποκοπή των καταχωρημένων λογότυπων, αλλά χωρίς το υποχρεωτικό άνοιγμα του κώδικα, η ίδια η ύπαρξη του CentOS θα ήταν κατ' αρχήν αδύνατη.

συμπέρασμα

Ο ανοιχτός κώδικας είναι μια θεμελιώδης έννοια του Linux ειδικότερα και όλου του Ελεύθερου Λογισμικού γενικά. Οι κωδικοί μπορούν να χρησιμοποιηθούν για τα δικά σας έργα, να ελεγχθούν για ακίνδυνα μέσα από τις προσπάθειες της κοινότητας, να μελετηθούν, να βελτιωθούν οι δεξιότητές σας συμμετέχοντας στην ανάπτυξη, να βελτιωθούν και να βοηθηθούν οι άνθρωποι στον ευγενή σκοπό τους.

Δεν υπάρχει δυαδική συναρμολόγηση λογισμικού που να είναι σημαντική για εσάς για μια συγκεκριμένη διανομή GNU/Linux; Το πρόγραμμα οδήγησης δεν περιλαμβάνεται στον πυρήνα; Πήραμε το αρχείο με τον πηγαίο κώδικα, το αποσυσκευάσαμε, διαβάσαμε τις οδηγίες συναρμολόγησης, το μεταγλωττίσαμε, το εγκαταστήσαμε - και το χρησιμοποιήσαμε. Δεν εξαρτάστε από τον κατασκευαστή, δεν είστε συνδεδεμένοι με ένα συγκεκριμένο λειτουργικό σύστημα - αυτή είναι πραγματική ελευθερία.

Προηγούμενες δημοσιεύσεις:

Η φόρτωση οποιουδήποτε σύγχρονου λειτουργικού συστήματος είναι μια πολύπλοκη διαδικασία πολλαπλών βημάτων. Η διαδικασία εκκίνησης μπορεί να διαφέρει ελαφρώς μεταξύ διαφορετικών διανομών Linux, αλλά γενικό σχέδιοείναι περίπου το ίδιο και αποτελείται από τα ακόλουθα στάδια:

    Εκτελέστε τον κωδικό BIOS. Αρχικοποίηση εξοπλισμού. Επιλογή εκκινήσιμα μέσα. Ανάγνωση του bootloader στη μνήμη RAM και μεταφορά ελέγχου σε αυτήν. Ο φορτωτής εκκίνησης καταλαμβάνει συνήθως έναν τομέα στο δίσκο και περιορίζεται σε μέγεθος στα 384 byte (512 byte - τομέας δίσκου, μείον 128 byte - πίνακας κατατμήσεων). Ανάλογα με τον τύπο της συσκευής εκκίνησης, ο τομέας εκκίνησης μπορεί να διαβαστεί από διαφορετικά σημεία:

    • Κατά την εκκίνηση από δισκέτα ή σκληρό δίσκο, ο φορτωτής εκκίνησης διαβάζεται από τον πρώτο τομέα του φυσικού μέσου.
    • Κατά την εκκίνηση από CD/DVD – από τον πρώτο τομέα της εικόνας δίσκος εκκίνησης, που βρίσκεται στη δομή δεδομένων του CD.
    • Κατά την εκκίνηση μέσω δικτύου, από τον πρώτο τομέα της εικόνας του δίσκου εκκίνησης γίνεται λήψη από τον διακομιστή μέσω του πρωτοκόλλου tftp.

    Η οθόνη σε αυτό το στάδιο εμφανίζει πληροφορίες σχετικά με Έκδοση BIOS, η διαδικασία ελέγχου της μνήμης RAM, βρέθηκαν σκληροί δίσκοι. Ο κωδικός του boot loader είναι πολύ μικρός για να περιλαμβάνει τη λειτουργία εκτύπωσης πληροφοριών, αλλά μπορεί να εξάγει σύντομα μηνύματασχετικά με λάθη.

    Ανάγνωση του κύριου φορτωτή εκκίνησης (GRUB, LiLo, NTLDR) στη μνήμη και εκτέλεση του κώδικά του. Δεδομένου ότι ο bootloader είναι πολύ μικρός, κατά κανόνα, οι τομείς από τους οποίους πρέπει να διαβαστεί ο κύριος κώδικας του bootloader κωδικοποιούνται στον κώδικά του. Σε έναν σκληρό δίσκο, αυτός μπορεί να είναι ο χώρος μεταξύ του MBR και του πρώτου διαμερίσματος στο δίσκο (κομμάτι μηδέν). Σε μια δισκέτα και όταν χρησιμοποιείτε μια εικόνα δίσκου κατά την εκκίνηση από ένα CD και μέσω του δικτύου, ο κύριος φορτωτής εκκίνησης μπορεί να βρίσκεται αμέσως μετά τον κύριο φορτωτή εκκίνησης και να καταλαμβάνει ολόκληρο τον όγκο της εικόνας.

    Φόρτωση του πυρήνα (vmlinuz) και της βοηθητικής εικόνας του δίσκου (initrd). Ο κύριος φορτωτής εκκίνησης είναι αρκετά έξυπνος για να βρει το αρχείο διαμόρφωσης, το αρχείο εικόνας του πυρήνα και το βοηθητικό αρχείο εικόνας δίσκου στο σύστημα αρχείων. Εάν είναι απαραίτητο, η εικόνα του πυρήνα αποσυσκευάζεται στη μνήμη RAM και σχηματίζεται μια περιοχή μνήμης που περιέχει παραμέτρους που μεταβιβάζονται από τον φορτωτή εκκίνησης στον πυρήνα, συμπεριλαμβανομένης της διεύθυνσης της εικόνας του βοηθητικού δίσκου.

    Ένας βοηθητικός δίσκος είναι απαραίτητος για το σύγχρονο Συστήματα Linuxλόγω της αρθρωτότητας του πυρήνα και περιέχει τα προγράμματα οδήγησης (ATA, NFS, RAID κ.λπ.) που είναι απαραίτητα για να αποκτήσετε πρόσβαση στο κύριο σύστημα αρχείων.

    Σε αυτό το στάδιο δημιουργείται μια διεργασία με pid=1, στην οποία εκτελείται το σενάριο init, που βρίσκεται στον ριζικό κατάλογο του βοηθητικού δίσκου. Οι επιλογές που μεταβιβάζονται στον πυρήνα μεταβιβάζονται στην init ως ορίσματα γραμμής εντολών.

    Το σενάριο περιέχει τη λήψη απαραίτητους οδηγούςμε τη μορφή λειτουργικών μονάδων πυρήνα, δημιουργία προσωρινών αρχείων συσκευής στον κατάλογο /dev για πρόσβαση σε αυτές τις μονάδες, σάρωση κατατμήσεις δίσκουγια τον εντοπισμό και την προετοιμασία RAID και λογικούς τόμους. Αφού αρχικοποιηθούν οι λογικές μονάδες δίσκου, γίνεται προσπάθεια προσάρτησης του συστήματος αρχείων root που καθορίζεται από την παράμετρο root=. Σε περίπτωση χωρίς δίσκο εκκίνηση δικτύουΓίνεται προσπάθεια προσάρτησης του ριζικού καταλόγου μέσω NFS.

    Στην οθόνη εμφανίζονται μηνύματα σχετικά με τη φόρτωση προγραμμάτων οδήγησης και την αναζήτηση εικονικών τόμων του υποσυστήματος LVM. Το στάδιο ολοκληρώνεται με την εκ νέου τοποθέτηση του ριζικού καταλόγου στο κύριο σύστημα αρχείων και τη φόρτωση του κύριου προγράμματος /sbin/init (ή του ισοδύναμου του) στη διεργασία με pid=1.

    Σε κλασικό UNIX και παλαιότερα εκδόσεις Linux(έως το 2012 περίπου), το πρόγραμμα init διαβάζει το αρχείο διαμόρφωσης /etc/inittab, προετοιμάζει τις κονσόλες κειμένου και συνήθως ξεκινά τις απαραίτητες υπηρεσίες χρησιμοποιώντας ένα σύνολο σεναρίων που βρίσκονται στο /etc/init.d και /etc/rc*.d καταλόγους. Στις σύγχρονες διανομές Linux, το αρχείο /sbin/init περιέχει περισσότερα από σύγχρονο πρόγραμμαέναρξη των υπηρεσιών. Το πιο δημοφιλές από παρόμοια προγράμματαείναι εκ των προτέρων και συστημικά, γεγονός που μπορεί να μειώσει σημαντικά το χρόνο αυτής της φάσης εκκίνησης.

    Σε αυτό το στάδιο, εμφανίζονται γραμμές στην οθόνη που υποδεικνύουν την έναρξη των υπηρεσιών και πληροφορίες σχετικά με την επιτυχία αυτής της διαδικασίας ( ή ).

Φορτωτή εκκίνησης GRUB

Εκκίνηση από τη δισκέτα εγκατάστασης στη λειτουργία Rescue. Για να το κάνετε αυτό, κατά την εκκίνηση, στην προτροπή εκκίνησης: πρέπει να εισαγάγετε το Linux Rescue

Εάν όλα πάνε καλά, ο ριζικός κατάλογος του κύριου συστήματος θα προσαρτηθεί στο /mnt/sysimage, ο κατάλογος εκκίνησης στο /mnt/sysimage/boot. Επιπλέον, οι τρέχοντες κατάλογοι /proc, /sys και /dev θα προσαρτηθούν στους αντίστοιχους υποκαταλόγους /mnt/sysimage. Εάν αυτό δεν συμβεί, τότε θα πρέπει να κάνετε αυτές τις λειτουργίες χειροκίνητα.

Όταν έχουν προσαρτηθεί όλοι οι κατάλογοι, μπορείτε να αλλάξετε τον ριζικό κατάλογο

#αν αποδειχθεί ότι ξεχάσατε να προσαρτήσετε κάτι, μπορείτε να βγείτε μέσω ^D chroot /mnt/sysimage

και ξαναφτιάξτε το initrd

#copy το παλιό αρχείο cp -p /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak #create a new dracut -f #if the kernel version on the Το κύριο σύστημα είναι διαφορετικό από τις εκδόσεις που έχουν ενεργοποιηθεί δίσκο εγκατάστασης, προσδιορίστε το ρητά dracut -f /boot/initramfs-2.6.32-358.el6.x86_64.img 2.6.32-358.el6.x86_64

#copy το παλιό αρχείο cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak #create a new mkinitrd -f -v /boot/initrd -$( uname -r).img $(uname -r) #εάν η έκδοση του πυρήνα στο κύριο σύστημα διαφέρει από την έκδοση στο δίσκο εγκατάστασης, προσδιορίστε την ρητά mkinitrd -f -v /boot/initrd-2.6.18- 371.el5.img 2.6 18-371.el5

Cd/sync telinit 6

Πλήρες παράδειγμα με πρόγραμμα οδήγησης i2o_block (Adaptec 2010S SCSI adapter), το οποίο δεν φορτώνεται αυτόματα. Το παράδειγμα εκτελείται σε CentOS 5 επειδή ο τυπικός πυρήνας CentOS 6 δεν υποστηρίζει αυτό το πρόγραμμα οδήγησης.

Μετά την εκκίνηση από το CD στη λειτουργία Rescue, εμφανίζεται ένα μήνυμα ότι τα διαμερίσματα Linux δεν βρέθηκαν και πρέπει να τα προσαρτήσετε μόνοι σας.

#Φορτώστε το πρόγραμμα οδήγησης insmod i2o_block #Ελέγξτε ότι όλα λειτούργησαν lsmod .... dmesg ... #Δημιουργία αρχείων συσκευής με βάση τις πληροφορίες στο dmesg mkdir /dev/i2o mknod /dev/i2o/hda b 80 0 mknod /dev/i2o / hda1 b 80 1 mknod /dev/i2o/hda2 b 80 2 #Activate VolumeGroup lvm vgchange -a y #Mount volumes mkdir /mnt/sysimage mount /dev/mapper/VolGroup00-LogVol00/mountagei/devsy / mnt/sysimage/boot #Mount ειδικών καταλόγων mount --bind /proc /mnt/sysimage/proc mount --bind /dev /mnt/sysimage/dev mount --bind /sys /mnt/sysimage/sys

Επιπλέον, σύμφωνα με τις οδηγίες, μόνο όταν δημιουργείτε μια εικόνα δίσκου, πρέπει να καθορίσετε την πρόσθετη επιλογή --preload=i2o_block στο πρόγραμμα mkinitrd και να απενεργοποιήσετε τις υπηρεσίες ανάγνωσης, καθώς οδηγούν στο πάγωμα του προγράμματος οδήγησης i2o_block:

Chkconfig πρώιμη ανάγνωση εκτός λειτουργίας chkconfig later-readahead off

Την τελευταία φορά μιλήσαμε για το τι συμβαίνει κατά την εκκίνηση του Linux: πρώτα ξεκινά ο φορτωτής εκκίνησης, φορτώνει τον πυρήνα και αναπτύσσει έναν προσωρινό δίσκο στο μνήμη τυχαίας προσπέλασης, ο πυρήνας ξεκινά τη διαδικασία init, το init βρίσκει τον πραγματικό ριζικό δίσκο, εκτελεί μια τόσο δύσκολη επανάσταση - αντί για έναν προσωρινό εικονικό δίσκο, ένας πραγματικός δίσκος είναι τοποθετημένος στην ίδια θέση στον ριζικό κατάλογο, από αυτόν τον πραγματικό δίσκο φορτώνεται η διαδικασία έναρξης άλλο ένα init που είναι σε αυτό πραγματικός δίσκος. Μετά από όλες αυτές τις λειτουργίες, το UNIX επιστρέφει στην κανονική του κατάσταση λειτουργίας.

Σε αυτή τη διάλεξη θα σας δείξω τι κάνει το κλασικό πρόγραμμα init σε συνδυασμό με σενάρια rc.d στυλ System V. Το σύστημα V είναι κλασική έκδοση UNIX στο οποίο είναι χτισμένο το εμπορικό UNIX.

Όπως υποδηλώνει το όνομα, το rc.d είναι ένας κατάλογος. Υπάρχει μια παράδοση UNIX - εάν ολόκληρη η ρύθμιση παραμέτρων κάτι χωράει σε ένα αρχείο και ονομάζεται config, τότε όταν χωρίζεται σε ξεχωριστά αρχεία που συνδέονται με το κύριο, δημιουργούν έναν κατάλογο με το ίδιο όνομα και προσθέτουν ρυθμίσεις .δ στο όνομα.δ. Το γράμμα d σημαίνει ότι αυτός είναι ένας κατάλογος και υπάρχουν βοηθητικά μέρη του αρχείου διαμόρφωσης. Η αρχική μορφή αρχείου διαμόρφωσης του προγράμματος έχει δύο παραδόσεις: την παραλλαγή System V, στην οποία κάθε λεπτομέρεια διαμόρφωσης διατηρείται σε ξεχωριστό αρχείο στον κατάλογο rc.d και την παράδοση BSD, στην οποία υπάρχει ένα μεμονωμένο αρχείο /etc/rc που περιέχει πολλά σενάρια και μεταβλητές που είναι υπεύθυνες για τη συμπεριφορά του συστήματος.

Σε κάθε περίπτωση, όταν ξεκινά το σύστημα, δημιουργούμε μια διαδικασία με PID=1, στην οποία εκκινείται ένα πρόγραμμα που ονομάζεται init. Όπως είδατε την προηγούμενη φορά, εάν το πρόγραμμα init σκοτωθεί, ο πυρήνας πανικοβάλλεται και σταματάει όλη τη δουλειά.

Το κλασικό σύστημα V init διαβάζει το αρχείο /etc/inittab και εκτελεί έναν αριθμό εντολών που είναι γραμμένες σε αυτό το αρχείο. Το Inittab είναι ένα αρχείο κειμένου, κάθε γραμμή του οποίου είναι, στην πραγματικότητα, μια εντολή ή κάποιο είδος κανόνα συμπεριφοράς. Το Inittab μοιάζει με αυτό:

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

l3:3:wait:/etc/rc.d/rc 3

ca::ctrlaltdel:/sbin/shutdown -t3 -r τώρα

Υπάρχει μια ετικέτα στην αρχή της γραμμής. Δεν καταλαβαίνω πραγματικά ποιο είναι το μεγάλο νόημα αυτής της ετικέτας. Μπορούμε να υποθέσουμε ότι αυτό είναι απλό κείμενο και αυτό είναι όλο. Το δεύτερο σημείο είναι είτε το λεγόμενο επίπεδο φορτίου, είτε κενή τιμή. Το επίπεδο φόρτωσης είναι είτε ένας μεμονωμένος αριθμός από το 0 έως το 6, είτε μια λίστα αριθμών που χωρίζονται με κόμματα. Ακολουθεί κάποια δράση. Οι ενέργειες είναι οι εξής: αναμονή, respawn, sysinit, ctrlaltdel. Υπάρχουν και άλλες ενέργειες, αλλά αυτές είναι οι πιο χρησιμοποιούμενες. Τέλος, στο τέλος της γραμμής υπάρχει μια συγκεκριμένη εντολή γραμμένη με το όνομα του εκτελέσιμου αρχείου και τα ορίσματα που πρέπει να περάσουν σε αυτήν την εντολή.

Η ενέργεια sysinit εκτελείται μία φορά κατά την εκκίνηση του συστήματος.

Η ενέργεια ctrlaltdel δεν είναι στην πραγματικότητα καθόλου ενέργεια - είναι ένας χειριστής για τη συντόμευση alt del του ελέγχου. Το ίδιο το κλικ παρεμποδίζεται από τον πυρήνα του συστήματος και οι πληροφορίες σχετικά με αυτό αποστέλλονται στη διεργασία init, η οποία πρέπει να εκτελέσει μια συγκεκριμένη εντολή. Για παράδειγμα, μπορεί να εκδοθεί η εντολή τερματισμού λειτουργίας, η οποία θα τερματίσει τη λειτουργία του υπολογιστή. Κατ 'αρχήν, μπορείτε να καταχωρήσετε οποιοδήποτε άλλο πρόγραμμα εδώ, για παράδειγμα, το echo, το οποίο, αφού πατήσετε το πλήκτρο alt del, θα εκδώσει ένα μήνυμα σε όλα τα τερματικά του συστήματος. κονσόλα τζακιού όπως αυτή

Η ενέργεια αναμονής σημαίνει ότι πρέπει να εκτελέσετε την εντολή, να περιμένετε μέχρι να ολοκληρωθεί και μόνο στη συνέχεια να συνεχίσετε την επεξεργασία των επόμενων γραμμών. Δεν ξέρω αν τέτοιες ενέργειες μπορούν να ξεκινήσουν παράλληλα. Πιθανότατα όχι.

Η ενέργεια respawn σημαίνει ότι πρέπει να εκτελέσετε το πρόγραμμα και, χωρίς να περιμένετε να ολοκληρωθεί, να προχωρήσετε σε περαιτέρω ενέργειες. Εάν αυτό το πρόγραμμα τελειώσει στη συνέχεια, πρέπει να επανεκκινηθεί.

Έτσι, υπάρχει μια ενιαία εκτέλεση με αναμονή για αποτελέσματα και πολλαπλή εκτέλεση σε ασύγχρονη λειτουργία - ξεκίνησαν, περίμεναν μέχρι να τελειώσει, εκτόξευσαν τις λέξεις.

Τα επίπεδα φόρτωσης είναι μια σύμβαση που σας επιτρέπει να ελέγχετε ποιες υπηρεσίες φορτώνονται. Γίνεται φόρτωση του πλησιέστερου αναλογικού στα Windows λειτουργία ασφαλείας, όταν φορτώνεται μόνο ένας περιορισμένος αριθμός προγραμμάτων οδήγησης και ξεκινά ένας ελάχιστος αριθμός υπηρεσιών, φόρτωση με εντοπισμό σφαλμάτων, όταν καταγράφεται επιπλέον κάθε ενέργεια και κανονική πλήρης φόρτωση.

Το Linux έχει παραδοσιακά 6 επιλογές εκκίνησης. Αυτή η διαίρεση είναι αρκετά αυθαίρετη.

0 και 6 είναι απενεργοποιημένα. Το 0 είναι μια πλήρης απενεργοποίηση και το 6 είναι μια λειτουργία επανεκκίνησης.

Το 4 παραλείπεται εντελώς στο Linux

Απομένουν τέσσερα επίπεδα φόρτωσης:

1 - λειτουργία ενός χρήστη. Εάν περάσουμε τη μοναδική λέξη-κλειδί στον bootloader, θα βρεθούμε σε λειτουργία ενός χρήστη, όπου εκτελείται μόνο μία διεργασία και αυτό είναι το κέλυφος του διαχειριστή συστήματος. Αυτή η λειτουργία χρησιμοποιείται για την επαναφορά του συστήματος.

3 - κανονική λειτουργία κειμένου πολλών χρηστών, όταν όλες οι υπηρεσίες εκτελούνται, το δίκτυο λειτουργεί, όλα τα προγράμματα οδήγησης λειτουργούν.

2 - επίσης λειτουργία κειμένου, αλλά χωρίς σύνδεση μονάδων δίσκου δικτύου. Το γεγονός είναι ότι το παραδοσιακό αρχείο δικτύου σύστημα nfs, το οποίο χρησιμοποιείται στο UNIX, είναι εξαιρετικά ανθεκτικό σε ζημιές στο δίκτυο. Εάν απενεργοποιήσαμε τον διακομιστή αρχείων ή περικόψαμε καλώδιο δικτύου, τότε το σύστημα αρχείων δικτύου nfs θα κάνει πολλές προσπάθειες ανάκτησης και αυτές οι προσπάθειες είναι τόσο μεγάλες που δεν μπορούσα ποτέ να περιμένω μέχρι να εμφανιστεί τελικά το μήνυμα σφάλματος. Ίσως αυτό να συμβεί σε μια ώρα ή ίσως σε 6 ώρες. Όλο αυτό το διάστημα, το πρόγραμμα οδήγησης nfs θα κρατά τον υπολογιστή, εμποδίζοντάς σας να κάνετε οτιδήποτε. Επομένως, εάν το δίκτυο ή ο διακομιστής αρχείων μας αποτύχει, οι ρυθμίσεις λένε ότι κατά την εκκίνηση είναι απαραίτητο να γίνει προσάρτηση Εξωτερικές μονάδες, τότε η προσπάθεια θα ξεκινήσει πλήρη λειτουργίαθα κάνει τα πάντα να παγώσουν για εσάς. Για αυτήν την περίπτωση, παρέχεται η δεύτερη επιλογή εκκίνησης - όλα είναι ίδια με την τρίτη, μόνο οι μονάδες δίσκου δικτύου δεν είναι συνδεδεμένες. Ο ίδιος ο προσαρμογέας δικτύου λειτουργεί, η διεύθυνση IP έχει εκχωρηθεί, το Διαδίκτυο είναι διαθέσιμο.

5 - το ίδιο με το 3, αλλά με την εκκίνηση του παραθύρου x - γραφική διεπαφή.

Η λειτουργία 2 περιλαμβάνει 1 + λειτουργία για πολλούς παίκτες. 3 επιτρέπει 2+ προσάρτηση συστημάτων αρχείων δικτύου. Τέλος, το 5 περιλαμβάνει 3 + εκκίνηση υποσύστημα γραφικών. Το αν αυτό θα εφαρμοστεί με συνέπεια ή όχι είναι θέμα διανομής. Γενικά, οι διαχειριστές μπορούν να ρυθμίσουν ανεξάρτητα το αρχείο inittab έτσι ώστε αυτές οι λειτουργίες να εκκινούνται διαδοχικά ή μπορούν να κάνουν τα πάντα εντελώς ανεξάρτητα - μεταβαίνοντας στην επόμενη λειτουργία, αφαιρούμε όλα όσα έγιναν στο προηγούμενο βήμα και ρυθμίζουμε τα πάντα από την αρχή.

Ας δούμε τις γραμμές ενός πραγματικού αρχείου. Είναι πολύ απλά.

l3:3:wait:/etc/rc.d/rc 3

Ξεκινά κάποιο πρόγραμμα που πρέπει να κάνει τα πάντα απαραίτητες ενέργειες, τα οποία αναμένονται στο τρίτο επίπεδο. Πιθανώς, στο τρίτο επίπεδο πρέπει να διαμορφώσετε τις διασυνδέσεις δικτύου, να εκκινήσετε το πρόγραμμα οδήγησης τερματικού και να ξεκινήσετε ορισμένες υπηρεσίες. Μόνο αφού ολοκληρωθούν όλα αυτά θα μπορέσουμε να εργαστούμε στο σύστημα. Εφόσον πρέπει να περιμένουμε να ολοκληρωθεί η εκκίνηση, επιλέγουμε την ενέργεια αναμονής.

Ο εκτοξευτής ονομάζεται rc και εκκινείται με παράμετρο τον αριθμό επιπέδου. Το ίδιο το πρόγραμμα init είναι αρκετά απλό. Μπορεί να διαβάσει το αρχείο της γραμμή προς γραμμή με απλή σύνταξη και να ξεκινήσει νέες διαδικασίες ξεκινώντας κάποια βοηθητικά προγράμματα. Όλη η λογική του επιπέδου φόρτωσης είναι κρυμμένη στο σενάριο rc. Τρέχοντας το rc με την παράμετρο 3 θα πάμε στο τρίτο επίπεδο, με την παράμετρο 5 - στο πέμπτο.

Το πρόγραμμα rc είναι επίσης πολύ απλό. Αυτό είναι ένα σενάριο που εκτελεί όλα τα αρχεία σε καταλόγους που αντιστοιχούν στο επίπεδο φόρτωσης, για παράδειγμα /etc/rc3.d/. Αυτοί οι κατάλογοι περιέχουν εκτελέσιμα αρχεία, τα οποία λαμβάνουν μία παράμετρο - είτε έναρξη είτε διακοπή. Εάν το αρχείο εκκινηθεί με την παράμετρο έναρξης, τότε ξεκινά την υπηρεσία, εάν με την παράμετρο διακοπής, τη σταματά. Για παράδειγμα, η εκκίνηση δικτύου θα διαμορφώσει τις διεπαφές δικτύου και η διακοπή δικτύου θα θέσει τις διεπαφές σε κατάσταση απενεργοποίησης. Εκτός διεπαφές δικτύουΥπάρχουν σενάρια για σύνδεση/αποσύνδεση συστημάτων αρχείων δικτύου, εκκίνηση/διακοπή υπηρεσιών κ.λπ.

Ονόματα αρχείων σε καταλόγους που έχουν δημιουργηθεί σύμφωνα με ορισμένους κανόνες. Αρχίζουν είτε με το γράμμα Κ είτε με το γράμμα S, ακολουθούμενα από έναν αριθμό και το όνομα της υπηρεσίας.

Το σενάριο rc εξετάζει τα περιεχόμενα του καταλόγου rc3 και επιλέγει από εκεί όλα τα αρχεία που ξεκινούν με το γράμμα K (kill). Τα αρχεία ταξινομούνται με αύξουσα σειρά και εκτελούνται με την παράμετρο stop. Στη συνέχεια εκτελούνται οι ίδιες ενέργειες με αρχεία που ξεκινούν με το γράμμα S (start), τα οποία εκκινούνται με την παράμετρο έναρξης. Αυτή, γενικά, είναι η όλη διαδικασία για τη μετάβαση σε ένα ορισμένο επίπεδο.

Μπορούμε να υποθέσουμε ότι ο κατάλογος /etc/rc0.d/ περιέχει μόνο αρχεία που ξεκινούν με το γράμμα K, καθώς όλα πρέπει να διακοπούν κατά τον τερματισμό λειτουργίας και ο κατάλογος /etc/rc1.d/ θα περιέχει ένα αρχείο στο γράμμα S για την εκκίνηση της κονσόλας διαχειριστή.

Για ευκολία προγραμματισμού, υπάρχει ένας ξεχωριστός κατάλογος /etc/init.d/, ο οποίος περιέχει τα ίδια αρχεία μόνο χωρίς τα γράμματα και τους αριθμούς στην αρχή του ονόματος. Στην πραγματικότητα, τα αρχεία στους καταλόγους επιπέδου είναι απλώς συμβολικοί σύνδεσμοι προς τα κύρια αρχεία. Έτσι το /etc/rc3.d/S10apache είναι ένας σύνδεσμος προς το αρχείο /etc/init.d/apache. Χρειάζονται γράμματα και αριθμοί στα ονόματα των συνδέσμων, ώστε το σενάριο rc να τους καλεί με τη σωστή σειράκαι με τα απαραίτητα επιχειρήματα.

Σε συστήματα που είναι χτισμένα με αυτήν την αρχή, για να ξεκινήσετε ή να σταματήσετε οποιαδήποτε υπηρεσία στον κατάλογο /etc/init.d/, πρέπει να βρείτε το αρχείο που αντιστοιχεί σε αυτήν και να το ξεκινήσετε με την παράμετρο start ή stop. Τι δεν αρέσει όταν ξεκινάτε υπηρεσίες με αυτόν τον τρόπο - καλώντας ρητά σενάρια. Το θέμα είναι ότι στην ομάδα γραμμή linuxΗ αυτόματη συμπλήρωση λειτουργεί εξαιρετικά. Με τη βοήθειά του μπορείτε πολύ γρήγορα να εισαγάγετε τη διαδρομή προς το αρχείο εκκίνησης.

Για την απόκρυψη μιας συγκεκριμένης υλοποίησης από τον χρήστη, γράφτηκαν δύο βοηθητικά προγράμματα πάνω από το σύστημα σεναρίων και συμβολικών συνδέσμων.

Το πρόγραμμα chkconfig σας επιτρέπει να χειριστείτε συμβολικούς συνδέσμουςστα αντίστοιχα σενάρια. Για να δείτε τι ξεκινά και τι σταματά σε κάθε επίπεδο, μπορείτε να χρησιμοποιήσετε την εντολή ls και να καταχωρήσετε τα σενάρια στον αντίστοιχο κατάλογο, αλλά είναι πιο εύκολο να χρησιμοποιήσετε την εντολή chkconfig –list. Το πρόγραμμα chkconfig τρέχει σε όλους τους καταλόγους rc και παράγει μια λίστα με το τι ξεκινά και τι σταματά σε κάθε επίπεδο. Εάν θέλουμε μια συγκεκριμένη υπηρεσία να ξεκινά αυτόματα κατά την εκκίνηση του συστήματος, εκτελούμε το chkconfig<имя службы>και το σενάριο δημιουργεί έναν σύνδεσμο για εκτέλεση στον επιθυμητό κατάλογο και με σωστό όνομα. Εκτελέστε το chkconfig<имя службы>Η απενεργοποίηση προκαλεί την αφαίρεση του συνδέσμου έναρξης και τη δημιουργία του συνδέσμου διακοπής. Έτσι, το πρόγραμμα chkconfig σάς επιτρέπει να διαχειριστείτε τη λίστα των υπηρεσιών που ξεκινούν κατά την εκκίνηση του συστήματος.

Ένα άλλο πρόγραμμα - υπηρεσία χρησιμοποιείται για χειροκίνητη εκκίνηση και διακοπή υπηρεσιών. Το Service είναι ένα περιτύλιγμα που σας επιτρέπει να μην έχετε απευθείας πρόσβαση στο σενάριο, αλλά να καθορίσετε το όνομα της υπηρεσίας και να πείτε εάν θέλουμε να την ξεκινήσουμε ή να τη σταματήσουμε. Το bash που χρησιμοποιώ δεν έχει αυτόματη συμπλήρωση για την εντολή υπηρεσίας, επομένως είναι πιο εύκολο για μένα να πληκτρολογήσω τη διαδρομή προς τα σενάρια.

Στα σενάρια εκκίνησης, τα ορίσματα έναρξης και λήξης πρέπει να υποβληθούν σε επεξεργασία. Επιπλέον, μπορείτε να προβάλετε μερικά από τα δικά σας επιχειρήματα που θα κάνουν κάτι χρήσιμο.

Τα περισσότερα σενάρια εφαρμόζουν μια επιλογή κατάστασης, η οποία δείχνει εάν η υπηρεσία εκτελείται ή όχι. Όταν εκτελούμε την έναρξη, το σενάριο, αφού ξεκινήσει με επιτυχία την υπηρεσία, λαμβάνει το PID του και το γράφει σε ένα συγκεκριμένο αρχείο. Η εντολή stop διαγράφει το αρχείο. Συνήθως τέτοια αρχεία δημιουργούνται στον κατάλογο /var/run/. Η εντολή status ελέγχει εάν υπάρχει τέτοιο αρχείο. Εάν δεν υπάρχει, αναφέρει ότι η υπηρεσία δεν εκτελείται. Εάν το αρχείο υπάρχει, εξάγει το αναγνωριστικό διεργασίας από αυτό και ελέγχει την τρέχουσα λίστα διεργασιών. Εάν υπάρχει αυτό το αναγνωριστικό, όλα εκτελούνται, εάν το πρόγραμμα διακοπεί για κάποιο λόγο, τότε η κατάσταση υποδεικνύει ότι έγινε προσπάθεια εκκίνησης αυτής της υπηρεσίας - το αρχείο υπάρχει, αλλά η ίδια η υπηρεσία δεν εκτελείται.

Η επιλογή επανεκκίνησης εκτελεί διαδοχικά δύο εντολές μέσα στο σενάριο - πρώτα σταματήστε και μετά ξεκινήστε. Αυτή είναι μια εντελώς προαιρετική εντολή - απλά βολική. Τέλος, υπάρχουν υπηρεσίες που σας επιτρέπουν να διαβάσετε ξανά ορισμένα αρχεία ρυθμίσεων εν κινήσει. Για αυτούς, προστίθεται μια εντολή reload, η αποστολή της οποίας είναι να στείλει ένα σήμα στην υπηρεσία ότι η διαμόρφωση έχει αλλάξει. Μια ξεχωριστή περίπτωση, οι εντολές αποθήκευσης και φόρτωσης για την αποθήκευση της διαμόρφωσης του τείχους προστασίας.

Εάν ο διαχειριστής του συστήματος αντί να σταματήσει ή να ξεκινήσει μεμονωμένες υπηρεσίεςθέλει να μεταφέρει ολόκληρο το σύστημα σε ένα ορισμένο επίπεδο, τότε αυτό μπορεί να επιτευχθεί με έναν από τους δύο τρόπους. Μπορείτε να καλέσετε απευθείας το πρόγραμμα /sbin/init. Αν την καλέσεις με έναν ορισμένο αριθμόως παράμετρος, θα εκτελέσει όλες τις εντολές από το αρχείο inittab για το οποίο καθορίστηκε το αντίστοιχο επίπεδο. Εάν εκτελέσετε, για παράδειγμα, το /sbin/init 1, τότε το init θα βρει στο αρχείο ρυθμίσεών του όλες τις γραμμές που περιέχουν το επίπεδο 1 και θα τις εκτελέσει. Σε ορισμένα συστήματα, η εντολή shutdown υλοποιείται ως /sbin/init 0, αφού το επίπεδο 0 αντιστοιχεί στη διακοπή του συστήματος. ΣΕ ΠρόσφαταΓια τη μετάβαση μεταξύ των επιπέδων, εμφανίστηκε ένα ειδικό πρόγραμμα που ονομάζεται telinit, το οποίο είναι ένας σύνδεσμος για το init. Το καθήκον του είναι να στείλει ένα σήμα στη διαδικασία έναρξης ότι ο διαχειριστής θέλει να μετακινηθεί σε ένα συγκεκριμένο επίπεδο. Το telinit q λέει στην init να ξαναδιαβάσει το αρχείο inittab. Σε παλαιότερα συστήματα, αυτό επιτυγχανόταν στέλνοντας ένα σήμα SIGHUP στη διεργασία με PID=1 (kill –HUP 1).

Λίγες ακόμη γραμμές στο inittab, αυτή είναι η κυκλοφορία των τερματικών

1:2345:respawn:/sbin/mingetty tty1

Για να παρέχετε διαδραστική πρόσβαση στο σύστημα, ενδέχεται να έχετε μια σειρά από γραμμές αυτού του είδους στο inittabe. 2345 είναι τα επίπεδα στα οποία πρέπει να εκτελεστεί η εντολή, το respawn σημαίνει ότι το πρόγραμμα πρέπει να επανεκκινηθεί εάν τερματιστεί. Το getty είναι ένα πρόγραμμα διαχείρισης τερματικού. Παραδοσιακά, ένα τερματικό στο UNIX ονομάζεται teletype επειδή τα πρώτα τερματικά ήταν ηλεκτρικές γραφομηχανές. Αντίστοιχα, το tty είναι συντομογραφία για τηλεγραφομηχανή. Το Mingetty είναι ένα πρόγραμμα που μπορεί να λειτουργήσει με εικονικά τερματικά σε έναν προσωπικό υπολογιστή. Μπορεί να διαμορφώσει το πρόγραμμα οδήγησης τερματικού και ως παραμέτρους λαμβάνει το όνομα της τερματικής συσκευής που πρέπει να διαμορφωθεί. Στον κατάλογο /dev/ υπάρχει ένα αρχείο συσκευής tty1, το οποίο αντιστοιχεί στο πρώτο εικονικό τερματικό. Εάν είχαμε ένα μόντεμ και θέλαμε να το αρχικοποιήσουμε κατά την εκκίνηση, θα μπορούσαμε να καλέσουμε το getty με την παράμετρο ttyS0, που αντιστοιχεί στη θύρα COM1. Κατά την αρχικοποίηση του μόντεμ, θα ήταν δυνατό να ορίσετε πρόσθετες παραμέτρους: ταχύτητα σύνδεσης 19200 baud, 7 ή 8 bit ανά byte, ισοτιμία, αριθμός bit τερματισμού.

S0:2345:respawn:/sbin/getty ttyS0 19200 8 n 1

Την τελευταία φορά που σχεδίασα μια αλυσίδα στην οποία μια διεργασία κάνει ένα αντίγραφο του εαυτού της καλώντας το fork, το θυγατρικό αντίγραφο καλώντας το exec φορτώνει ένα άλλο πρόγραμμα στη μνήμη του και μετά την ολοκλήρωση το αναφέρει στη γονική διαδικασία.

Οι συνεδρίες χρήστη κειμένου οργανώνονται στις ακόλουθες αλυσίδες: πρώτα, το init δημιουργεί ένα αντίγραφο του εαυτού του και εκτελεί το πρόγραμμα mingetty σε αυτό. Το Mingetty προετοιμάζει το τερματικό και το πληκτρολόγιο και, στη συνέχεια, εκτελεί το πρόγραμμα σύνδεσης με την ίδια διαδικασία. Η σύνδεση εμφανίζει προτροπές για την εισαγωγή ονόματος και κωδικού πρόσβασης και, εάν όλα πήγαν καλά, εκχωρεί στον εαυτό της δικαιώματα χρήστη και στην ίδια διαδικασία, αντικαθιστώντας τον εαυτό της, εκκινεί έναν διερμηνέα χρήστη, για παράδειγμα, το bash. Όταν ο χρήστης πληκτρολογεί την εντολή εξόδου, ο διερμηνέας τερματίζει τη διαδρομή ζωής αυτής της διαδικασίας. Όταν μια διεργασία τερματίζεται, η init λαμβάνει ένα σήμα σχετικά με αυτήν. Το Init κοιτάζει τι υποτίθεται ότι πρέπει να κάνει, βλέπει την ενέργεια respawn, εκτελεί ξανά το πρόγραμμα mingetty, το οποίο αρχικοποιεί ξανά το τερματικό και επαναλαμβάνει τα πάντα. Έτσι, κάθε συνεδρία βρίσκεται μέσα σε μία διαδικασία. Μόλις φύγαμε από τη συνεδρία, η διαδικασία ολοκληρώθηκε και αμέσως ξεκίνησε ένα πρόγραμμα που θα καθάριζε το τερματικό μετά από εμάς και θα επαναφέρει όλες τις ρυθμίσεις στις προεπιλογές.

Υπάρχει μια άλλη ειδική λέξη-κλειδί στο αρχείο inittab, το initdefault - το προεπιλεγμένο επίπεδο. Εάν το init έλαβε τη μοναδική παράμετρο μέσω του πυρήνα, τότε θα εκκινήσουμε στο επίπεδο 1. Εάν δεν πέρασε τίποτα από τον φορτωτή εκκίνησης, τότε χρησιμοποιείται η προεπιλεγμένη τιμή. Εάν, μετά την εγκατάσταση του κελύφους γραφικών, αποδειχθεί ότι ο υπολογιστής μας είναι μάλλον αδύναμος για γραφικά, τότε μπορούμε να ορίσουμε το προεπιλεγμένο επίπεδο στο 3 και μετά την επόμενη επανεκκίνηση βρισκόμαστε στο τρίτο επίπεδο - δηλαδή σε λειτουργία κειμένου. Εγκαταστήσαμε το σύστημα χωρίς λειτουργία γραφικών, στη συνέχεια εγκαταστήσαμε επιπλέον όλα τα πακέτα για x παράθυρο, αλλάξαμε το προεπιλεγμένο επίπεδο σε 5 και μετά την επόμενη επανεκκίνηση πήγαμε κατευθείαν σε λειτουργία γραφικών.

Σε αυτό το σύστημα σεναρίων, μερικές φορές θέλετε να κάνετε κάτι δικό σας, για παράδειγμα, κατά την εκκίνηση, διαγράψτε όλα τα αρχεία στον κατάλογο /tmp/. Για αυτό υπάρχει ξεχωριστό αρχείοονομάζεται /etc/rc.local, το οποίο τρέχει μετά από όλα τα άλλα. Αυτό είναι απλώς ένα σενάριο χωρίς παραμέτρους στο οποίο μπορείτε να γράψετε ό,τι θέλετε. Για παράδειγμα, σε έναν από τους δρομολογητές μου, τη στιγμή που ξεκινά το σύστημα, οι πίνακες δρομολόγησης είναι γραμμένοι σε αυτό το αρχείο. Ήμουν πολύ τεμπέλης να ψάξω πού βρίσκονται τα αντίστοιχα τυπικά σενάρια από τη διανομή και αποδείχτηκε ότι ήταν πιο εύκολο να καταχωρήσω τις εντολές στο rc.local.

Φανταστείτε ότι έχετε μια εικόνα πυρήνα Linux για ένα τηλέφωνο Βασισμένο στο Android, αλλά δεν έχετε τις αντίστοιχες πηγές ή αρχεία κεφαλίδας πυρήνα. Φανταστείτε ότι ο πυρήνας έχει υποστήριξη για τη φόρτωση μονάδων (ευτυχώς) και θέλετε να δημιουργήσετε μια ενότητα για αυτόν τον πυρήνα. Υπάρχουν αρκετοί καλοί λόγοι για τους οποίους δεν μπορείτε απλώς να δημιουργήσετε έναν νέο πυρήνα από την πηγή και απλώς να τον αφήσετε έτσι (για παράδειγμα, ο ενσωματωμένος πυρήνας δεν υποστηρίζει κάποια σημαντική συσκευή, όπως μια οθόνη LCD ή οθόνη αφής). Με το συνεχώς μεταβαλλόμενο ABI του πυρήνα του Linux και την έλλειψη αρχείων πηγής και κεφαλίδας, μπορεί να νομίζετε ότι έχετε φτάσει σε αδιέξοδο.

Στην πραγματικότητα, εάν δημιουργήσετε μια λειτουργική μονάδα πυρήνα χρησιμοποιώντας διαφορετικά αρχεία κεφαλίδας από αυτά που χρησιμοποιούνται για τη δημιουργία της εικόνας του πυρήνα που έχετε, η μονάδα θα αποτύχει να φορτώσει, με σφάλματα ανάλογα με το πώς τα αρχεία κεφαλίδας ήταν διαφορετικά από αυτά που απαιτούνταν. Μπορεί να παραπονιέται για κακές υπογραφές, κακές εκδόσειςκαι για άλλα πράγματα.

Διαμόρφωση πυρήνα

Το πρώτο βήμα είναι να βρείτε πηγές πυρήνα που να είναι όσο το δυνατόν πιο κοντά στην εικόνα του πυρήνα. Πιθανώς η σωστή διαμόρφωση είναι το πιο δύσκολο μέρος ολόκληρης της διαδικασίας συναρμολόγησης της μονάδας. Ξεκινήστε με τον αριθμό έκδοσης του πυρήνα που μπορεί να διαβαστεί από το /proc/version . Εάν, όπως εγώ, δημιουργείτε μια ενότητα για Συσκευές Android, δοκιμάστε πυρήνες Android από Code Aurora, Cyanogen ή Android, όποιο είναι πιο κοντά στη συσκευή σας. Στην περίπτωσή μου, ήταν ο πυρήνας msm-3.0. Σημειώστε ότι δεν χρειάζεται απαραίτητα να αναζητήσετε την ίδια ακριβώς έκδοση πηγής με την έκδοση της εικόνας του πυρήνα. Μικρές διαφορέςοι εκδόσεις πιθανότατα δεν θα είναι πρόβλημα. Χρησιμοποίησα πηγές πυρήνα 3.0.21, ενώ η έκδοση της υπάρχουσας εικόνας του πυρήνα ήταν 3.0.8. Ωστόσο, μην προσπαθήσετε να χρησιμοποιήσετε τις πηγές πυρήνα 3.1 εάν έχετε εικόνα πυρήνα 3.0.x.

Εάν η εικόνα του πυρήνα που έχετε είναι αρκετά ευγενική για να παρέχει ένα αρχείο /proc/config.gz, μπορείτε να ξεκινήσετε με αυτό, διαφορετικά, μπορείτε να προσπαθήσετε να ξεκινήσετε με την προεπιλεγμένη διαμόρφωση, αλλά σε αυτήν την περίπτωση θα πρέπει να είστε εξαιρετικά προσεκτικοί ( Ενώ Δεν θα υπεισέλθω σε λεπτομέρειες σχετικά με τη χρήση της προεπιλεγμένης διαμόρφωσης, καθώς είχα την τύχη να μην καταφύγω σε αυτήν, θα υπάρξουν μερικές λεπτομέρειες παρακάτω για το γιατί σωστή διαμόρφωσηΤοσο σημαντικο).

Υποθέτοντας ότι έχετε διαθέσιμο το arm-eabi-gcc σε μία από τις διαδρομές στη μεταβλητή περιβάλλοντος PATH και ότι το τερματικό είναι ανοιχτό στο φάκελο με αρχεία πηγήςπυρήνα, μπορείτε να ξεκινήσετε τη διαμόρφωση του πυρήνα και την εγκατάσταση αρχείων κεφαλίδας και σεναρίων:

$ mkdir build $ gunzip config.gz > build/.config # ή οτιδήποτε άλλο για προετοιμασία .config $ make silentoldconfig προετοιμασία headers_install scripts ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=`adb shell uname - r`
Το build silentoldconfig πιθανότατα θα σας ρωτήσει εάν θέλετε να ενεργοποιήσετε ορισμένες επιλογές. Μπορείτε να επιλέξετε τις προεπιλογές, αλλά αυτό μπορεί κάλλιστα να μην λειτουργεί.

Μπορείτε να χρησιμοποιήσετε κάτι άλλο στο KERNELRELEASE, αλλά πρέπει να ταιριάζει ακριβώς με την έκδοση του πυρήνα από την οποία σκοπεύετε να φορτώσετε τη λειτουργική μονάδα.

Γράφοντας μια απλή ενότητα

Για να δημιουργήσετε μια κενή μονάδα, πρέπει να δημιουργήσετε δύο αρχεία: μια πηγή και ένα Makefile. Τοποθετήστε τον ακόλουθο κώδικα στο αρχείο hello.c, σε ξεχωριστό κατάλογο:

#περιλαμβάνω /* Απαιτείται από όλες τις ενότητες */ #include /* Απαιτείται για KERN_INFO */ #include /* Απαιτείται για τις μακροεντολές */ static int __init hello_start(void) ( printk(KERN_INFO "Hello world\n"); return 0; ) static void __exit hello_end(void) ( printk(KERN_INFO "Goodbye world\n"); ) module_init(hello_start); module_exit(hello_end);
Τοποθετήστε το ακόλουθο κείμενο σε ένα Makefile στον ίδιο κατάλογο:

Obj-m = γεια.ο
Ωστόσο, η συναρμολόγηση της μονάδας είναι αρκετά απλή σε αυτό το στάδιοη προκύπτουσα μονάδα δεν θα μπορεί να φορτώσει.

Συναρμολόγηση μονάδας

Κατά τη διάρκεια μιας κανονικής κατασκευής πυρήνα, το σύστημα δημιουργίας πυρήνα δημιουργεί ένα αρχείο hello.mod.c, το περιεχόμενο του οποίου μπορεί να προκαλέσει διάφορα προβλήματα:

MODULE_INFO(vermagic, VERMAGIC_STRING);
Η τιμή VERMAGIC_STRING καθορίζεται από τη μακροεντολή UTS_RELEASE, η οποία βρίσκεται στο αρχείο include/generated/utsrelease.h που δημιουργείται από το σύστημα κατασκευής πυρήνα. Από προεπιλογή, αυτή η τιμή καθορίζεται από την έκδοση του πυρήνα και την κατάσταση του αποθετηρίου git. Αυτό ορίζει το KERNELRELEASE κατά τη διαμόρφωση του πυρήνα. Εάν το VERMAGIC_STRING δεν ταιριάζει με την έκδοση του πυρήνα, η φόρτωση μιας λειτουργικής μονάδας θα έχει ως αποτέλεσμα ένα μήνυμα όπως αυτό στο dmesg:

Γεια σας: η έκδοση magic "3.0.21-perf-ge728813-00399-gd5fa0c9" θα πρέπει να είναι "3.0.8-perf"
Στη συνέχεια, έχουμε επίσης εδώ έναν ορισμό της δομής της ενότητας:

Struct module __this_module __attribute__((section(".gnu.linkonce.this_module"))) = ( .name = KBUILD_MODNAME, .init = init_module, #ifdef CONFIG_MODULE_UNLOAD .exit = #cleuping_MODULE.arch_AR);
Από μόνος του, αυτός ο ορισμός φαίνεται ακίνδυνος, αλλά η δομή της μονάδας δομής που ορίζεται στο include/linux/module.h έχει μια δυσάρεστη έκπληξη:

Μονάδα δομής ( (...) #ifdef CONFIG_UNUSED_SYMBOLS (...) #endif (...) /* Λειτουργία εκκίνησης. */ int (*init)(void); (...) #ifdef CONFIG_GENERIC_BUG (.. .) #endif #ifdef CONFIG_KALLSYMS (...) #endif (...) (... πολλά ακόμα ifdefs ...) #ifdef CONFIG_MODULE_UNLOAD (...) /* Συνάρτηση καταστροφής */ void (*exit) ( άκυρο (...) #endif (...) )
Αυτό σημαίνει ότι για να καταλήξει ο δείκτης init στη σωστή θέση, το CONFIG_UNUSED_SYMBOLS πρέπει να οριστεί σύμφωνα με το τι χρησιμοποιεί η εικόνα του πυρήνα μας. Τι γίνεται με το δείκτη εξόδου, αυτοί είναι οι CONFIG_GENERIC_BUG , CONFIG_KALLSYMS , CONFIG_SMP , CONFIG_TRACEPOINTS , CONFIG_JUMP_LABEL , CONFIG_TRACING , CONFIG_EVENT_TRACING_RECOUNTFIGLE_TRACEDU .

Αρχίζετε να καταλαβαίνετε γιατί συνήθως υποτίθεται ότι χρησιμοποιούμε ακριβώς τα ίδια αρχεία κεφαλίδας με τα οποία δημιουργήθηκε ο πυρήνας μας;

Static const struct modversion_info ____versions __used __attribute__((section("__versions"))) = ( ( 0xsomehex, "module_layout" ), ( 0xsomehex, "__aeabi_unwind_cpp_pr0" ), ( 0x ), ( 0xs);
Αυτοί οι ορισμοί προέρχονται από το αρχείο Module.symvers, το οποίο δημιουργείται σύμφωνα με τα αρχεία κεφαλίδας.

Κάθε τέτοια καταχώρηση αντιπροσωπεύει το σύμβολο που απαιτείται από τη μονάδα και την υπογραφή που πρέπει να έχει το σύμβολο. Ο πρώτος χαρακτήρας, module_layout , εξαρτάται από το πώς φαίνεται η λειτουργική μονάδα struct, δηλαδή εξαρτάται από το ποιες επιλογές διαμόρφωσης που αναφέρθηκαν προηγουμένως είναι ενεργοποιημένες. Η δεύτερη, __aeabi_unwind_cpp_pr0, είναι μια συγκεκριμένη συνάρτηση ARM ABI και η τελευταία είναι για τις κλήσεις της συνάρτησης printk.

Η υπογραφή κάθε συμβόλου μπορεί να διαφέρει ανάλογα με τον κώδικα του πυρήνα για τη συνάρτηση και τον μεταγλωττιστή που χρησιμοποιείται για την κατασκευή του πυρήνα. Αυτό σημαίνει ότι εάν δημιουργήσετε έναν πυρήνα από την πηγή, καθώς και λειτουργικές μονάδες για αυτόν τον πυρήνα, και στη συνέχεια δημιουργήσετε ξανά τον πυρήνα αφού τροποποιήσετε, για παράδειγμα, τη συνάρτηση printk, ακόμη και με συμβατό τρόπο, οι μονάδες που δημιουργήθηκαν αρχικά δεν θα φορτωθούν με το νέο πυρήνας.

Έτσι, εάν δημιουργήσουμε έναν πυρήνα με πηγές και διαμορφώσεις αρκετά κοντά σε εκείνες που χρησιμοποιήθηκαν για τη δημιουργία της εικόνας του πυρήνα που έχουμε, υπάρχει πιθανότητα να μην έχουμε τις ίδιες υπογραφές όπως στην εικόνα του πυρήνα μας, και θα διακοπεί όταν φόρτωση της ενότητας:

Γεια: διαφωνεί σχετικά με την έκδοση του σύμβολο σύμβολο_name
Που σημαίνει ότι χρειαζόμαστε το σωστό αρχείο Module.symvers για την εικόνα του πυρήνα, το οποίο δεν έχουμε.

Μελετώντας τον πυρήνα

Εφόσον ο πυρήνας κάνει αυτούς τους ελέγχους κατά τη φόρτωση λειτουργικών μονάδων, περιέχει επίσης μια λίστα συμβόλων που εξάγει και αντίστοιχες υπογραφές. Όταν ο πυρήνας φορτώνει μια λειτουργική μονάδα, περνά από όλα τα σύμβολα που απαιτεί η λειτουργική μονάδα για να τα βρει στον πίνακα συμβόλων της (ή σε άλλους πίνακες συμβόλων λειτουργιών που χρησιμοποιεί η λειτουργική μονάδα) και να ελέγξει τις αντίστοιχες υπογραφές.

Ο πυρήνας χρησιμοποιεί επόμενη λειτουργίαγια αναζήτηση στον πίνακα συμβόλων σας (στον πυρήνα/module.c):

Bool every_symbol_section(bool (*fn)(const struct symsearch *arr, struct module *owner, void *data), void *data) ( struct module *mod; static const struct symsearch arr = ( ( __start___ksymtab, __stop___ksymtab,_LY__k , False), (__start___ksymtab_gpl, __stop___ksymtab_gpl, __start___kcrctab_gpl, gpl_only, false), #IFDEF config_unuse d_symbols (__start___ksymtab_unused, __stop___ksymtab_unused, __start___kcrctab_unused, not_gpl_only, true) , GPL_ONLY, true ), #endif );
Η δομή που χρησιμοποιείται σε αυτή τη συνάρτηση ορίζεται στο include/linux/module.h:

Struct symsearch ( const struct kernel_symbol *start, *stop; const unsigned long *crcs; enum ( NOT_GPL_ONLY, GPL_ONLY, WILL_BE_GPL_ONLY, ) άδεια; bool unused; );
Σημείωση: αυτόν τον κωδικόο πυρήνας δεν έχει αλλάξει σημαντικά τα τελευταία τέσσερα χρόνια (προφανώς από την εν λόγω έκδοση του πυρήνα 3.0 - περίπου).

Αυτό που έχουμε παραπάνω στη συνάρτηση every_symbol_section είναι τρία (ή πέντε όταν το CONFIG_UNUSED_SYMBOLS είναι ενεργοποιημένο) πεδία, το καθένα περιέχει την αρχή του πίνακα συμβόλων, το τέλος του και δύο σημαίες.

Αυτά τα δεδομένα είναι στατικά και μόνιμα, πράγμα που σημαίνει ότι θα εμφανίζονται στο δυαδικό αρχείο του πυρήνα ως έχουν. Σαρώνοντας τον πυρήνα για τρεις διαδοχικές ακολουθίες τριών δεικτών στο χώρο διευθύνσεων του πυρήνα ακολουθούμενες από ακέραιες τιμές από τους ορισμούς στο every_symbol_section , μπορούμε να προσδιορίσουμε τη θέση των πινάκων συμβόλων και υπογραφών και να δημιουργήσουμε ξανά το αρχείο Module.symvers από τον πυρήνα δυάδικος.

Δυστυχώς, οι περισσότεροι πυρήνες σήμερα είναι συμπιεσμένοι (zImage), επομένως μια απλή αναζήτηση μέσα από μια συμπιεσμένη εικόνα δεν είναι δυνατή. Ο συμπιεσμένος πυρήνας είναι στην πραγματικότητα ένα μικρό δυαδικό που ακολουθείται από ένα συμπιεσμένο ρεύμα. Μπορείτε να σαρώσετε ένα αρχείο zImage για να βρείτε τη συμπιεσμένη ροή και να εξαγάγετε την αποσυμπιεσμένη εικόνα από αυτήν.

Ετικέτες: Προσθήκη ετικετών

Ακούω συχνά τους ανθρώπους να αναφέρονται στον πυρήνα του Linux ως παράδειγμα του πυρήνα του Linux και δεν μπορώ να βρω απαντήσεις σε καμία μηχανή αναζήτησης σχετικά με το γιατί ονομάζεται εικόνα.

Όταν σκέφτομαι εικόνα,Μπορώ να σκεφτώ μόνο δύο πράγματα είτε ένα αντίγραφο του δίσκου είτε μια φωτογραφία. Φυσικά δεν είναι φωτογραφική εικόνα, διάολε, γιατί λέγεται εικόνα;

5 Λύσεις συλλέγουν φόρμα web για το "Γιατί ο πυρήνας του Linux ονομάζεται "εικόνα";"

Η διαδικασία εκκίνησης Unix είχε μόνο περιορισμένες ευκαιρίεςέξυπνη φόρτωση προγραμμάτων (μετακίνηση, φόρτωση βιβλιοθηκών κ.λπ.). Να γιατί πρωτότυπο πρόγραμμαήταν η ακριβής εικόνα που ήταν αποθηκευμένη στο δίσκο, αυτό που έπρεπε να φορτωθεί στη μνήμη και να "κληθεί" για να ληφθεί ο πυρήνας.

Πολύ αργότερα προστέθηκαν πράγματα όπως (de-comp) και παρόλο που έχουν εγκατασταθεί πιο ισχυροί φορτωτές, το όνομα της εικόνας έχει κολλήσει.

Η λέξη εικόνα έχει επίσης τον ορισμό του "Ένα αρχείο που περιέχει όλες τις πληροφορίες που απαιτούνται για τη δημιουργία ενός ζωντανού αντιγράφου".

Αυτό δεν σημαίνει ότι η "εικόνα" είναι απλώς ένα αντίγραφο 1:1 του δίσκου. Γιατί η φωτογραφία αντιπροσωπεύει την πραγματικότητα ακριβώςΈτσι ίδιο,όπως σε ένα στιγμιότυπο, μια εικόνα ενός εκτελέσιμου προγράμματος (ή πυρήνα) αντιπροσωπεύει το πρόγραμμα σε κατάσταση όπου μπορεί να φορτωθεί (ή να αποσυμπιεστεί) στη μνήμη του συστήματος ακριβώς,όπως είναι, και στη συνέχεια του δόθηκε ο έλεγχος. Αυτό το πρόγραμμα μπορεί στη συνέχεια να ξεκινήσει από αυτήν την κατάσταση με συνεπή τρόπο. Έτσι, μια εικόνα πυρήνα Linux είναι μια εικόνα (εικόνα κατάστασης) του πυρήνα Linux που μπορεί να τρέξει από μόνη της, δίνοντάς του τον έλεγχο.

Αυτήν τη στιγμή το πρόγραμμα λήψης φορτώνει μια τέτοια εικόνα από σύστημα αρχείων σκληρός δίσκος(χρειάζεται πρόγραμμα οδήγησης), το αντικαθιστά και επομένως του δίνει τον έλεγχο. Η διαδικασία εκκίνησης του υπολογιστή πραγματοποιείται πολλές φορές μέχρι να αρχίσει να λειτουργεί το λειτουργικό σύστημα. Αυτό ονομάζεται φόρτωση αλυσίδας. Ή, εάν ένα μικρότερο πρόγραμμα (αλυσίδα) φορτώνει ένα πιο σύνθετο, ονομάζεται bootstrapping.

Το BIOS φορτώνει το bootloader, το οποίο είναι επίσης μια εικόνα, για παράδειγμα boot.img in κασετίνα. Αυτό το boot.img δεν είναι αρχείο (αν είναι εγκατεστημένο το grub). αυτό είναι το όνομα για το μέρος που είναι στο κύριο είσοδος μπότας(MBR). Εάν ανεβάσετε ένα αρχείο σε ένα αρχείο, θα είναι μια εικόνα ως αρχείο και δεν θα εγγραφεί σε αυτό HDD, αλλά γραμμένο σε αρχείο. Είναι επίσης μια αναπαράσταση (εικόνα) της πιο πρώιμης κατάστασης στην οποία το grub μπορεί να φορτώσει το υπόλοιπο του εαυτού του. Στη συνέχεια, το grub έχει τον δικό του μηχανισμό για το πώς να εκκινείται πλήρως κατά τη φόρτωση άλλων εικόνων. Αυτό αντιπροσωπεύεται από διάφορα στάδια στο grub. Στη συνέχεια, ο bootloader φορτώνει την εικόνα του πυρήνα, αντικαθιστώντας τον εαυτό του με τα εξαγόμενα περιεχόμενα αυτού του αρχείου.

Αρχαία ιστορία. ο όρος "εικόνα" προέρχεται από τον παλιό όρο "Digital Equipment Corporation" για την έξοδο compiler->linker. ένα αρχείο είναι μια εικόνα που δημιουργείται με ερμηνεία κώδικα κ.λπ. μέσω ενός συνδέσμου για τη δημιουργία μιας εκτελέσιμης "εικόνας" του σχεδίου σας.

Στα μαθηματικά, ο πυρήνας είναι η αντίστροφη εικόνα ενός υποσυνόλου της εικόνας κάποιας αντιστοίχισης εάν το υποσύνολο ήταν ίσο με το στοιχείο ταυτότητας στον κωδικό τομέα. Είμαι βέβαιος ότι αυτά τα ονόματα προέρχονται από μαθηματικές έννοιες, καθώς σχετίζονται σημαντικά σε διαφορετικούς τομείς των μαθηματικών. Δεδομένου ότι το Unix προήλθε από ένα ακαδημαϊκό περιβάλλον, είναι πιθανό η χρήση αυτού του πυρήνα και η εικόνα αυτών των λέξεων να είναι ίδια.

Εάν έχετε ένα σύνολο που αντιπροσωπεύει κάποιο επίπεδο πληροφοριών σχετικά με το "πλήρες" λειτουργικό σύστημα, εάν αυτές οι πληροφορίες σχηματίζουν επίσης μια ομάδα, τότε μπορείτε να ορίσετε έναν ομομορφισμό ομάδας σε αυτό το σύνολο ή βασικά να αντιστοιχίσετε σε άλλα σύνολα που έχουν διαφορετικά μεγέθη, τότε το αρχικό σύνολο αν «σεβαστούν» τη δομή αρχικό σετ, που το έκανε ομάδα. Μπορείτε να δείτε τι μπορεί να μείνει έξω για να αντιστοιχίσετε ένα σύνολο με ένα μικρότερο σύνολο ή ένα υποσύνολο κάποιου συνόλου όπου το υποσύνολο είναι μικρότερο.

Εικόνα. Η εικόνα του ομαδικού ομομορφισμού και γενικές λειτουργίεςκαι οι αντιστοιχίσεις είναι απλώς ένα υποσύνολο κάποιου συνόλου των οποίων τα στοιχεία συγκρίνονται πραγματικά. Η δυνατότητα ενδέχεται να μην εμφανίζεται για κάθε στοιχείο και αυτά τα στοιχεία δεν θα περιλαμβάνονται στην εικόνα.

Ο πυρήνας είναι βασικά μόνο στοιχεία από αρχικό σετ, τα οποία αντιστοιχίζονται σε μια εικόνα αλλά εμφανίζουν μόνο το στοιχείο ταυτότητας της εικόνας. Βασικά στοιχεία που εμφανίζουν 0 όπως το πράγμα στην εικόνα.

Εάν η εικόνα είναι μικρότερη σε μέγεθος από το αρχικό σύνολο, τότε μπορούμε να δούμε ότι πολλά στοιχεία πρέπει να αντιστοιχιστούν σε ένα μόνο στοιχείο. Έτσι, για παράδειγμα, μπορεί να υπάρχουν πολλά στοιχεία από τον πυρήνα που αντιστοιχούν σε μια εικόνα και γνωρίζουμε ήδη ότι θα πρέπει όλα να αντιστοιχιστούν στο 0.

Μπορούμε να δούμε ότι αν επιλέξουμε το αρχικό σύνολο να είναι πεπερασμένες ακολουθίες δυαδικών ή 1 και 0, και ο συντομέας (το σύνολο που αντιστοιχίζεται σε) είναι επίσης ακολουθίες δυαδικού, τότε μπορούμε να κατασκευάσουμε τέτοια πράγματα εάν και μόνο εάν μια κατάλληλη δομή ομάδας μπορεί να οριστεί (αυτό είναι λίγο βαθύτερο και άσχετο με την ερώτηση).

Επομένως, βλέπουμε με απόλυτη σιγουριά ότι ο «πυρήνας» και η «εικόνα» του ΛΣ είναι πλήρως καθορισμένοι και έχουν μαθηματική σημασία. Ανεξάρτητα ίσως από άλλες χρήσεις των όρων.