Kernel Optimization: Αυτόματη δημιουργία βελτιστοποιημένου πυρήνα

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

Μέχρι στιγμής η σειρά οδηγών που έχουμε καλύψει για την βελτιστοποίηση της διανομής Ubuntu, έχουν ως εξής :

  1. Μεταγλώττιση του κώδικα
  2. Δημιουργία Minimal διανομής
  3. 10 απλά βήματα για μεταγλώττιση του πυρήνα
  4. Παρουσίαση του βιβλίου Kernel in Nutshell

Σήμερα θα δούμε μια μέθοδο την οποία επιθυμούν σίγουρα πολύ από αυτούς που διάβασαν τα προηγούμενα άρθρα. Να σημειώσω εδώ ότι το μόνο άρθρο που χρειάζεται να διαβάσετε είναι το 3o, διότι ο σημερινός οδηγός είναι ουσιαστικά μια επέκταση του 5του βήματος. Με άλλα λόγια η τεχνική που θα περιγράψω εδώ έχει εφαρμογή αμέσως μετά το
cd linux-x.x.x

cp -vi /boot/config-uname -r .config
Η τεχνική έχει να κάνει με ένα μαγικό εργαλείο που είναι ενσωματωμένο στον πυρήνα :

  • make localmodconfig

Μια μικρή Ιστοριούλα…

Επιτρέψτε μου να σας μεταφέρω την ιστορία του εργαλείου, την οποία έμαθα από τον προγραμματιστή τους:
Έγραψα το streamline_config.pl πριν πολλά χρόνια (2005) καθώς ανέπτησσα τον πυρήνα linux σε πολλούς υπολογιστές και έπρεπε να μειώσω τον χρόνο μεταγλώττισης του. Δεν είχα χρόνο να ψάχνω ποιους drivers (modules) χρειάζομαι για κάθε μηχάνημα και ποια όχι οπότε το να τα απενεργοποιώ από το xconfig ήταν χρονοβόρα διαδικασία.

Κάπου το 2008, στο συνέδριο “Kernel Summit” ( Σύνοδο Κορυφής Linux Kernel ), προέκυψε μια συζήτηση σε ένα βασικό θέμα που μας προβλημάτιζε για χρόνια. Το θέμα λοιπόν ήταν ότι όταν κάποιος αναφέρει ένα bug σε κάποιο κομμάτι του πυρήνα και ο κύριος προγραμματιστής του συγκεκριμένου έργου ζητάει από το χρήστη που αναφέρει το bug να εκτελέσει μια ανασκόπηση στο git  για να βρει την αλλαγή στον κώδικα που προκαλούσε το πρόβλημα, ο χρήστης ήταν απρόθυμος. Πως να μην ήταν άλλωστε αφού διέθετε μόνο ένα αρχείο config που προερχόταν από την διανομή του και δεν γνώριζε αρκετά για το πως να του αφαιρέσει όσα module δεν είναι απαραίτητα. Σκεφτείτε ότι μια ανασκόπηση στο git  συνήθως διαρκεί 13 πλήρεις μεταγλωττίσεις του πυρήνα !. Αυτό θα μπορούσε να πάρει μια εβδομάδα για κάποιον με ένα παλιό μηχάνημα και ένα config που έρχεται από μια διανομή.
Τότε είναι που ο Linus Torvalds τα’χασε και άρχισε να ουρλιάζει στους προγραμματιστές, ρωτώντας γιατί δεν έχουμε κάτι που μπορεί να τακτοποιήσει και να πετσοκόψει το config για να επιταχύνει την μεταγλώττιση του πυρήνα για τους απλούς χρήστες. Ένας από τους προγραμματιστές τότε, που χρησιμοποιεί το streamline_config.pl που είχα γράψει, απάντησε λέγοντας «Εμείς το κάνουμε με το streamline_config  του Steve Rostedt». Ο Linus, στη συνέχεια εκνευρισμένος, ρώτησε γιατί δεν είναι ήδη ενσωματωμένο στον πυρήνα. Έτσι κατέληξε στον πυρήνα…

Τι μας προσφέρει το LocalModConfig;

Οι περισσότεροι δεν θέλουν να αρκεστούν με το να δηλώσουν απλά τον επεξεργαστή τους και να επωφεληθούν πλήρως από τις δυνατότητες του. Πολλοί θέλουν να εξειδικεύσουν μέχρι “αηδίας” τον πυρήνα τους σύμφωνα με τις προδιαγραφές του υπολογιστή τους. Με άλλα λόγια θέλουν ο πυρήνας τους να είναι κομμένος και ραμμένος αλλά και να διαθέτει drivers μόνο για τις συσκευές που διαθέτει ο υπολογιστής τους.

