Σε προηγούμενο άρθρο εξετάσαμε πως μπορούμε να μεταγλωττίσουμε (compile) ένα πρόγραμμα από τον πηγαίο κώδικά του για να το βελτιστοποιήσουμε και να μειώσουμε τους πόρους του συστήματος που καταναλώνει. Έπειτα είδαμε την “άγρια πλευρά του Ubuntu”, όπου χτίσαμε το λειτουργικό μας ξεκινώντας από 15 MB και βάλαμε μόνο όσα χρειαζόμαστε. Μπορείτε να διαβάσετε τα προηγούμενα δύο άρθρα αν ενδιαφέρεστε να εκμεταλλευτείτε στο έπακρο το hardware σας όπως κάνουν οι χρήστες Gentoo και Arch.

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

Θεωρία.

Θα σκεφτεί κανείς γιατί να μεταγλωττίσουμε τον πυρήνα; Υπάρχει κάποιος σοβαρός λόγος ; Το σύστημά μου είναι πολύ δυνατό, γιατί να μπω στον κόπο; Η απάντηση είναι απλή:

Δεν χρειάζεται να κάνετε τίποτα.

Τότε προς τι αυτή ταλαιπωρία; Γιατί να το κάνουμε; Η απάντηση και εδώ είναι απλή:

Γιατί μπορούμε!

Ας δούμε μερικές αλήθειες και ο καθένας ας κρίνει με βάση την προσωπική του εμπειρία. Το Linux ουσιαστικά είναι ένας modular-monolithic kernel. Σε απλά ελληνικά αυτό σημαίνει ότι ο πυρήνας (kernel) είναι ένα μεγάλο, αυτόνομο και ενιαίο πρόγραμμα (monolithic) που ελέγχει όλο το υλικό και τις διεργασίες του υπολογιστή μας και αναγνωρίζει/διαχειρίζεται το hardware μας ενεργοποιώντας οδηγούς (modules) που σε άλλα λειτουργικά ονομάζονται drivers.

Λόγο αυτής της φύσης του το Linux δεν χρειάζεται CD με Drivers για να αναγνωρίζει το υλικό του υπολογιστή μας. Μόλις συνδέσουμε στον υπολογιστή μας, ας πούμε μια WebCam, αμέσως την αναγνωρίζει χωρίς να μας ζητάει CD με τους Driver.

Επομένως καταλαβαίνετε ότι ο Linux πυρήνας, που έρχεται με την διανομή μας, περιέχει drivers και κώδικα που μπορεί να καλύψει μια ευρεία γκάμα υλικών και συσκευών. Με την μεταγλώττιση του πυρήνα μπορούμε να πούμε στον πυρήνα τι υλικό έχουμε ακριβώς και τι δεν χρειαζόμαστε. Το αποτέλεσμα θα είναι να αποκτήσουμε ένα λιτό Linux (πυρήνας) που έχει “κατασκευαστεί” με τις προδιαγραφές του υπολογιστή μας. Με άλλα λόγια είναι λες και φτιάχτηκε αποκλειστικά για εμάς. Εμείς όμως, για να μην τρομάξουμε τους αρχάριους φίλους μας στο παρόν οδηγό θα πούμε στον πυρήνα να κάνει ένα μόνο πράγμα:

“Έχω επεξεργαστή Intel i7Quad-Core [εσείς θα του πείτε τον δικό σας] και θέλω να γίνεις super-duper για αυτό τον επεξεργαστή οκ;;; το κατάλαβες ;;;”

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

Οπότε πριν ξεκινήσουμε υπάρχουν κάποιες προαπαιτούμενα που πρέπει να πληρείτε για να συνεχίσουμε:

  • Πολύ ελεύθερο χρόνο!
  • Μια φραπεδιά στο τραπέζι
  • Μουσικούλα στον υπολογιστή
  • Να είστε μόνος/μόνη (διώξτε γυναίκα/άντρα, παιδιά, σκυλιά, γατιά…)
  • Ένα τερματικό ανοιχτό (Εφαρμογές –> Βοηθήματα –> Τερματικό)

