Linux

Debian Squeeze - Compiling the kernel

08/11/2010 07:29 μμ | 13postures από 13postures


Debian Squeeze - Compiling the kernel

 

__TOC__

 

Εισαγωγή

Έχετε εγκατεστημένο το Debian "squeeze";

Πάντα θέλατε να μεταγλωττίσετε τον δικό σας πυρήνα αλλά δυσκολευόσασταν ή βαριόσασταν να ψάξετε πώς γίνεται;

 

Σε αυτό το tutorial θα δούμε τα βήματα που πρέπει να ακολουθήσουμε για να μεταγλωττίσουμε ένα πυρήνα ακολουθώντας τον τρόπο του debian squeeze. Αυτό σημαίνει ότι δεν θα φτιάξουμε απλά ένα image του πυρήνα, αλλά ένα κανονικό πακέτο του debian το οποίο μπορούμε να εγκαταστήσουμε και να απεγκαταστήσουμε από το σύστημα μας χωρίς να μας μείνουν υπολείμματα αρχείων σε directories που δεν γνωρίζουμε. Επίσης, μπορούμε να διανείμουμε το πακέτο αυτό δε όσους φίλους και γνωστούς θέλουμε οι οποίοι θα το εγκαταστήσουν χρησιμοποιώντας τους γνωστούς package managers του debian.

 

 

 

Προτού ξεκινήσουμε

Όλες οι εντολές του οδηγού εκτελούνται ως root εκτός αν αναφέρεται ρητά το αντίθετο.

 

 

 

Απαραίτητα πακέτα για τη μεταγλώττιση

Εγκαταστήστε τα ακόλουθα πακέτα:

 

>apt-get install build-essential bzip2 libncurses5-dev git fakeroot initramfs-tools kernel-package

 

Προαιρετικά, αν σας αρέσει να ρυθμίζετε τον πυρήνα σε γραφικό περιβάλλον (:eek:), εγκαταστήστε αυτά που σας χρειάζονται από τα παρακάτω :

 

  • tk-dev (για πυρήνες της σειράς 2.4.X μόνο) ή
  • libqt3-mt-dev, g++ >= 3.0 (για πυρήνες της σειράς 2.6.X με χρήση της εντολής make xconfig) ή
  • libqt3-mt-dev, g++ >= 3.0, libglade2-dev (για πυρήνες της σειράς 2.6.X με χρήση της εντολής make gconfig)

 

 

 

Παίρνουμε τον πηγαίο κώδικα του πυρήνα

Ο πιο εύκολος τρόπος είναι με τη χρήση των package managers του debian.

Γράφουμε στο τερματικό:

 

>apt-get install linux-source-2.6.32

 

Μετά το παραπάνω, ο πηγαίος κώδικας του πυρήνα θα βρίσκεται μέσα στο directory /usr/src με τη μορφή ενός συμπιεσμένου αρχείου. Μπαίνουμε στο directory και αποσυμπιέζουμε το αρχείο:

 

>cd /usr/src
tar xjf linux-source-2.6.32.tar.bz2

 

Δυστυχώς, η έκδοση του πυρήνα που μας παρέχει το Debian Squeeze μέσω πακέτων είναι ποοοολύ παλιά.

 

Μπορούμε να κατεβάσουμε την τελευταία έκδοση του πυρήνα από την κεντρική ιστοσελίδα του B) . Να έχετε υπόψη σας όμως ότι ο πυρήνας του debian έχει πολλά επιπλέον patches που δεν εμπεριέχονται στην vanilla έκδοση του πυρήνα. Επίσης, αν δεν ρυθμίσετε καλά τον vanilla πυρήνα (αυτό γίνεται σε επόμενο βήμα κατά τη μεταγλώττιση), είναι πιθανόν να μην μπορεί να λειτουργήσει σωστά. Μην ανησυχείτε όμως, αν αφήσετε τις default ρυθμίσεις είναι σχεδόν σίγουρο ότι όλα θα πάνε καλά.

 

Αν αποφασίσετε να κατεβάσετε την τελευταία έκδοση του πυρήνα, μπορείτε να τoν αποθηκεύσετε-αποσυμπιέσετε σε όποιο directory θέλετε και όχι υποχρεωτικά στο /usr/src. Το /usr/src απαιτεί δικαιώματα root για να εκτελέσετε τις παρακάτω εντολές, ενώ υπάρχουν άλλα directories (/tmp ή το home directory σας) στα οποία μπορείτε να τις εκτελέσετε ως απλοί χρήστες.

 

Εφαρμογή ενός ή περισσότερων patch (προαιρετικό)

Αν θέλετε να χρησιμοποιήσετε ένα ή περισσότερα patch στον πυρήνα σας, τώρα είναι η στιγμή.

 

