Next Previous Contents

5. Μπαλώνοντας (patching) τον πυρήνα

5.1 Εφαρμόζοντας ένα μπάλωμα (patch)

Οι κατά τμήματα βελτιώσεις του πυρήνα διανέμονται ως patches ( = μπαλώματα). Πχ, αν έχετε την έκδοση 1.1.45, και πάρει το μάτι σας ότι κάπου υπάρχει patch46.gz γι' αυτήν, σημαίνει ότι μπορείτε να την αναβαθμίσετε σε έκδοση 1.1.46, ενώνοντας το patch. Φυσικά, μπορεί πρώτα να χρειαστεί να κάνετε backup του δέντρου των dirs του source κώδικα (το make clean, και μετά το cd /usr/src; tar zcvf old-tree.tar.gz linux, θα σας φτάξουν ένα συμπιεσμένο tar αρχείο).

Έτσι, συνεχίζοντας το παραπάνω παράδειγμα, ας υποθέσουμε ότι έχετε το patch46.gz στο /usr/src. Μετά γυρίστε με cd στο dir /usr/src και δώστε zcat patch46.gz | patch -p0patch -p0 < patch46, αν το patch είναι ασυμπίεστο). Θα δείτε διάφορα πράγματα να φεύγουν με ταχύτητα (ή να αργοπετάνε, αν ο Η/Υ σας είναι τόσο αργός), πράγμα που σας λέει ότι προσπαθεί να τσοντάρει τα κομμάτια, και αν πέτυχε ή όχι. Συνήθως αυτή η δραστηριότητα εξελίσσεται τόσο γρήγορα, ώστε να μη μπορείτε να διαβάσετε τα μηνύματά της, και δεν είμαστε πάντα σίγουροι αν πετυχαίνει ή όχι. Επομένως, μπορεί να θέλετε να βάλετε την παράμετρο -s στη διαδικασία προσκόλλησης του patch, η οποία βγάζει στην οθόνη μόνο τα μηνύματα λάθους. (Δεν θ' αποκτήσετε πολύ συναίσθημα του τύπου "γιά δες, ο Η/Υ μου κάνει κάτι γιά ν' αλλάξει!", αλλά μπορεί και να σας αρέσει αυτός ο τρόπος.) Γιά να βρείτε ποιά μέρη της διαδικασίας δεν δούλεψαν σωστά, πάτε στο dir /usr/src/linux και ψάξτε γιά αρχεία με κατάληξη .rej . Μερικές εκδόσεις της patch (παλιότερες εκδόσεις, που γίνανε compile με τη βοήθεια κατώτερου filesystem), αφήνουν τα αρχεία αυτά με κατάληξη # . Μπορείτε να βάλετε την εντολή find να ψάξει γιά χάρη σας. Δίνοντας

    find .  -name '*.rej' -print

βγάζει στην οθόνη όσα αρχεία με κατάληξη .rej που υπάρχουν στο τρέχον dir και στα subdirs του.

Αν όλα πήγαν καλά, κάντε make clean, config, και dep, όπως τα περιγράψαμε στις ενότητες 3 και 4.

Υπάρχουν κάμποσες παράμετροι της εντολής patch. Όπως προαναφέραμε, η patch -s καταπνίγει όλα τα μηνύματα, εκτός από τα μηνύματα λαθών. Αν βάλετε τον source κώδικα του πυρήνα σε κάποιο dir διαφορετικό από το /usr/src/linux, η patch -p1 (σ' αυτό το άλλο dir) θα κάνει το patch μιά χαρά. Οι υπόλοιπες παράμετροι της patch είναι τεκμηριωμένες καλά στην αντίστοιχη σελίδα man.

5.2 Αν κάτι δεν πάει καλά

(Σημείωση : Αυτή η ενότητα αναφέρεται κυρίως σε παλιότερους πυρήνες.)

Το πιο συχνό πρόβλημα που υπήρχε, ήταν όποτε ένα patch άλλαζε ένα αρχείο με όνομα config.in, πράγμα που δεν ήταν απόλυτα σωστό, επειδή ο κάθε χρήστης αλλάζει τις ρυθμίσεις στον δικό του Η/Υ. Αυτό έχει πλέον εξαλειφθεί, αλλά μπορεί να το ξαναβρείτε μπροστά σας σε παλιότερες εκδόσεις. Γιά να το διορθώσετε, ψάξτε στο αρχείο config.in.rej, να δείτε τί άφησε το patch. Οι αλλαγές τυπικά σημειώνονται με + και - στην αρχή κάθε γραμμής. Διαβάστε τις γραμμές που περιστοιχίζουν τις γραμμές των αλλαγών, και θυμηθείτε αν δώσατε ανάλογα y ή n. Τώρα, διορθώστε το config.in, και αλλάξτε τα y σε n και τα n σε y, όπως χρειάζεται. Δώστε

    patch -p0 < config.in.rej

και αν λέει ότι πέτυχε (δηλ. δεν έχει μηνύματα αποτυχίας), τότε μπορείτε να συνεχίσετε με ρυθμίσεις και compilation. Το αρχείο config.in.rej θα παραμείνει ως έχει, αλλά μπορείτε να το σβήσετε.

Αν συναντήσετε κι άλλα προβλήματα, μπορεί να έχετε εγκαταστήσει ένα patch που δεν δουλεύει. Εάν η εντολή patch βγάλει το μήνυμα previously applied patch detected: Assume -R? (ανιχνεύτηκε προηγούμενο patch, να το αντικαταστήσω;) πιθανότατα πάτε να βάλετε patch παλιότερης έκδοσης από τον πυρήνα σας. Αν απαντήσετε y, θα προσπαθήσει να αγνοήσει τον source κώδικα που έχετε, και πιθανότατα θ' αποτύχει. Συνεπώς, θα χρειαστείτε ένα ολόκληρο νέο δέντρο source κώδικα (πράγμα που, τελικά, μπορεί και να μην είναι κακή ιδέα).

Γιά να αφαιρέσετε ένα patch, χρησιμοποιείστε την εντολή patch -R επάνω στο αρχικό patch.

Το καλύτερο που έχετε να κάνετε, όταν τα patches αποδεικνύονται λανθασμένα, είναι να ξαναρχίσετε μ' ένα καθαρό του κουτιού δέντρο source κώδικα (πχ από ένα από τα αρχεία linux-x.y.z.tar.gz), και να ξανακάνετε όλη τη διαδικασία.

5.3 Σβήνοντας τα .orig αρχεία

Μετά από μόλις λίγα patches, θ' αρχίσουν να συσσωρεύονται αρχεία .orig . Πχ, ένα δέντρο έκδοσης 1.1.51 που είχα, τελευταία φορά καθαρίστηκε στην έκδοση 1.1.48 . Με το που έσβησα τα .orig αρχεία, εξοικονόμησα περισσότερο από μισό MB. Η εντολή

    find .  -name '*.orig' -exec rm -f {} ';'

θα φροντίσει τα πράγματα γιά σας. Οι εκδόσεις της patch που βάζουν # αντί γιά .rej, χρησιμοποιούν tilde (περισπωμένη) αντί γιά .orig .

Υπάρχουν καλύτεροι τρόποι γιά να σβήσουμε τα αρχεία .orig, οι οποίοι εξαρτώνται από τα GNU xargs. Πχ :

    find .  -name '*.orig' | xargs rm

ή η "αρκετά ασφαλής, αλλά λίγο πιο κυριολεκτική" μέθοδος :

    find . -name '*.orig' -print0 | xargs --null rm --

5.4 Άλλα patches

Υπάρχουν κι άλλα patches (αυτά θα τα αποκαλώ "μή στάνταρ"), εκτός απ' όσα διανέμει ο Linus. Αν δοκιμάσετε να τα προσθέσετε, τα patches του Linus μπορεί και να μη δουλέψουν σωστά, και είτε θα πρέπει να τα ξαναβγάλετε - να διορθώσετε τον source κώδικα του patch - να εγκαταστήσετε ένα νέο δέντρο source κώδικα, είτε να κάνετε έναν συνδυασμό όλων των παραπάνω. Αυτό μπορεί να είναι πολύ ενοχλητικό, επομένως, αν δεν θέλετε ν' αλλάξετε τον source κώδικα (με πιθανότητα γιά πολύ αποτυχημένο αποτέλεσμα), αφαιρέστε τα μή στάνταρ patches πριν βάλετε τα του Linus, ή απλά εγκαταστήστε ένα νέο δέντρο. Τότε, μπορείτε να δείτε εάν τα μή στάνταρ patches δουλεύουν ακόμη. Αν όχι, είτε έχετε κολλήσει σ' έναν παλιό πυρήνα, και παίζετε με το patch ή τον source κώδικα προσπαθώντας να τα κάνετε να δουλέψουν, ή περνάτε την ώρα σας περιμένοντας (πιθανότατα παρακαλώντας) να βγει μιά νέα έκδοση του patch.

Πόσο συχνά υπάρχουν patches εκτός της στάνταρ διανομής; Πιθανότατα κάποια στιγμή να συναντήσετε κάποιο. Προσωπικά χρησιμοποιούσα το noblink patch στις virtual κονσόλες μου, επειδή μισώ τους κέρσορες που αναβοσβήνουν. (Το συγκεκριμένο patch ανανεώνεται συχνά - τουλάχιστον ανανεωνόταν κατά το παρελθόν - στις νέες εκδόσεις του πυρήνα.) Ωστόσο, με τους περισσότερους νέους drivers συσκευών να έχουν πλέον τη μορφή modules που φορτώνονται, η συχνότητα εμφάνισης των "μή στάνταρ" patches μειώνεται σημαντικά.


Next Previous Contents