Μεταγλώττιση (compile) του πυρήνα Linux

Ανώνυμος (χωρίς επαλήθευση) | Κυρ, 06/08/2008 - 22:24 | 28' | 5

Υπάρχει μια φράση που φέρνει τρόμο στους νέους χρήστες Linux, ειδικά όσους φοβούνται να πάνε μακρύτερα από το γραφικό περιβάλλον: “Κάντε recompile στον πυρήνα σας και ...”. Για πολλούς, η μεταγλώττιση (compile) του πυρήνα Linux ισοδυναμεί με το σαφάρι λιονταριών ή παράσημο σε πόλεμο. Θεωρούν ότι το να τρέχουν ένα ολόδικό τους πυρήνα τους κατατάσσει αυτόματα στους hardcore χρήστες. Τίποτε όμως από αυτά δεν ισχύει.

Απεναντίας, το κρίσιμο ερώτημα είναι, γιατί να στήσετε το δικό σας πυρήνα; Και υπάρχουν πάρα πολλοί πιθανοί λόγοι:

* Για να ξεφορτωθείτε περιττά χαρακτηριστικά:
Οι πυρήνες των διανομών συνηθίζουν να υποστηρίζουν ένα κάρο πράγματα που δεν χρειάζεστε, ή δεν έχετε ακούσει καν.

* Για να ενεργοποιήσετε νέα χαρακτηριστικά ή drivers:
Όπως απαιτεί ο Νόμος του Μέρφι, και αντίθετα με ότι είπαμε πριν, το μοναδικό πράγμα που δεν υποστηρίζει ο πυρήνας της διανομής σας είναι το δικό σας hardware...

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

* Για να διορθώσετε τον πυρήνα :
Υπάρχουν διάφορα patches (“μπαλώματα” τμημάτων του κώδικα) που δεν μπήκαν ακόμα στον πυρήνα, και μερικά δεν θα μπουν ποτέ. Εάν θέλετε να έχετε Reiser4 ή κάτι άλλο, θα πρέπει να βάλετε κάποιο patch στον κώδικα και μετά να μεταγλωττίσετε τον δικό σας πυρήνα.

Όπως θα δείτε παρακάτω, η μεταγλώττιση του πυρήνα δεν διαφέρει ουσιαστικά από τη μεταγλώττιση εφαρμογών. Πρώτα τρέχετε το σκριπτάκι ρύθμισης (σαν το ./configure), μετά δίνετε make για τη μεταγλώττιση και τέλος κάνετε το install, την εγκατάσταση. Η βασική διαφορά είναι ότι το στάδιο της ρύθμισης είναι εντελώς αλληλεπιδραστικό. Μια ακόμα διαφορά είναι ότι κάθε φορά που στήνετε ένα νέο πυρήνα, αυτός εγκαθίσταται πλάι στον παλαιότερο, και έτσι αν δεν λειτουργεί, μπορείτε να κάνετε boot από τον παλιό. Εδώ θα βασιστούμε στο Mandriva One 2007.1, αλλά η διαδικασία είναι παρόμοια και στις άλλες διανομές.

Στο ψητό

Κατ' αρχάς, πρέπει να εγκαταστήσετε τον πηγαίο κώδικα του πυρήνα. Θα ξεκινήσουμε, αρχικά, από τον κώδικα που αντιστοιχεί στον πυρήνα που τρέχετε, επειδή αυτός θα έχει ήδη κάποιες ρυθμίσεις, τις οποίες θα πάρουμε ως βάση. Από το διαχειριστή πακέτων της διανομής κατεβάστε το πακέτο με τον κώδικα, που συνήθως λέγεται kernel-source ή linux-source. Στο Mandriva One 2007.1, o πυρήνας βρίσκεται στο πακέτο kernel-2.6.17.13mdv-1-1mdv2007.1, που είναι ήδη εγκατεστημένο, ενώ ο κώδικας του είναι στο kernel-source-2.6.17.13mdv-1-1mdv2007.1, το οποίο εγκαθιστάτε από το Κέντρο Ελέγχου. Για να βρείτε την έκδοση του πυρήνα σας, δώστε σε ένα τερματικό την εντολή uname -r.