Σημείωση: Ο παρόν οδηγός είναι εφαρμόσιμος σε Ubuntu/Kubuntu 10.10, 10.04 και 9.10. Δεν θα χρησιμοποιήσουμε κάποια νέα έκδοση πυρήνα αλλά την έκδοση που έχουμε ήδη στο σύστημα μας. Ο λόγος είναι πολύ απλός: Ο πυρήνας που έχουμε απλά δουλεύει οπότε ξέρουμε ότι αν κάτι πάει στραβά θα φταίει κάποια λάθος επιλογή που κάναμε και όχι επειδή είναι ασύμβατος με το σύστημά μας. Οι πιο θαρραλέοι μπορούν να κατεβάζουν πακέτα DEB με νέες εκδόσεις πυρήνα για το Ubuntu από εδώ http://kernel.ubuntu.com/~kernel-ppa/mainline/. Απλά όσοι είστε αρχάριοι παρακαλώ μην κατεβάζετε από εκεί και ακολουθείστε πιστά τις οδηγίες που δίνω στο παρόν οδηγό. Τέλος αυτός ο οδηγός είναι “Idiot proof” αλλά όπως και να έχει προσέξετε τι πληκτρολογείτε στο τερματικό διότι τις περισσότερες φορές θα χρησιμοποιούμε “sudo” πράγμα που μας δίνει όλες τις “δυνάμεις” για να καταστρέψουμε το έργο μας :)

Βήμα 1

Πριν ξεκινήσετε κάντε ελέγξτε αν έχουν βγει αναβαθμίσεις του συστήματος σας και εγκαταστήστε τα (Σύστημα –> Διαχείριση Συστήματος –> Ενημερώσεις Συστήματος).

Έπειτα θα χρειαστούμε το μοντέλο του επεξεργαστή έχουμε. Για να το δούμε ανοίγουμε την “Παρακολούθηση Συστήματος” (Σύστημα –> Διαχείριση Συστήματος –> Παρακολούθηση Συστήματος) και διαλέγουμε την καρτέλα “Σύστημα”. Εκεί στο “Υλικό” θα δούμε το μοντέλο του επεξεργαστή μας.

system-monitor-cpu-model.jpg

Βημα 2

Αφού τελειώσετε ανοίγετε το τερματικό (Εφαρμογές –> Βοηθήματα –> Τερματικό) και το πρώτο πράγμα που κάνουμε είναι να εγκαταστήσουμε κάποιες βιβλιοθήκες που είναι απαραίτητες για να συνεχίσουμε.

sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile
kernel-package libncurses5 libncurses5-dev libqt3-mt-dev

Βήμα 3

Σε αυτό το βήμα θα κάνουμε εγκατάσταση τις εξαρτήσεις του πυρήνα μας. Το “$(uname -r)” στο τέλος της εντολής αναγνωρίζει την έκδοση του πυρήνα που έχουμε στο σύστημά μας και κάνει αυτόματα εγκατάσταση τις εξαρτήσεις του.

sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)

Βήμα 4

Μετά από λίγη ώρα είμαστε έτοιμοι να “στρώσουμε” το χαλί στο οποίο θα παίξουμε! Με τις παρακάτω εντολές θα δημιουργήσουμε ένα φάκελο με όνομα “source”, θα μπούμε μέσα σε αυτό τον φάκελο και θα κατεβάσουμε τον πηγαίο κώδικα του kernel (περίπου 100 ΜΒ) που είναι ίδιος με του συστήματος μας.

mkdir ~/source
cd ~/source
apt-get source linux-image-$(uname -r)

Βήμα 5

Έχουμε κατεβάσει τον πηγαίο κώδικα οπότε θα μπούμε μέσα στον φάκελο του και εκεί θα αντιγράψουμε τις ρυθμίσεις (config-Ekdwsh) που έχει ο πυρήνας του συστήματος μας. Αυτό το κάνουμε για να δουλέψουμε επάνω σε ρυθμίσεις που ξέρουμε ότι δουλεύουν. Αν δεν δούλευαν δεν θα είχαμε Ubuntu στο σύστημά μας :P

cd linux-x.x.x
cp -vi /boot/config-`uname -r` .config

