Παρασκευή, 12 Δεκεμβρίου 2008

Επαναμεταγλώττιση πυρήνα

/*Warning:: Ο συγκεκριμένος οδηγός απευθύνεται σε ορισμένα σημεία στο Debian. Ίσως να δουλεύει και σε Ubuntu αλλά δεν έχει δοκιμαστεί. Επίσης η γενική ιδέα του καλύπτει όλες τις διανομές. Αν κάποιος το δοκιμάσει ας μου πει το αποτέλεσμα. :-) */

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

Αν και δεν είναι τόσο δύσκολη διαδικασία, θέλει πολύ προσοχή γιατί είναι αρκετά εύκολο να κάνετε το pc σας να μην εκκινεί (Kernel Panic). Βέβαια υπάρχει τρόπος να το επαναφέρεται απλά επιλέγοντας στον grub τον προηγούμενο kernel.

Ξεκινάμε με κάποια βασικά. Πρέπει πρώτα να κατεβάσουμε το source του πυρήνα που θέλουμε να εγκαταστήσουμε. Αυτό στο Debian μπορεί να γίνει είτε ψάχνοντας από το synaptic/adept το πακέτο linux-source-2.6.x (όπου x, η έκδοση που υπάρχει στα repositories), είτε κατεβάζοντας τον τελευταίο πυρήνα από το www.kernel.org με την εντολή (αυτή τη στιγμή η τελευταία έκδοση είναι η 2.6.27.8) :

#cd /usr/src
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.8.tar.bz2

Στη συνέχεια αφού έχουμε κατεβάσει τον κώδικα, τον κάνουμε extract

# tar -xjvf /usr/src/linux-ekdosi_pyrina.tar.bz2 -C /usr/src

Υστερα πάμε στο directory που έχουμε κάνει το extract

#cd /usr/src/linux-ekdosi_pyrina

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

CONFIG_EXT3_FS=m
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
# CONFIG_EXT4DEV_FS is not set
CONFIG_JBD=m

Οπότε, αν ακόμα δεν έχουμε εμπειρία πάνω στο recompiling του πυρήνα, θα ήταν καλό να δημιουργήσουμε το .config του τρέχοντος πυρήνα, ώστε να είμαστε σίγουροι ότι κάποιες κύριες ρυθμίσεις όπως τα filesystems, θα είναι σωστά ρυθμισμένες. Έτσι έχουμε περισσότερες πιθανότητες να καταλήξουμε με έναν πυρήνα που στο τέλος θα δουλεύει :-)
Για να το δημιουργήσουμε απλά τρέχουμε:

#make oldconfig

Στη συνέχεια κάνουμε

#make menuconfig


ώστε να ανοίξει το menu με τις επιλογές του πυρήνα μας, με ποιο “γραφικό” τρόπο. Για να κινηθείτε μέσα σε αυτό τo menu χρησιμοποιήστε τα βελάκια. Οι αλλαγές που μπορείτε να κάνετε σε κάθε ρύθμιση είναι είτε να φορτώνεται built-in (*) στον πυρήνα, είτε ως module (Μ) είτε καθόλου ( ). Built-in εννοούμε ότι ο μεταφρασμένος κώδικας τις κάθε επιλογής, θα είναι ενσωματωμένος μέσα στον kernel, ενώ με το module εννοούμε ότι ο μεταφρασμένος κώδικας τις κάθε επιλογής θα είναι διαθέσιμος να φορτώθει όποτε τον χρειαστεί το λειτουργικό ή εμείς με την εντολή modprobe. Για να κάνουμε αλλαγές στα (Μ),(*),( ) απλά πατάμε το space.

Όπως είπαμε και πιο πάνω, οι αλλαγές που θα κάνετε πρέπει να είναι με σύνεση. Και η λογική που επικρατεί για να μην έχουμε προβλήματα, είναι ότι αφαιρούμε λίγα πράγματα κάθε φορά, ώστε σε περίπτωση προβλήματος, να ξέρουμε τι το προκάλεσε. Θα πρέπει να ξέρετε πολύ καλά το hardware του υπολογιστή σας, ώστε να ρυθμίσετε να φορτώνονται μόνο οι απαραίτητοι drivers, το chipset της μητρικής και άλλα διάφορα. Για να δείτε αναλυτικά το hardware σας, τρέξτε την lspci.

Οταν τελειώσετε με ότι αλλαγές κάνατε, πατήστε exit μέχρι να δείτε αυτή την ερώτηση

Do you wish to save your new kernel configuration?

Και πατήστε Yes.

Τώρα είστε έτοιμοι να κάνετε compile τον πυρήνα!

Τρέχουμε:

#make
για να φτιάξει τις built-in ρυθμίσεις,

#make modules && make modules_install

για να φτιάξει τα modules.

Θα πάρουν αρκετή ώρα (ειδικά το make), αλλά μόνο την πρώτη φορά. Μετά ότι αλλαγές κάνετε θα γίνονται compile μόνο αυτές.

Εάν οι αλλαγές που κάνετε μετά την πρώτη φορά αφορούν μόνο modules, μπορείτε να παραλείψετε το make. Ομώς αν μια ρύθμιση ήταν πρώτα (*) και την κάνατε (M) δε μπορείτε να παραλείψετε κάποιο από τα παραπάνω βήματα.

Έπειτα σε Debian κάνουμε:

#make install

ώστε να γίνουν κάποιες απαραίτητες ρυθμίσεις.

Στην συνέχεια, μεταφερόμαστε στο boot directory και δημιουργούμε το initrd.img, το οποίο φορτώνει στην αρχή της εκκίνησης βασικά στοιχεία του λειτουργικού. Κάνουμε

#cd /boot
#mkinitramfs -o initrd.img-2.6.x 2.6.x

Τέλος κάνουμε ένα

#update-grub

ώστε ο grub να ενημερωθεί για τις αλλαγές που κάναμε. Είσαστε έτοιμοι για επανεκκίνηση τώρα! Υπόψιν ότι στο grub θα δείτε πολλές επιλογές. Πολύ πιθανό ο kernel που φτιάξατε να μην είμαι ο πρώτος στη σειρά. Θα καταλάβετε ποιος είναι ο kernel ανάλογα με την αριθμό της έκδοσης που θα φαίνεται.

Αν όλα πάνε καλά και ο υπολογιστή σας εκκινήσει, μπορείτε να κάνετε και άλλες αλλαγές χωρίς να τρέχετε τα, mkinitramfs και update-grub. Αν έχετε κάποιο πρόβλημα (κοινώς kernel panic), κρατείστε ακριβώς το μήνυμα λάθους σας και μερικές σειρές πριν ώστε να μπορείτε να το ψάξετε στο google. Κάντε επανεκκίνηση και επιλέξτε τον προηγούμενο kernel.

Επίσης αν δε σας βολεύει το νέο menu του grub με όλους τους kernels που θα εμφανιστούν, μπορείτε είτε να σβήσετε ότι δε χρειάζεται από το /boot (ΔΕΝ συνίσταται σε νέους χρήστες γιατί αν σβήσετε κάτι που δε πρέπει θα έχετε πολλά προβλήματα) είτε να κάνετε

#nano /boot/grub/menu.lst

και να αλλάξετε εκεί το τι θα φαίνεται στο menu.

Happy recompiling :-)