Καταρχάς, αποθηκεύστε το (ή τα) patch σας μέσα στο directory του πηγαίου κώδικα του πυρήνα. Για παράδειγμα, μπορείτε να κατεβάσετε το patch για τον Brain Fuck Scheduler που αντιστοιχεί στον πυρήνα σας. Έστω ότι αποθηκεύουμε το παρακάτω patch:

 

>2.6.32-sched-bfs-318.patch

 

Εφαρμόζουμε το patch ανοίγοντας ένα τερματικό, μπαίνοντας με cd μέσα στο directory του πηγαίου κώδικα του πυρήνα και πληκτρολογώντας την εντολή:

 

>patch -p1 < 2.6.32-sched-bfs-318.patch

 

ΠΡΟΣΟΧΗ: Το κάθε patch είναι φτιαγμένο για μία συγκεκριμένη έκδοση του πυρήνα! Δεν εφαρμόζουμε ποτέ στα τυφλά patch.

 

 

 

Η μεταγλώττιση

1. Ανοίγουμε ένα τερματικό

 

2. Μπαίνουμε στο directory του πηγαίου κώδικα του πυρήνα. Επειδή κατεβάσαμε προηγουμένως τον πυρήνα 2.6.32, μπαίνουμε στο directory γράφοντας:

 

>cd /usr/src/linux-source-2.6.32

 

3. Ρυθμίζουμε τον πυρήνα γράφοντας στο τερματικό

 

>make menuconfig

 

Το τι μπορούμε να ρυθμίσουμε εδώ δεν μπορεί να περιγραφεί πλήρως στα πλαίσια αυτού του tutorial. Για την ακρίβεια δεν θα περιγραφεί καθόλου! :P

Όταν τελειώσετε τις ρυθμίσεις (ή δεχτείτε τις default και μην αλλάξετε τίποτα) πατάτε exit και αποθηκεύονται στο αρχείο ".config" που βρίσκεται μέσα στο directory /usr/src/linux-source-2.6.32.

Οι ίδιες ρυθμίσεις μπορούν να γίνουν και πιο γραφικά με την εντολή

 

>make xconfig

 

ή

 

>make gconfig

 

4. Γράφουμε στο τερματικό

 

>make-kpkg clean

 

5. Αν δεν έχετε multicore επεξεργαστή ή δεν ξέρετε καν τι σημαίνει multicore, προχωρήστε στο επόμενο βήμα.

 

Η διαδικασία της μεταγλώττισης επιταχύνεται ποοοοολύ αν εκτελέσουμε την παρακάτω εντολή:

 

>export CONCURRENCY_LEVEL=Χ

 

όπου Χ, ο αριθμός των threads που υποστηρίζει ο επεξεργαστής μας. Aν δεν γνωρίζετε πόσα threads υποστηρίζει ο επεξεργαστής σας, να γράψετε την εντολή:

 

>grep -c ^processor /proc/cpuinfo 

 

Ο αριθμός που επιστρέφει η παραπάνω εντολή είναι η ζητούμενη τιμή του Χ.

 

6. Και τώρα πάμε στο ζουμί. Ένα βασικό ζήτημα είναι αν ο πυρήνας θα χρησιμοποιεί initrd ή όχι. Εδώ δεν θα ασχοληθούμε με το πιο είναι καλύτερο. Θα δείξουμε πώς γίνεται η διαδικασία είτε επιλέξετε το ένα είτε το άλλο. Γενικά πάντως, οι πυρήνες του debian χρησιμοποιούν initrd και ο πηγαίος κώδικας που μπορείτε να κατεβάσετε από τα αποθετήρια του debian είναι ρυθμισμένος για χρήση με initrd. Επίσης, αν θέλετε να μπορείτε να εγκαταστήσετε τον πυρήνα και σε άλλα μηχανήματα, να χρησιμοποιήσετε το initrd.

Αν δεν έχετε ιδέα ποια από τις δύο μεθόδους να χρησιμοποιήσετε, χρησιμοποιείστε αυτή με initrd.

 

Με χρήση initrd

Είμαστε μέσα στο directory του πηγαίου κώδικα και δημιουργούμε το πακέτο του πυρήνα δίνοντας την εντολή (ως root) στο τερματικό

 

>make-kpkg  --initrd --append-to-version -my_kernel  --revision=custom.1.0  kernel_image  modules_image

 

ή ως απλός χρήστης γράφουμε

 

>fakeroot make-kpkg  --initrd --append-to-version -my_kernel  --revision=custom.1.0  kernel_image  modules_image

 

Μια-δυο ωρίτσες μετά, θα έχει φτιαχτεί το πακέτο:

 

linux-image-2.6.32-my_kernel_custom.1.0_i386.deb

 

Το παραπάνω πακέτο βρίσκεται ένα directory πιο πάνω από αυτό που έχει τον πηγαίο κώδικα του πυρήνα.

 