Όπου χ.χ.χ είναι η έκδοση του φακέλου. Μπορείτε να γράψετε μόνο “cd linux-” και μετά να πατήσετε “TAB” για να συμπληρώσει αυτόματα τον αριθμό. Πρέπει να ξέρετε οτι κανένας δεν ξέρει απέξω όλες τις εντολές που υπάρχουν στο Linux. Απλά γράφουν μερικές γραμμές π.χ. “apt-g” και μετά πατάνε “TAB” για να δούνε τις επιλογές που έχουν. Αυτή η συμβουλή είναι το μυστικό για να μάθετε το να δουλεύετε το τερματικό.

Bonus Experts Option

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

make localmodconfig

Μην τολμήσετε να εκτελέσετε την παραπάνω εντολή χωρίς να έχει διαβάσει το σχετικό άρθρο γιατί θα τα κάνετε μαντάρα !.

Βήμα 6

Σε αυτό το βήμα πρέπει να προσέξουμε πάρα πολύ και να μην το παίξουμε ήρωες. Σε αυτό το βήμα είναι η απόλυτη δύναμη του Linux. Με ένα γραφικό περιβάλλον που θα εμφανιστεί θα έχουμε μπροστά μας όλους τους Driver και τις παραμέτρους του πυρήνα. Οι πιο έμπειροι, από αυτό εδώ το σημείο ξεκινάνε και αφαιρούν ότι δεν χρειάζονται. Πρέπει να αναφέρω ότι οι κορυφαίοι σε αυτό το σημείο είναι οι έμπειροι χρήστες της διανομής GENTOO. Ξέρουν το κάθε συστατικό μοντέλο του υπολογιστή τους (ξεπερνάνε τα 100 σε αριθμό) και βάζουν μόνο αυτά. Έτσι ο πυρήνας τους είναι τόσο μικρός ώστε να χωράει στην L2 cache μνήμη του επεξεργαστή τους. Εμείς όμως δεν θα μπούμε σε αυτά τα μονοπάτια διότι, ολόκληρο βιβλίο θα χρειαστεί να γραφτεί για τις επιλογές που μπορούμε να πειράξουμε. Το μόνο που θα κάνουμε είναι να δηλώσουμε το μοντέλο του επεξεργαστή μας. Οπότε δώστε:

make xconfig

Μόλις φορτώσει το γραφικό περιβάλλον πηγαίνετε στο “Processor type and feature” . Δεξιά αν κατεβείτε παρακάτω θα βρείτε την επιλογή “Processor family”. Εκεί λογικά θα δείτε να είναι επιλεγμένο το “Generic”. Θα πρέπει να επιλέξετε αυτό που αντιστοιχεί στο μοντέλο του επεξεργαστή σας. Εγώ για παράδειγμα έχω τον επεξεργαστή Intel i7 Quad Core άρα διαλέγω την επιλογή “Core 2/newer Xeon”. Αν πάλι δεν είστε σίγουροι για το τι να επιλέξετε, πείτε μου το μοντέλο του επεξεργαστή σας και θα σας πω τι να επιλέξετε.

xconfig-kernel-compiling.jpg

Αφού τελειώσετε με την επιλογή του μοντέλου, πατάτε “Save” και κλέινετε το παράθυρο.

Μόλις κλείσει το παράθυρο, θα ορίσουμε το πόσες διεργασίες ταυτόχρονα θα εκτελούνται κατά την διάρκεια της μεταγλώττισης για να επιταχύνουμε τη δουλειά μας. Αυτό το κάνουμε επειδή οι σημερινοί επεξεργαστές είναι ικανοί να τρέχουν παράλληλες διεργασίες και όχι μια κάθε φορά. Ο αριθμός που θα βάλετε διπλα από το “=” αντιστοιχεί στον αριθμό των επεξεργαστών/πυρήνων επί 2, που έχει ο υπολογιστής σας αυξημένο κατά μια μονάδα. Π.χ. αν έχουμε μονοπύρηνο τότε βάζουμε 3, αν έχουμε διπλοπύρηνο τότε βάζουμε 5, αν έχουμε τετραπύρηνο βάζουμε 9 κλπ. Ο γενικός τύπος είναι Ν=(cores x 2)+1. Εγώ που έχω τετραπύρηνο επεξεργαστή επέλεξα να βάλλω 9 παράλληλες διεργασίες.

export CONCURRENCY_LEVEL=9