Αν δείτε με το xconfig για πόσα πράγματα διαθέτει το Linux drivers θα εκπλαγείτε. Χιλιάδες  modules τα οποία ποτέ δεν θα τα χρειαστείτε. Βέβαια αυτά τα modules δεν πρόκειται να ενεργοποιηθούν ποτέ αν δεν έχετε συσκευές που τις χρειάζονται οπότε και έτσι να τα αφήσετε δεν θα έχετε κανένα πρόβλημα.

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

Αν όμως το προσπαθήσετε να το κάνετε χειροκίνητα στο xconfig και βγάζετε ένα-ένα τα στοιχεία που δεν υπάρχουν στον υπολογιστή σας τότε θα έρθει η Δευτέρα Παρουσία και ακόμα δεν θα έχετε τελειώσει!
Εδώ λοιπόν θα επιστρατεύσουμε το εργαλείο που θα σκανάρει τον υπολογιστή μας, θα δει ποιες συσκευές διαθέτουμε, ποιες περιφερικές συσκευές έχουμε συνδεδεμένες και έτσι θα ενεργοποιήσει μόνο αυτά τα στοιχεία στον πυρήνα μας. Το αποτέλεσμα θα είναι:

  • Δραματική μείωση του χρόνου μεταγλώττισης
  • Ένας πυρήνας αποκλειστικά φτιαγμένος για τον υπολογιστή μας

Προϋποθέσεις επιτυχίας

Υπάρχει μόνο μια προϋπόθεση για να έχετε έναν απροβλημάτιστο πυρήνα. Πριν κάνετε οτιδήποτε

  • Συνδέστε στον υπολογιστή σας όλες τις συσκευές που έχετε (usb stick, εξωτερικοί σκληροί, webcam, scanner, εκτυπωτές κλπ…. )
  • Σιγουρευτείτε ότι όλα δουλεύουν.
  • Μην ξεχάσετε καμία συσκευή !

Το τελευταίο είναι σημαντικό… γιατί και εγώ την έπαθα… ξέχασα να συνδέσω ένα μικρό usb stick που είχα (2GB FAT32) με αποτέλεσμα όταν τελείωσα με την μεταγλώττιση και εγκατάσταση του πυρήνα, όταν σύνδεσα το usb stick (το χρειάστηκα κάποια στιγμή) δεν το αναγνώριζε ο πυρήνας μου. Γιατί συνέβη αυτό;

Μα πολύ απλά διότι το LocalMod κοιτάει μόνο τα module που είναι φορτωμένοι την στιγμή που το τρέχετε και έτσι ενεργοποιεί τα αντίστοιχα στον πυρήνα πριν την μεταγλώττιση. Άρα συμβουλή

  • Μην ξεχάσετε καμία συσκευή
  • Ελέγξτε στο xconfig ότι δεν ξέφυγε κάποιος driver ( module ) που χρειάζεστε (όπως π.χ έπρεπε να ελέγξω την υποστήριξη για fat/fat32 συστήματα αρχείων)

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

Αν λοιπόν είστε σίγουροι ότι ΔΕΝ πρόκειται να αγοράσετε νέα συσκευή τότε συνεχίστε. Αν όμως πρόκειται να συνδέσετε κάποια συσκευή στο άμεσο μέλλον ή δεν είστε σίγουροι αν θα συνδέσετε ποτέ κάποια συσκευή τότε
παραμείνετε σε αυτά που μάθατε στο άρθρο 10 βήματα για να μεταγλωττίσετε τον πυρήνα

Όσοι είστε σίγουροι λοιπόν ξεκινάμε…

Είμαστε στο 5 βήμα και έχουμε αντιγράψει το .config απο τον πυρήνα της διανομής μας. Η εντολή που θα τρέξουμε είναι :

make localmodconfig

Αυτό θα εξετάσει αυτόματα το αποτέλεσμα της εντολής lsmod, για να δει τις συσκευές του υπολογιστή, έπειτα θα ελέγξει τα module που είναι σε λειτουργία εκείνη τη στιγμή, θα τα αντιπαραβάλει με τον πυρήνα που πρόκειται να μεταγλωττίσετε, θα ενεργοποιήσει μόνο αυτά που χρειάζεστε και τέλος θα αντικαταστήσει το .config με νέες ρυθμίσεις.

Αυτό ήταν, πλέον έχετε ένα νέο .config αρχείο και συνεχίζετε στο Βήμα 6 όπου τρέχετε

make xconfig

Κάποιες τελευταίες σκέψεις…