Θα πρέπει επίσης να εγκαταστήσετε έναν compiler (μεταγλωττιστή) και τα συναφή εργαλεία (αν δεν εγκατασταθούν με τον πυρήνα). Συνήθως, το GCC αρκεί για να εγκατασταθούν όλα. Κάποιες διανομές διαθέτουν και ειδικά πακέτα με τα εργαλεία ανάπτυξης. Αν έχετε το Ubuntu, π.χ. θα πρέπει να εγκαταστήσετε το πακέτο build-essentials, το οποίο εγκαθιστά όλα τα υπόλοιπα πακέτα που χρειάζεστε.

Στη συνέχεια, θα βρείτε τον κώδικα του πυρήνα στο /usr/src/linux-version, με “συμβολικό δεσμό” (symlink) στο φάκελο /usr/src/linux. Εάν η διανομή σας δεν φτιάξει αυτήν την παραπομπή, ως εξής:

cd /usr/src
ln -s linux-2.6.17-13mdv linux

Επειδή θα βασιστούμε στις υπάρχουσες ρυθμίσεις του πυρήνα, πρέπει να σιγουρευτείτε ότι υπάρχει ένα αντίγραφο του αρχείου ρύθμισης .config στο /usr/src/linux. Εάν δεν το βρείτε εκεί με την εντολή ls -a, θα υπάρχει ένα αντίγραφο του στο φάκελο /boot. Διαφορετικά, δώστε locate .config για να το βρείτε και μετά αντιγράψτε το στο /usr/src/linux. Στη συνέχεια, μπορείτε να ξεκινήσετε τη ρύθμιση του νέου πυρήνα, δίνοντας τις παρακάτω εντολές ως root σε μια κονσόλα (είναι καλό να βάλετε την κονσόλα σε προβολή πλήρους οθόνης).

cd /usr/src/linux
make menuconfig

Θα εμφανιστεί το πρόγραμμα ρύθμισης του πυρήνα. Ρίξτε μια ματιά τριγύρω και δοκιμάστε μερικές από τις επιλογές (η πλοήγηση γίνεται με τα βελάκια του πληκτρολογίου). Αν πατήσετε Exit, θα ερωτηθείτε αν θέλετε να αποθηκεύσετε τις ρυθμίσεις. Εκτός κι αν πείτε Yes, μπορείτε να πειραματιστείτε όσο θέλετε, χωρίς καμία συνέπεια. Οι περισσότερες επιλογές είναι εύγλωττες. Κάθε εγγραφή που τελειώνει σε ‘--->’ οδηγεί σε ένα υπομενού, το οποίο βλέπετε πατώντας Enter. To Exit ουσιαστικά οδηγεί ένα “επιπεδο” πάνω (δηλαδή στο προηγούμενο) και βγαίνει από το πρόγραμμα αν είστε στο πάνω-πάνω επίπεδο. Μπορείτε επίσης να χρησιμοποιείτε απευθείας το πλήκτρο Esc αντί του Exit.

Κάθε επιλογή του πυρήνα βρίσκεται συνήθως σε μία από τρεις καταστάσεις, που υποδηλώνονται με το *, το M
ή τίποτε. Το άστρο * σημαίνει ότι η επιλογή θα είναι built-in, δηλαδή θα ενσωματωθεί στον πυρήνα, το Μ σημαίνει ότι θα μεταγλωττιστεί ως module (αρχείο που θα φορτώνεται όταν ζητηθεί και μόνο) ενώ το κενό σημαίνει ότι η επιλογή θα απενεργοποιηθεί. Μπορείτε να επιλέξετε μία από τις τρεις καταστάσεις με τα πλήκτρα Y, M και N αντίστοιχα, ή να χρησιμοποιήσετε το Space για να πάτε από τη μία κατάσταση στην άλλη. Ένα ακόμα πλήκτρο που θα χρησιμοποιήσετε, ιδιαίτερα τις πρώτες φορές που κάνετε compile, είναι το ?, που εμφανίζει το κείμενο με την τεκμηρίωση της εκάστοτε επιλογής.

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

Κλαδέψτε το δέντρο!

Αφού εξοικειωθήκατε λίγο με τις επιλογές (μη βιαστείτε κιόλας!), είναι καιρός να φτιάξουμε ένα νέο πυρήνα αφαιρώντας πολλές αχρείαστες επιλογές. Πατήστε Esc μέχρι να ερωτηθείτε αν θέλετε να αποθηκεύσετε τις αλλαγές. Πατήστε Νο, μετά ξαναδώστε make menuconfig.

Οι περισσότεροι προμηθευτές συνηθίζουν να βάζουν built in υποστήριξη σχεδόν για το καθετί, προκειμένου οι διανομές τους να τρέχουν σε όσο δυνατόν μεγαλύτερη ποικιλία hardware γίνεται. Γι' αυτό ας ξεκινήσουμε ...χαλώντας όλη τη δουλειά τους και αφαιρώντας τους περιττούς drivers.

Πηγαίνετε στο Device Drivers > Network Device Support > Ethernet (10 or 100Mbit) και θα δείτε ότι όλοι σχεδόν οι drivers δικτύωσης είναι εγκατεστημένοι στον πυρήνα σας, ως module ή built-in. Εσείς όμως χρειάζεστε μόνο έναν ή δύο από αυτούς, γι' αυτό αποεπιλέξτε όλους όσους δεν αντιστοιχούν στο hardware του μηχανήματός σας. Εάν έχετε αμφιβολίες, η εντολή lsmod στην κονσόλα θα σας δείξει όλα τα modules που έχουν φορτωθεί στο Linux σας, ενώ η τεκμηρίωση κάθε επιλογής αναφέρει συνήθως το όνομα του αντίστοιχου module. Κάντε το ίδιο στα υπομενού Ethernet (1000Mbit) και wireless LAN. Μπορείτε επίσης να αφαιρέσετε την υποστήριξη για κάθε κάρτα ήχου και γραφικών που δεν έχετε, αλλά είναι καλύτερο να προχωρήσετε αργά, γι' αυτό αφήστε το αυτό για την επόμενη φορά. Πατήστε Εsc μέχρι να βγείτε από το πρόγραμμα, αλλά τώρα αποθηκεύστε τις αλλαγές.

Τώρα είναι η στιγμή να κάνετε “build”, δηλαδή να “κτίσετε” τον πυρήνα και να τον εγκαταστήσετε με την εντολή
make all modules_install install

Αυτή θα κάνει τρία πράγματα. Πρώτα θα “κτίσει” τον νέο πυρήνα και όλα τα modules, μετά θα εγκαταστήσει τα modules στο /lib/modules/kernel-version, και τέλος θα εγκαταστήσει τον ίδιο τον πυρήνα στο φάκελο /boot. Πριν κάνετε οτιδήποτε άλλο, ελέγξτε ότι ο bootloader, ο διαχειριστής εκκίνησης, είναι σωστά ρυθμισμένος ξεκινά και το νέο αλλά και τον παλιό πυρήνα σας. Όταν τελειώσει, κοιτάξτε στο /boot για να βεβαιωθείτε ότι η make install αντέγραψε το νέο πυρήνα εκεί.

Σε κάποιες διανομές, η make install κάνει πολύ περισσότερα. Για παράδειγμα, οι διανομές που χρησιμοποιούν το σκριπτάκι installkernel του Debian, όπως το Gentoo αλλά και άλλες διανομές με βάση το Debian, δημιουργούν επίσης ένα συμβολικό δεσμό για το νέο πυρήνα στο vmlinuz ενώ για τον παλιό στο vmlinuz.old. Άλλες διανομές, όμως, όπως το Mandriva, απλώς αντιγράφουν τον πυρήνα και τα συναφή αρχεία στο /boot. Για να γλυτώσετε χρόνο, μπορείτε να τρέξετε το παρακάτω script για να δημιουργήσετε τους δεσμούς στο Mandriva:

#!/bin/bash
cd /boot
NEW_KERNEL=$(ls -1rt vmlinuz-* | tail -n 1)
OLD_KERNEL=$(readlink vmlinuz)
NEW_VERSION=${NEW_KERNEL##vmlinuz-}
OLD_VERSION=${OLD_KERNEL##vmlinuz-}
for F in config System.map vmlinuz; do
[ -f “${F}-${NEW_VERSION}” ] && ln -sf ${F}-${NEW_VERSION} ${F}
[ -f “${F}-${OLD_VERSION}” ] && ln -sf ${F}-${OLD_VERSION} ${F}.old
done
[ -f “initrd-${NEW_VERSION}.img” ] && ln -sf initrd-${NEW_ VERSION}.img initrd.img
[ -f “initrd-${OLD_VERSION}.img” ] && ln -sf initrd-${OLD_ VERSION}.img initrd.img.old
[ -x /sbin/lilo ] && /sbin/lilo -v

Τροποποιώντας τις ρυθμίσεις του bootloader, ώστε να υπάρχουν δύο εγγραφές για αυτούς τους συμβολικούς δεσμούς, vmlinuz και vmlinuz.old, θα μπορείτε να ξεκινάτε πάντοτε οποιονδήποτε από τους δύο πυρήνες. Στο GRUB θα πρέπει να προσθέσετε κάτι σαν κι αυτό στο αρχείο /boot/grub/menu.lst:

title Latest kernel
kernel /vmlinuz root=blah... other boot options
title Previous kernel
kernel /vmlinuz.old root=blah... other boot options

Εάν χρησιμοποιείτε το Lilo μπορείτε να κάνετε αντίστοιχες αλλαγές στις ρυθμίσεις του, αλλά θυμηθείτε να τρέξετε την εντολή lilo μετά την εγκατάσταση του νέου πυρήνα. Το installkernel του Debian αλλά και το παραπάνω σκριπτάκι τα κάνουν όλα αυτά αυτόματα.

Παγίδες

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

Υπάρχουν μερικές παγίδες που θα πρέπει να ξέρετε, για να μην πάρετε ένα πυρήνα που δεν ξεκινά. Όταν επιλέγετε ποια συστήματα αρχείων θα συμπεριλάβετε, σιγουρευτείτε ότι το σύστημα αρχείων της root κατάτμησης είναι built in (*) στον πυρήνα και όχι module (δείτε το πλαίσιο “Modules ή Built In;” για περισσότερες λεπτομέρειες). Επίσης, σιγουρευτείτε ότι έχετε προσθέσει υποστήριξη για IDE, SATA ή SCSI chipsets, αν έχετε. Και αυτά πρέπει είναι built in, και όχι module. Οι πυρήνες των διανομών δεν φορτώνουν κρίσιμο κώδικα με modules, επειδή φορτώνουν πολλά πράγματα από το αρχικό ramdisk (initrd). Η διανομή σας έχει πιθανότατα κάποιο initrd αρχείο στο /boot, το οποίο αναφέρεται και στο αρχείο ρύθμισης του bootloader.

Ένα initrd (initial ramdisk) είναι απαραίτητο σε κάθε διανομής γενικού σκοπού. Όπως είπαμε, κάποια πράγματα, όπως οι drivers για τον controller του δίσκου, δεν μπορούν μεταγλωττιστούν ως modules, επειδή τα modules γίνονται διαθέσιμα αφού πρώτα προσαρτηθεί το root σύστημα αρχείων. Από την άλλη, αν καθετί ήταν built-in στον πυρήνα, τότε αυτός ήταν τεράστιος. Γι' αυτό τα σημαντικά modules φορτώνονται σε ένα ramdisk που το Linux προσαρτά στην αρχή ως root σύστημα αρχείων. Μετά, το σκριπτάκι μέσα στο ramdisk φορτώνει τα modules που χρειάζονται, προσαρτά το κανονικό root σύστημα αρχείων, και περνά τον έλεγχο σε εκείνο.

Εάν φτιάχνετε το δικό σας πυρήνα, τότε δεν είναι απαραίτητα όλα αυτά. Μπορείτε να ενσωματώσετε τους drivers μέσα στον πυρήνα (άλλωστε χρειάζεστε συνήθως ένα μόνο ελεγκτή δίσκου και ένα σύστημα αρχείων) και να αφήσετε έξω το 99% των υπολοίπων επιλογών. Η μόνη περίπτωση που θα χρειαστείτε ένα initrd με το νέο πυρήνα σας είναι αν θέλετε να κάνετε κάτι έξυπνο όπως το να τρέχετε το root σύστημα από τόμο LVM ή αν θέλετε μια διαφορετική splash οθόνη στην εκκίνηση.

Επιστροφή στην ουσία, τώρα. Χρησιμοποιήσαμε πριν το make menuconfig για τη ρύθμιση του πυρήνα. Αυτό έχει το πλεονέκτημα ότι δεν χρειάζεται Χ Windows, οπότε μπορείτε να το χρησιμοποιήσετε σε οποιοδήποτε μηχάνημα, ακόμα και μέσω SSH. Υπάρχουν όμως και δύο γραφικά εργαλεία, το make xconfig και make gconfig. Το πρώτο εμφανίζει ένα Qt περιβάλλον ενώ το δεύτερο ένα GTK. Και τα δύο προβάλλουν ένα παράθυρο με πολλά πλαίσια, όπου στο ένα εμφανίζεται η τεκμηρίωση για την τρέχουσα επιλογή, πράγμα χρήσιμο για να μάθετε τι κάνει το καθετί στον πυρήνα. Το Qt GUI έχει επίσης και δυνατότητα αναζήτησης, αν και δεν είναι τόσο καλή όσο η αντίστοιχη στο menuconfig που σας δείχνει και το που βρίσκεται η επιλογή αλλά και τι άλλο πρέπει να ενεργοποιήσετε. Έχετε λοιπόν τρεις επιλογές, αλλά καμία δεν υπερτερεί καθαρά, οπότε δοκιμάστε και επιλέξτε.

Πυρήνας “vanilla”

Τι θα κάνετε αν θέλετε να πάρετε τον κώδικα του πυρήνα από κάποιο άλλο μέρος; Καλή ερώτηση. Ας πούμε ότι το hardware σας υποστηρίζεται από την τελευταία rc (υποψήφια προς κυκλοφορία έκδοση) του πυρήνα. Τότε θα πρέπει να κατεβάσετε το tarball με τον πιο πρόσφατο κώδικα από το www.kernel.org (οι rc εκδόσεις βρίσκονται στο www.kernel.org/pub/linux/kernel/v2.6/testing), να το αποσυμπιέσετε στο /usr/src, να αλλάξετε το συμβολικό δεσμό linux όπως πριν και να αντιγράψετε το .config από το προηγούμενο πυρήνα σας στο νέο φάκελο.

Αν και πρόκειται για διαφορετική έκδοση του πυρήνα, οι περισσότερες επιλογές θα είναι ίδιες. Θα υπάρχουν όμως και μερικές νέες επιλογές – πως τις βρίσκετε και τις ρυθμίζετε αυτές; Υπάρχει ένα κόλπο γι' αυτό. Πρώτα, κάντε cd στο /usr/src/linux και δώστε:

make oldconfig

Αυτό θα διατρέξει το config αρχείο και θα σας εμφανίσει όλες τις νέες επιλογές (που δεν έχουν ρυθμιστεί, προφανώς). Για κάθε επιλογή εμφανίζεται το γνωστό “Y/M/N?” για build in, module ή καθόλου ρύθμιση αντίστοιχα. Αν δεν είστε σίγουροι, πατήστε ? για να δείτε τι κάνει η νέα επιλογή. Μόλις το κάνετε αυτό, μπορείτε να τρέξετε το make menuconfig/xconfig για να πειράξετε όλες τις επιλογές, και μετά να δώσετε make all modules_install install για να κτίσετε και να εγκαταστήσετε το νέο πυρήνα όπως πριν.

Υπάρχει ένα πιθανό πρόβλημα, που πρέπει έχετε υπόψη, όταν φτιάχνετε έναν πυρήνα από τον κώδικα του kernel.org: οι περισσότερες διανομές “μπαλώνουν” σε κάποιο βαθμό τον πυρήνα για τις ανάγκες τους. Έτσι, ένας vanilla, δηλαδή καθαρός, χωρίς patches, πυρήνας μπορεί να κάνει μερικά πράγματα να μη δουλεύουν όπως θα έπρεπε, επειδή δεν περιλαμβάνει τον κώδικα που περιμένει η διανομή σας.

Εφαρμογή patch

Φτάνουμε στο τέλος, μια και έχουμε καλύψει τους περισσότερους λόγους για τους οποίους θα θέλατε να φτιάξετε ένα νέο πυρήνα: μείωση μεγέθους, ενεργοποίηση χαρακτηριστικών και χρήση νεότερου πυρήνα. Αλλά υπάρχει κάτι ακόμα, το “μπάλωμα” του πυρήνα με κάποιο patch. Αυτό δεν είναι δύσκολο. Ας υποθέσουμε ότι έχετε κατεβάσει το σωστό patch για τον πυρήνα σας, για παράδειγμα το patch για Reiser4 για τον πυρήνα 2.6.18.3. Τότε το εφαρμόζετε ως εξής:

cd /usr/src/linux
gunzip reiser4-for-2.6.18-3.patch.gz
patch -p1

Τα patches είναι συνήθως συμπιεσμένα με το gzip, αλλά χρησιμοποιείστε το bunzip2 αν το το δικό σας είναι συμπιεσμένα με το bzip2. Εναλλακτικά, αντί των δύο τελευταίων εντολών, μπορείτε να δώσετε την παρακάτω (χρησιμοποιήστε την bzcat για patch συμπιεσμένα με το bzip2):

zcat reiser4-for-2.6.18-3.patch.gz | patch -p1

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

Μόλις εφαρμόσετε το patch, δώστε make menuconfig/xconfig/oldconfig, αντίστοιχα, για να ρυθμίσετε τις νέες επιλογές, και μετά κάντε make all modules_install install. Εάν το patch αποτύχει, ίσως πρέπει να αλλάξετε την παράμετρο -p. Εάν κοιτάξετε στο πάνω μέρος του patch αρχείου θα δείτε κάτι σαν κι αυτό:

--- linux-2.6.18.orig/arch/i386/lib/usercopy.c
+++ linux-2.6.18/arch/i386/lib/usercopy.c

Στην πρώτη γραμμή είναι το αρχικό αρχείο και στη δεύτερη το “μπαλωμένο” που θα το αντικαταστήσει. Το όνομα του αρχείου είναι σχετικό με το φάκελο που βρίσκεστε κάθε φορά. Η παράμετρος -p του patch ορίζει τον αριθμό των φακέλων (για την ακρίβεια των slashes) που πρέπει να αφαιρεθούν από το όνομα. Βρισκόμαστε ήδη στο φάκελο linux-2.6.18, επομένως το -p1 αφαιρεί το linux-2.6.18 και ψάχνει για το υπόλοιπο: arch/i386/lib/usercopy.c. Εάν ήμασταν στο φάκελο /usr/src, τότε θα έπρεπε να δώσουμε -p0, αλλά αυτό δεν θα λειτουργούσε επειδή ο αρχικός φάκελος ονομάζεται linux-2.6.18.3, και όχι linux-2.6.18. Γι' αυτό είναι πιο ασφαλές να εφαρμόζετε το patch μέσα στο /usr/src/linux.

Αυτά μπορεί να φαίνονται κάπως περίεργα, και όντως το να βάλετε τη σωστή -p παράμετρο είναι συχνά το πιο δύσκολο κομμάτι στο patching αρχείων. Πάντως, πριν κάνετε οτιδήποτε, μπορείτε να δοκιμάζετε με την παράμετρο --dry-run. Αυτή ελέγχει ότι το patch θα εφαρμοζόταν σωστά χωρίς όμως να κάνει τίποτε.

Η εφαρμογή ενός μόνο patch στο δέντρο του πυρήνα είναι σχετικά απλή. Τα προβλήματα εμφανίζονται όταν θέλετε να εφαρμόσετε πολλαπλά patches ταυτόχρονα, αφού αυτά μπορεί να αφορούν τα ίδια αρχεία. Σε αυτήν την περίπτωση είναι σημαντική η σειρά εφαρμογής των patches. Πάντως πριν ξεκινήσετε να εφαρμόζετε πολλαπλά patches, ψάξτε στο Google ή διαβάστε τα μηνύματα στην emailing λίστα Linux Kernel, ώστε να κάνετε να συνεργάζονται αρμονικά όλα τα patches που σας χρειάζονται. Ή στραφείτε σε συλλογές από patches, που προσθέτουν διάφορα χαρακτηριστικά και βελτιώσεις με μία εντολή. Υπάρχουν αρκετές τέτοιες συλλογές: άλλες είναι σταθερές και δοκιμασμένες και άλλες τις βάζετε με δική σας ευθύνη. Στην πρώτη κατηγορία βρίσκεται η συλλογή mm. Δείτε στο τέλος για μερικές γνωστές συλλογές patches.

Τι είναι αυτό;

Η mm είναι μια συλλογή από patches που έφτιαξε ο Andrew Morton, συντηρητής του δέντρου του πυρήνα 2.6.x. Υπάρχει μεν στο www.kernel.org, αλλά δεν είναι υποστηρίζεται επίσημα από τον πυρήνα. Περιέχει patches που ίσως, στο μέλλον, να γίνουν δεκτά στον επίσημο κώδικα του πυρήνα 2.6 αλλά προς το παρόν δεν θεωρούνται αρκετά δοκιμασμένα για τις ...μάζες. Η συλλογή τροποποιεί πάνω από 3850 αρχεία (σε σύνολο 21.000 που περιέχει όλος ο κώδικας του πυρήνα), οπότε φαντάζεστε τι κόπο γλιτώνετε από το να τα εφαρμόζατε με το χέρι...

Η εφαρμογή του mm γίνεται πολύ απλά. Για να εφαρμόσετε την έκδοση για τον πυρήνα 2.6.19-rc6, π.χ., πρέπει να δώσετε:

cd /usr/src/linux-2.16.19-rc6
bzcat /path/to/2.6.19-rc6-mm1 | patch -p1

Μετά εξερευνήστε τις νέες επιλογές, κάντε τις ρυθμίσεις, μεταγλωττίστε και εγκαταστήστε το νέο πυρήνα. Τότε θα είστε περήφανος κάτοχος ενός πυρήνα “τελευταίας τεχνολογίας”. Δεν ήταν δύσκολο τελικά, αλλά μην το πείτε στους newbies! :)

ΓΡΗΓΟΡΕΣ ΣΥΜΒΟΥΛΕΣ

1. Γινετε root

Αν και είναι δυνατό να “patchάρετε”, να ρυθμίσετε και να μεταγλωττίσετε τον κώδικα του πυρήνα ως κανονικός χρήστης, πρέπει να είστε root για να τον εγκαταστήσετε. Για χάρη ευκολίας, όμως, θεωρούμε ότι δίνετε όλες τις εντολές του tutorial ως root. Κάποιες διανομές δίνουν τη δυνατότητα να ανοίξετε μία κονσόλα ως root από τα μενού. Διαφορετικά, απλώς ανοίξτε μια κανονική κονσόλα και δώστε su και μετά τον κωδικό του root. Το Ubuntu δεν σας επιτρέπει να το κάνετε αυτό. Γι' αυτό δώστε sudo -i και μετά τον κωδικό του χρήστη.

2. Μια χρήσιμη επιλογή

Υπάρχει μια επιλογή του πυρήνα που πρέπει σίγουρα να ενεργοποιήσετε: General Setup > Enable Access to .config Through
/proc/config.gz (IKCONFIG_PROC). Αυτό κάνει τις τρέχουσες ρυθμίσεις του πυρήνα να εγγραφούν στο /proc/config.gz, το οποίο μπορείτε να διαβάσετε με το zcat ή να ψάξετε με το zgrep. Το να έχετε αυτές τις πληροφορίες διαθέσιμες θα είναι χρήσιμο αν θέλετε να θυμάστε τις αλλαγές που κάνατε.

3. Modules ή built-in;
Ο πυρήνας Linux είναι μονολιθικός και αρχικά προοριζόταν να ενσωματώνει όλους τους drivers. Καθώς όμως ο πυρήνας μεγάλωνε, αυτό δεν ήταν πια εφικτό και γι' αυτό δημιουργήθηκαν τα modules. Αυτά είναι ξεχωριστά αρχεία στο δίσκο που φορτώνονται στον πυρήνα μόνο όταν είναι απαραίτητο. Αυτό επιτρέπει μεγάλο βαθμό ευελιξίας, αλλά ...σηκώνει μεγάλη συζήτηση το αν οι drivers πρέπει να είναι πάντα modules ή built in στον πυρήνα. Η απάντηση εξαρτάται από τον υπολογιστή σας και το πως τον χρησιμοποιείτε.

Για παράδειγμα, σε ένα φορητό υπολογιστή υπάρχουν δύο κάρτες δικτύου, μια Ethernet και μια ασύρματη. Κάθε στιγμή μπορεί να χρησιμοποιείτε κάποια από τις δύο ή καμία από τις δύο, οπότε είναι λογικό να έχετε τους drivers τους ως modules. Από την άλλη, ένας επιτραπέζιος υπολογιστής μπορεί να έχει μόνο Ethernet κάρτα που είναι πάντοτε ενεργή, οπότε μπορείτε να τη βάλετε built in, αφού ούτως ή άλλως την χρειάζεστε πάντοτε.

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

4. Δημοφιλή σύνολα patches

Να μερικά σύνολα από patches που μπορεί να θέλετε να δοκιμάσετε:

mm
Τα patches του Andrew Morton (www.kernel.org).

Ck
Τα patches του Con Colivas θα κάνουν το desktop σας πολύ πιο γρήγορο και με καλυτερη απόκριση (http://members.optusnet.com.au/ckolivas/kernel)

viper
Πειραματικά patches που μειώνουν τις καθυστερήσεις και αυξάνουν την αλληλεπιδραστικότητα. (http://vipernicus.
evolution-mission.org)

no
Πρόκειται για το mm μαζί με μερικά ακόμα patches για μεγαλύτερες επιδόσεις. (http://no.oldos.org)

5. Καθαρισμός

Υπάρχουν διάφοροι τρόποι να διατηρείτε την ...τάξη στο “δέντρο” του κώδικα του πυρήνα, ιδιαίτερα αν κάνετε μεγάλες αλλαγές στις ρυθμίσεις. Κατ' αρχάς, η make clean αφαιρεί όλα τα μεταγλωττισμένα αρχεία από το δέντρο, και το επαναφέρει στην κατάσταση που ήταν πριν ξεκινήσετε τη μεταγλώττιση. Για πιο λεπτομερή “καθαρισμό”, υπάρχει η make mrproper, που αφαιρεί όλα τα αρχεία ρυθμίσεων. Πάρτε backup του .config πριν το τρέξετε όμως!

6. Modules τρίτων

Ακόμα κι αν δεν θέλετε να κτίσετε το δικό σας πυρήνα, μπορεί να χρειαστεί να έχετε τον κώδικα του πυρήνα στο /usr/src/linux. Εάν θέλετε να εγκαταστήσετε κάτι που προσθέτει τα δικά του modules, τότε αυτό χρειάζεται τον κώδικα του πυρήνα και ένα μεταγλωττιστή για να κάνει τη δουλειά του. Τυπικά παραδείγματα, είναι οι drivers της nVidia και το VMware. Και τα δύο χρειάζονται modules για να επικοινωνεί ο κώδικάς τους με τον ίδιο τον πυρήνα. Συνήθως προσφέρουν έτοιμα modules για αρκετές διανομές και εκδόσεις πυρήνα, αλλά αν δεν βρείτε ένα για το σύστημά σας, ή έχετε κάνει αναβάθμιση, τότε τα προγράμματα εγκατάστασης τους θα πρέπει να μπορούν να φτιάξουν νέα modules για τον πυρήνα σας.

Εξυπακούεται ότι όταν αναβαθμίζετε τον πυρήνα σας, ακόμα κι όταν κάνετε recompile την ίδια έκδοση, θα πρέπει να επανεγκαταστήσετε όλα τα πακέτα που φτιάχνουν δικά τους modules (drivers, VΜware, κλπ).

To άρθρο αποτελεί αναδημοσίευση από το αντίστοιχο άρθρο του τεύχους 15.

Δώσε αστέρια!
Σχόλια

Είναι από τα πράγματα που είχα μάθει ότι κάνει το linux και πάντα είχα απορία το πώς γίνεται. Αν και πάντα το φοβόμουν το post ήταν τόσο κατατοπιστικό που μπαίνω σε πειρασμό αν αρχίσω από τώρα... και δεν πρέπει :-p

Μπράβο dimitri, πολύ καλό άρθρο! Έλα να βλέπω τα μικρά πιγκουινάκια στη σειρά να κάνουν compile τον προσωπικό τους πυρήνα. Δε χαλαρώνουμε, δε χαλαρώνουμε! :-)

Θέλω να προσθέσω τα εξής:
To Debian (κ κατ'επέκταση το Ubuntu) έχει ειδικά εργαλεία που απλοποιούν με υπέροχο τρόπο (όχι, δεν είμαι καθόλου προκατειλημμένος) τη διαδικασία μεταγλώτισσης του πυρήνα. Φυσικά, το τι θα ενεργοποιήσετε κ τι όχι εξακολουθεί να είναι δική σας επιλογή (κ ευθύνη), αλλά τα υπόλοιπα (make, make install, lilo, grub, initrd, κλπ κλπ), γίνονται αυτόματα κ φυσικά... σωστά.

Επιπλέον, στο τέλος έχετε στα χέρια σας ένα πακέτο .deb για κάθε πυρήνα που φτιάχνετε, οπότε είναι πολύ εύκολο να τους (απ)εγκαταστήσετε.

Για περισσότερες πληροφορίες:

http://kernel-handbook.alioth.debian.org/

και ιδιαίτερα το 4ο κεφάλαιο.
Καλά μαγειρέματα!

κατα την διαδικασια μεταγλώτησης του πυρηνα εφαρμόζοντας την εντπλή make xconfig  εμφανίζεται ενας πινακας οπου εκει κανεις διαφορες επιλογες η απενεργοποιησεις μπορω να εχω μια βοηθεια σχετικα με αυτο το θεμα;
Στην επιλογη processor type and feature τι πρεπει να επιλέξω στο processor family o επεξεργαστης μου ειναι:
επεξ 0:intel(R)PENTIUM(R)DUAL CPU E2200 @2.20GHz
επεξ 1::intel(R)PENTIUM(R)DUAL CPU E2200 @2.20GHz
EYXAΡΙΣΤΩ