Βήμα 7

Εδώ ξεκινάει η μεταγλώττιση. Με τις παρακάτω εντολές θα καθαρίσουμε λίγο τον κώδικα:

make-kpkg clean

έπειτα θα μεταγλωττίσουμε τον πυρήνα και θα δημιουργήσουμε δυο πακέτα DEB με την έκδοση του να γράφει “turbo” ώστε να τον ξεχωρίζουμε από τον πυρήνα που έρχεται με την διανομή μας:

fakeroot make-kpkg --initrd --append-to-version=-turbo kernel-image kernel-headers

Αφού δώσετε και την παραπάνω “διαταγή”, σηκωθείτε και αφήστε τον υπολογιστή σας στην ησυχία του να τελειώσει και επιστρέψτε μετά από 2-3 ώρες. Στο σύστημά μου (i7QuadCore) για να ολοκληρωθεί η διεργασία χρειάστηκαν περίπου 2 ώρες.

Βήμα 8

Μόλις τελειώσει η μεταγλώττιση τότε θα δείτε ο κέρσορας στο τερματικό να αναβοσβήνει και να περιμένει την επόμενη “διαταγή” σας (… το καημένο… τι τραβάει από μας!)

Λογικά είμαστε ακόμα μέσα στον φάκελο (linux-2.6.xxx) και θα πάμε έναν φάκελο πιο πάνω

cd ~/source

όπου αν δώσουμε “ls” θα μας δώσει μια λίστα, που μεταξύ άλλον θα δούμε και τα δυο πακέτα DEB linux-image-2.6.x.x.x.x.x και linux-headers-2.6.x.x.x.x.

Μένει λοιπόν να τα κάνουμε εγκατάσταση

sudo dpkg -i linux-image(Πατήστε στο πληκτρολόγιο “TAB” για να το συμπληρώσει).deb
linux-headers-2.6.35.(Πατήστε στο πληκτρολόγιο “TAB” για να συμπληρώσει).deb

Με αυτό τον τρόπο θα εγκαταστήσουμε και τα δυο πακέτα ταυτόχρονα. Το linux-image.2.6x.x.x ακολουθούμενο απο κενό και μετα το linux-headers.2.6x.x.x και πατάμε ΕΝΤΕR.

Βημα 9

Αφού τελειώσετε την εγκατάσταση μένει να δημιουργήσουμε το αρχείο εκκίνησης του συστήματος (initramfs) και να ενημερώσουμε το menu εκκίνησης του συστήματος μας (GRUB) με τον πυρήνα που έχουμε εγκαταστήσει:

sudo update-initramfs -c -k 2.6.35.10-turbo ( <--- εδώ είναι απλά η έκδοση του πυρήνα, που γράφει στο πακέτο DEB,
                                                    μαζι με το όνομα που του δώσαμε εμείς πιο πάνω)

Ενημερώνουμε και τον GRUB για τον δικό μας πυρήνα:

sudo update-grub

Βήμα 10

Κάνουμε επανεκκίνηση τον υπολογιστή μας… Τελειώσαμε… Μόλις ξεκινήσει το σύστημα φορτώσει τον πυρήνα μας. Αν θέλετε να δείτε ότι όλα πήγαν καλά και είμαστε με τον δικό μας πυρήνα ανοίξτε τη ν “Παρακολούθηση Συστήματος” (Σύστημα –> Διαχείριση Συστήματος –> Παρακολούθηση Συστήματος) και διαλέξετε την καρτέλα “Σύστημα”. Εκεί θα δείτε να αναφέρει το ονομα και την έκδοση του πυρήνα μας.

system-monitor-kernel-version.jpg

Σύνοψη

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

sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile kernel-package
libncurses5 libncurses5-dev libqt3-mt-dev

sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)
mkdir ~/source
cd ~/source
apt-get source linux-image-$(uname -r)

cd linux-x.x.x
cp -vi /boot/config-`uname -r` .config

make xconfig

export CONCURRENCY_LEVEL=9
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-turbo kernel-image kernel-headers

cd ~/source

sudo dpkg -i linux-image.xxx.deb linux-headers.xxx.deb
sudo update-initramfs -c -k 2.6.35.10-turbo
sudo update-grub