Κάτι που πρέπει να γνωρίζετε είναι ότι υπάρχει περίπτωση αφού φτιάξατε τον πυρήνα σας η διανομή να εμφανίσει ενημερώσεις λογισμικού. Δεν είναι σπάνιο αλλά το Ubuntu λαμβάνει μια φορά το 2μηνο αναβαθμίσεις του πυρήνα. Σε αυτή την περίπτωση μόλις εγκατασταθούν οι αναβαθμίσεις και κάνετε επανεκκίνηση θα δείτε ότι ο πυρήνας σας είναι εκεί αλλά θα είναι κάτω από την αναβαθμισμένη έκδοση. Σε αυτή την περίπτωση έχετε 3 επιλογές

  1. Ξανακάνετε τα 10 βήματα με τον αναβαθμισμένο πυρήνα
  2. Δεν κάνετε τα βήματα αλλά κλειδώνετε (από το Synaptic Package Manger) την έκδοση του πυρήνα που έχετε φτιάξει για να μην λαμβάνετε αναβαθμίσεις
  3. Παρατάτε τα όπλα και συνεχίζετε να χρησιμοποιείτε τον αναβαθμισμένο πυρήνα της διανομής σας και δεν ξανά ασχολείσθε με το άθλημα.

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

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

Advertisement

15 σκέψεις σχετικά με το “Kernel Optimization: Αυτόματη δημιουργία βελτιστοποιημένου πυρήνα