Τα προσθέτουμε στο σύστημα μας με την εντολή

 

>dpkg -i linux-image-2.6.32-my_kernel_custom.1.0_i386.deb

 

Χωρίς χρήση initrd

Είμαστε μέσα στο directory του πηγαίου κώδικα και δημιουργούμε το πακέτο του πυρήνα δίνοντας την εντολή (ως root) στο τερματικό

 

>make-kpkg  --append-to-version -my_kernel  --revision=custom.1.0  kernel_image  modules-image

 

ή ως απλός χρήστης γράφουμε

 

>fakeroot make-kpkg  --append-to-version -my_kernel  --revision=custom.1.0  kernel_image  modules-image

 

Μια-δυο ωρίτσες μετά, θα έχει φτιαχτεί το πακέτο:

 

linux-image-2.6.32-my_kernel_custom.1.0_i386.deb

 

Το παραπάνω πακέτο βρίσκεται ένα directory πιο πάνω από αυτό που έχει τον πηγαίο κώδικα του πυρήνα.

 

Τα προσθέτουμε στο σύστημα μας με την εντολή

 

>dpkg -i linux-image-2.6.32-my_kernel_custom.1.0_i386.deb

 

 

ΣΗΜΕΙΩΣΗ: Το i386 που βλέπετε στο όνομα του αρχείου του πυρήνα, εξαρτάται από την αρχιτεκτονική του debian που χρησιμοποιείτε και προστίθεται αυτόματα. Συγκεκριμένα, το i386 σημαίνει ότι διαθέτετε το debian για 32μπιτο επεξεργαστή της Intel (ή άλλο συμβατό επεξεργαστή). Αν χρησιμοποιείτε το amd64 port του debian για 64μπιτους επεξεργαστές, θα γράφει amd64 αντί για i386. Γενικά, μην ασχολείστε με το τι γράφεται εκεί. Το κανονίζει από μόνο του το λειτουργικό σύστημα.

 

 

 

 

Eπανεκκίνηση

Reboot, επιλέξτε τον πυρήνα σας στον grub και προσευχηθείτε να boot-άρει!!

Αν δεν boot-άρει, επαναλάβετε τα βήματα της μεταγλώττισης αλλάζοντας της ρυθμίσεις του πυρήνα με το "make menuconfig".

Αν θέλετε να αφαιρέσετε εντελώς τον πυρήνα από το σύστημα σας χρησιμοποιήστε κάποιον από τους γνωστούς package managers του debian. Για παράδειγμα:

 

>apt-get purge linux-image-2.6.32-my_kernel

 

 

 

Ρύθμιση του Grub2 (προαιρετική)

Ok. καταφέραμε και εγκαταστήσαμε επιτυχώς τον πυρήνα που πάντα θέλαμε να έχουμε στο σύστημα μας. Mερικές φορές όμως τυχαίνει να μην φορτώνεται ο πυρήνας μας από default, κατά την εκκίνηση, και να πρέπει να τον επιλέγουμε με τα βελάκια και μετά να πατάμε enter. Πολύ εκνευριστικό! :mad:

 

Τί κάνουμε; Καταρχάς απομνημονεύουμε σε ποια θέση του μενού του grub2 εμφανίζεται ο πυρήνας μας μετρώντας από πάνω προς τα κάτω. Μετά, γινόμαστε root και ανοίγουμε το αρχείο

 

>/etc/default/grub

 

Πηγαίνετε στη γραμμή που γράφει:

 

>GRUB_DEFAULT=0

 

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

 

>GRUB_DEFAULT=2

 

Νομίζω το πιάσατε το νόημα ;). Όποια είναι η θέση του πυρήνα σας πλην ένα.

 

Πατάτε να αποθηκευτεί το αρχείο με τις αλλαγές σας και ανοίγετε ένα τερματικό όπου ως root δίνετε την εντολή:

 

>update-grub

 

Με τον τρόπο αυτό λαβαίνει υπόψη του ο grub2 τις αλλαγές που κάνατε. Από εδώ και στο εξής, ο grub2 θα boot-άρει κατευθείαν με το δικό σας πυρήνα.

 

 

 

Επίλογος

Ο οδηγός αυτός έχει ως σκοπό να παρουσιάσει περιληπτικά τη διαδικασία της μεταγλώττισης ενός πυρήνα με τη διανομή debian "squeeze". Οι παράμετροι που χρησιμοποιήθηκαν έχουν ως στόχο να ικανοποιήσουν τον μέσο χρήστη που θέλει να μεταγλωττίσει τον πυρήνα.

 

 

 

Αναλυτικότερες πληροφορίες

Για περισσότερες λεπτομέρειες δείτε τα παρακάτω:

 

/usr/share/doc/kernel-package/README

man make-kpkg

Debian Reference

 

 

Special thanks to tritonas00, apoikos και stamatisx!