Add yours

  1. Αυτό με το localmodconfig μπορεί να δίνει boost αλλά έχει και αρκετά κακά από ότι καταλαβαίνω! Φαντάζομαι πώς για κάθε νέα αλλαγή που θα κάνουμε στο υλικό μας θα πρέπει να κάνουμε αυτή την διαδικασία. Και όταν λέω για αλλαγή αυτό μπορεί να είναι ακόμα και το να βάλουμε το flash disk του φίλου μας για να πάρουμε ένα αρχείο!
    Πέρα από αυτό τα άρθρα σου σκίζουν και δεν παίζουν τέτοιες πληροφορίες ούτε στα ubuntu forums.
    Συνέχισε την καλή δουλειά!

    1. Όχι απλως έπρεπε να ενεργοποιησω την υποστήριξη του fat/fat32… που είναι και τα περισσότερα sticks διαμορφωμένα, η να μην ξεχάσω να το εχω συνδεδεμένο.
      Να φανταστείς εχω έναν μεγάλο εξωτερικό δίσκο διαμορφωμενο σε NTFS και τον είχα συνδεδεμένο. Οπότε αν μου έφερνε κάποιος άλλος έναν εξωτερικό δίσκο με την ίδια διαμόρφωση δεν θα υπήρχε πρόβλημα. Αν όμως μου έφερνε μι; web cam τότε εννοείται ότι δεν θα δουλεύει…. όμως πρέπει να αναλογιστείς το πόσες φορές σου φέρνουν τέτοιες συσκευές ?
      Βεβαίως με το localmodconfig επειδή πετάει έξω πολύ σαβούρα , η υπόθεση μεταγλώττισης είναι 10 λεπτά υπόθεση για μένα….
      Το σίγουρο είναι ότι μετά από 5~6 μεταγλώττισης εσείς μάθει όλες τις συσκευές σου απέξω κι ανακατωτά οπότε σου είναι δεύτερη φύση και εν τέλη το βάζεις να γίνει όταν φτιάχνεις τον καφέ σου :)

  2. Πολύ καλό αρθρο όπως και τα προηγούμενα. Σε ευχαριστούμε πολύ για όλα. Η δική μου ερώτηση είναι γιατί να τρέξουμε κατόπιν το xconfig αφού έχουμε ήδη φτιάξει το νέο .config

    1. Σωστή ερώτηση! Ο λόγος είναι ότι δεν πρόκειται να δηλώσει αυτόματα το μοντέλο του επεξεργαστη σου διότι το generic είναι και αυτό συμβατό με αυτό.
      Ο δεύτερος λόγος είναι να ελέγξει ότι δεν αφαίρεσε κάποιον driver που χρειαζόταν να έχεις όπως την έπαθα εγώ :)

  3. Μην λεμε τα ιδια παλι…αν ημασταν στα 80's θα ειχα την αφισα σου διπλα απο των Michael Jackson, Jordan, Kiss και Iron Maiden (ολα μαζι!).

  4. Δεν μου βρισκει την εντολη sudo localmodconfig
    οταν παταω make localmodconfig μου βγαζει μηνυμα οτι το nvidia config not found.
    κανει restart config
    αρχιζει και με ρωταει κατι για touchscreens και GPIO expanders και απαντω…
    μου πεταει μηνυμα μετα οτι γραφει στο .config

    παντως το localmodconfig σαν εντολη δεν το βρισκει…

    Ubuntu 10.04 με τον πυρηνα 2.6.32-29-….-pae

    ξερεις τιποτα στα γρηγορα η να ανοιξω θεμα στο φορουμ να το συζητησουμε;

    1. Δν πειράζει για το NVIDIA που σου λέει ότι δεν το βρηκε. Αυτό είναι λογικό αφού ο driver είναι κλειστού κώδικα και δεν υπάρχει στον πυρήνα. Θα μπει ο driver αφού φορτώσει ο kernel. Φυσιολογικά ο κλειστού κώδικας driver θα αντιληφθεί τον κερνελ σου και θα δημιουργήσει αυτόματα το module.
      Η εντολή που έτρεξε είναι σωστή. make localmodconfig

  5. Παιδιά χίλια συγνώμη κατά λάθος έγραψα sudo localmodconfig. Η σωστή εντολή είναι make localmodconfig.
    Θα διορθώσω την εντολή στο κείμενο μόλις εχω πρόσβασβ;ση στο λαπτοπ μου. Και πάλι συγνώμη παιδιά.

  6. παρολλο που ειχα ολες τις συσκευες συνδεδεμενες τελικα δεν κρατησε ολα τα modules.
    Δεν μου κρατησε την καμερα του lap-top,
    δεν μου κρατησε ουτε μια usb web-camera της HP (ID 03f0:8d07 Hewlett-Packard).

    Οποτε μεχρι να μαθω ακριβως (μακαρι να βρω τον χρονο) να εντοπιζω τα modules που χρειαζομαι μαλλον δεν μπορω να χρησιμοποιησω αυτο το εργαλειο…και κοιταξα να ηταν τσεκαρισμενα τα κουτακια τους στο xconfig (αληθεια γιατι εχει και [*] και [τικ σαν ν] σαν επιλογη; τελικα τι βαζουμε;

    Το αλλο που μου εκανε εντυπωση ειναι οτι τελικα δεν φανηκε να μου ξανακανει εγκατασταση του κλειστου οδηγου της nVidia οπως οταν πρωτοεβαλα τα Ubuntu…και ομως ειναι εκει διοτι οταν παω να συνδεσω εξωτερικο monitor με ρωταει και με πεταει στον οδηγο του "κατασκευαστη" (γιατι αυτος που χρησιμοποιω κανονικα δεν υποστηριζει τις απαραιτητες προεκτασεις για δευτερη οθονη).

    οι πειραματισμοι θα συνεχιστουν…

    1. "τα κουτακια τους" εννοω ενα σημειο που ελεγε για usb devices. τα εβαλα σχεδον ολα.

    2. [*] = module,
      [v] = built in,
      []= deactivated.

      Όλες οι εξωτερικές συσκευές μπορούν να είναι [*] module, αλλά o επεξεργαστής για παράδειγμα δεν μπορεί να είναι [*] module αλλά [v] built-in

      Το τι θα είναι module και τι όχι είναι μεγάλη κουβέντα…. όσο και οι επιλογές που έχει το xconfig. :)

      Στο θέμα του Nvidia, απλά το έκανε αθόρυβα και δεν σε ρώτησε τίποτα. Όταν γίνεται αναβάθμηση ο πυρήνας ή βάζεις κάποιο δικό σου όλοι οι εξωτερικοί drivers ξαναγίνονται αυτόματα εγκατάσταση. Αυτό είναι καλό :P

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

    1. Ναι φυσικά, απλά δεν θα χρησιμοποιήσεις την LocalModConfig. Υπάρχει βέβαια και μια άλλη τεχνική που χρησιμοποιεί μια βάση δεδομένων με τις συσκευές που έχεις συνδέσει (θυμάται με λίγα λόγια), αλλά δεν θα μπορέσω να σε βοηθήσω μιας και δεν το ασκώ πλέον το «άθλημα»

  8. Ευχαριστώ για τήν σύντομη ανταπόκριση. Κρίμα που ανακάλυψα την σελίδα με τόσα χρόνια καθυστέριση!

Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση /  Αλλαγή )

Σύνδεση με %s

Ο ιστότοπος χρησιμοποιεί το Akismet για την εξάλειψη των ανεπιθύμητων σχολίων. Μάθετε πως επεξεργάζονται τα δεδομένα των σχολίων σας.

Create a website or blog at WordPress.com

ΠΑΝΩ ↑

Αρέσει σε %d bloggers: