Πώς να ενημερώσετε τον πυρήνα σας Android στο τελευταίο Linux Stable

Έχουμε καλύψει τους οδηγούς για τους πυρήνες του Android, όπως "Πώς να φτιάξεις έναν προσαρμοσμένο πυρήνα" και "Καλύτερους προσαρμοσμένους πυρήνες για το Android", αλλά σήμερα θα σας δείξουμε πώς να ανοίξετε τον πυρήνα σας με το πιο πρόσφατο σταθερό Linux.

Σας παρακαλούμε να γνωρίζετε ότι αυτό είναι προηγμένο υλικό - αν δεν έχετε συντάξει ποτέ έναν πυρήνα πριν, θα πρέπει να ακολουθήσετε τον οδηγό "Τρόπος δημιουργίας ενός προσαρμοσμένου πυρήνα" που συνδέεται παραπάνω και αυτός ο οδηγός θα περιλαμβάνει την ανάληψη κερασιών και τη συγχώνευση δεσμεύσεων από την τελευταία έκδοση του Linux, σταθερό πυρήνα με τον πυρήνα σας Android πριν τη συντάξετε.

Η αναβάθμιση του πυρήνα σας Android στο τελευταίο σταθερό Linux έχει πολλά θετικά οφέλη, όπως είναι η ενημέρωση με τις πιο πρόσφατες δεσμεύσεις ασφάλειας και διορθώσεις σφαλμάτων. Θα εξηγήσουμε μερικά από τα πλεονεκτήματα και τα μειονεκτήματα αργότερα σε αυτόν τον οδηγό.

Τι είναι ο πυρήνας Linux-Stable;

Το Linux-stable, όπως υποδηλώνει το όνομα, είναι ο σταθερός βραχίονας του πυρήνα του Linux. Ο άλλος βραχίονας είναι γνωστός ως "mainline", ο οποίος είναι ο κύριος κλάδος . Όλη η ανάπτυξη του πυρήνα του Linux συμβαίνει στην κύρια γραμμή και γενικά ακολουθεί αυτή τη διαδικασία:

  1. Ο Linus Torvalds θα πάρει μια δέσμη από επιθέματα από τους διαχειριστές του για δύο εβδομάδες.
  2. Μετά από αυτές τις δύο εβδομάδες, απελευθερώνει έναν πυρήνα rc1 (π.χ. 4.14-rc1).
  3. Για κάθε εβδομάδα για τις επόμενες 6-8 εβδομάδες, θα απελευθερώσει έναν άλλο πυρήνα RC (π.χ. 4.14-rc2, 4.14-rc3, etc), ο οποίος περιέχει ΜΟΝΟ διορθώσεις σφαλμάτων και παλινδρόμησης.
  4. Μόλις κριθεί σταθερό, θα απελευθερωθεί ως tarball για λήψη σε org (π.χ. 4.14).

Τι είναι οι πυρήνες LTS;

Κάθε χρόνο, ο Greg θα διαλέξει έναν πυρήνα και θα το διατηρήσει για δύο χρόνια (LTS) ή έξι χρόνια (Extended LTS). Αυτά έχουν σχεδιαστεί για να έχουν προϊόντα που χρειάζονται σταθερότητα (όπως τηλέφωνα Android ή άλλες συσκευές IOT). Η διαδικασία είναι ακριβώς η ίδια όπως παραπάνω, συμβαίνει μόνο για μεγαλύτερο χρονικό διάστημα. Υπάρχουν επί του παρόντος έξι πυρήνες LTS (οι οποίοι μπορούν πάντα να προβληθούν στη σελίδα των kernel.org εκδόσεων):

  • 4.14 (LTS), που διατηρείται από τον Greg Kroah-Hartman
  • 4.9 (LTS), που διατηρείται από τον Greg Kroah-Hartman
  • 4.4 (eLTS), που διατηρείται από τον Greg Kroah-Hartman
  • 4.1 (LTS), που διατηρείται από τον Sasha Levin
  • 3.16 (LTS), που διατηρείται από τον Ben Hutchings
  • 3.2 (LTS), που διατηρείται από τον Ben Hutchings

Ποια είναι τα οφέλη της αναβάθμισης του πυρήνα μου Android στο Linux Stable;

Όταν αποκαλύπτονται / διορθώνονται σημαντικά τρωτά σημεία, οι σταθεροί πυρήνες είναι οι πρώτοι που τα αποκτούν. Έτσι, ο πυρήνας του Android σας θα είναι πολύ πιο ασφαλής από επιθέσεις, ελαττώματα ασφαλείας και γενικά σφάλματα.

Το σταθερό Linux περιλαμβάνει διορθώσεις για πολλούς οδηγούς που η συσκευή μου Android δεν χρησιμοποιεί, δεν είναι αυτό περισσότερο περιττό;

Ναι και όχι, ανάλογα με τον τρόπο που ορίζετε "ως επί το πλείστον". Ο πυρήνας του Linux μπορεί να περιλαμβάνει πολλούς κώδικες που δεν χρησιμοποιούνται στο σύστημα Android, αλλά αυτό δεν εγγυάται ότι δεν θα υπάρξουν συγκρούσεις από αυτά τα αρχεία κατά τη συγχώνευση νέων εκδόσεων! Καταλάβετε ότι σχεδόν κανείς δεν χτίζει κανένα μέρος του πυρήνα, ούτε καν τα πιο συνηθισμένα διαγράμματα Linux, όπως το Ubuntu ή το Mint. Αυτό δεν σημαίνει ότι δεν πρέπει να λαμβάνετε αυτές τις επιδιορθώσεις επειδή υπάρχουν διορθώσεις ARE για οδηγούς που τρέχετε. Πάρτε βραχίονα / arm64 και ext4 για παράδειγμα, οι οποίες είναι η πιο συνηθισμένη αρχιτεκτονική Android και σύστημα αρχείων αντίστοιχα. Στο 4.4, από 4.4.78 (έκδοση της τελευταίας ετικέτας Oreo CAF) έως 4.4.121 (τελευταία ανάντη ετικέτα), αυτοί είναι οι ακόλουθοι αριθμοί για τις δεσμεύσεις των συστημάτων αυτών:

 ~ / kernels / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 | wc -l2285 ~ / kernels / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 αψίδα / βραχίονας | wc -l58 ~ / kernels / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 arch / arm64 | wc -l22 ~ / kernels / linux-stable (master) $ git log --format =% h v4.4.78..v4.4.121 fs / ext4 | wc-188 

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

Πώς να συγχωνεύσετε το Linux Stable Kernel σε έναν πυρήνα Android

Πρώτα πρέπει να υπολογίσετε ποια έκδοση του πυρήνα εκτελεί η συσκευή σας Android.

Δεδομένου ότι φαίνεται κάτι τετριμμένο, είναι απαραίτητο να γνωρίζετε από πού πρέπει να ξεκινήσετε. Εκτελέστε την ακόλουθη εντολή στο δέντρο του πυρήνα σας:

 κάνει πυρήνα 

Θα επιστρέψει την έκδοση στην οποία βρίσκεστε. Οι πρώτοι δύο αριθμοί θα χρησιμοποιηθούν για να υπολογίσετε το υποκατάστημα που χρειάζεστε (π.χ. linux-4.4.y για κάθε πυρήνα 4.4) και ο τελευταίος αριθμός θα χρησιμοποιηθεί για να καθορίσει ποια έκδοση πρέπει να ξεκινήσετε με τη συγχώνευση (π.χ. .21, θα συγχωνεύσετε 4.4.22 στη συνέχεια).

Πιάσε την πιο πρόσφατη πηγή πυρήνα από το kernel.org

Το kernel.org φιλοξενεί την πιο πρόσφατη πηγή πυρήνα στο αποθετήριο σταθερού linux. Στο κάτω μέρος αυτής της σελίδας, θα υπάρχουν τρεις σύνδεσμοι λήψης. Από την εμπειρία μου, ο καθρέφτης της Google τείνει να είναι ο γρηγορότερος αλλά τα αποτελέσματά σας μπορεί να διαφέρουν. Εκτελέστε τις ακόλουθες εντολές:

 git απομακρυσμένη προσθήκη linux-stable //kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit fetch linux-stable 

Αποφασίστε εάν θέλετε να συγχωνεύσετε ολόκληρο τον πυρήνα ή το κεράσι-επιλέξτε τις δεσμεύσεις

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

ΣΗΜΕΙΩΣΗ: Εάν η πηγή του πυρήνα σας έχει τη μορφή tarball, πιθανότατα θα χρειαστεί να κάνετε cherry-pick, αλλιώς θα λάβετε χιλιάδες διενέξεις αρχείων επειδή το git συγκεντρώνει το ιστορικό με βάση μόνο στα ανάντη, όχι αυτό που έχει ο ΚΑΕ ή CAF άλλαξε. Απλά μεταβείτε στο βήμα 4.

Κερασιά:

Πλεονεκτήματα:

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

Μειονεκτήματα:

  • Χρειάζεται περισσότερος χρόνος, δεδομένου ότι κάθε δέσμευση πρέπει να επιλεγεί ξεχωριστά.
  • Λίγο πιο δύσκολο να διαπιστώσετε εάν η διαπραγμάτευση είναι από την πρώτη στιγμή

Συγχώνευση

Πλεονεκτήματα :

  • Είναι πιο γρήγορο, καθώς δεν χρειάζεται να περιμένετε να συγχωνευθούν όλα τα καθαρά μπαλώματα.
  • Είναι ευκολότερο να βλέπετε πότε μια δέσμευση είναι από την ανάντη, καθώς δεν θα είστε ο υπεύθυνος, θα είναι ο ανερχόμενος συντηρητής.

Μειονεκτήματα:

  • Η επίλυση των συγκρούσεων μπορεί να είναι λίγο πιο δύσκολη καθώς θα πρέπει να αναζητήσετε ποια δέσμευση προκαλεί τη σύγκρουση χρησιμοποιώντας το git log / git fault, δεν θα σας το πει άμεσα.
  • Η αναδιάρθρωση είναι δύσκολη, καθώς δεν μπορείτε να επαναπροσδιορίσετε μια συγχώνευση, θα προσφέρει στο κεράσι-επιλογή όλων των διαπραγμάτευσης μεμονωμένα. Ωστόσο, δεν πρέπει να κάνετε επανεκκίνηση συχνά, αντ 'αυτού χρησιμοποιήστε το git revert και git merge όπου είναι δυνατόν.

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

Προσθέστε τις δεσμεύσεις στην πηγή σας, μία έκδοση τη φορά

Το πιο σημαντικό μέρος αυτής της διαδικασίας είναι η μόνη έκδοση σε μια χρονική στιγμή. Μπορεί να υπάρχει πρόβλημα στην ενημερωμένη σειρά σας, κάτι που θα μπορούσε να προκαλέσει πρόβλημα με την εκκίνηση ή να σπάσει κάτι σαν ήχο ή φόρτιση (εξηγείται στην ενότητα συμβουλές και τεχνάσματα). Η πραγματοποίηση αυξομειώσεων των αλλαγών είναι σημαντική για το λόγο αυτό, είναι ευκολότερο να βρεθεί ένα ζήτημα σε 50 δεσμεύσεις από ό, τι το 2000 δεσμεύει για ορισμένες εκδόσεις. Θα συνιστούσα μόνο να κάνετε μια πλήρη συγχώνευση μόλις γνωρίσετε όλα τα προβλήματα δεσμεύσεων και επίλυσης συγκρούσεων.

Κερασιά

Μορφή:

 git cherry-pick .. 

Παράδειγμα:

git cherry-pick v3.10.73..v3.10.74

Συγχώνευση

Μορφή:

 git merge 

Παράδειγμα:

git merge v3.10.74

Συνιστώ να παρακολουθείτε τις συγκρούσεις στις δεσμεύσεις συγχώνευσης αφαιρώντας τους δείκτες #.

Πώς να επιλύσετε τις συγκρούσεις

Δεν μπορούμε να δώσουμε έναν βήμα προς βήμα οδηγό για την επίλυση κάθε σύγκρουσης, καθώς περιλαμβάνει μια καλή γνώση της γλώσσας C, αλλά εδώ υπάρχουν μερικές συμβουλές.

Αν συγχωνεύετε, καταλάβετε τι προκαλεί η σύγκρουση. Μπορείτε να το κάνετε αυτό με δύο τρόπους:

  1. git log -pv $ (make kernelversion) .. για να λάβετε τις αλλαγές μεταξύ της τρέχουσας έκδοσης και της τελευταίας από την προηγούμενη. Η σημαία -p θα σας δώσει τις αλλαγές που έγιναν από κάθε δέσμευση ώστε να μπορείτε να δείτε.
  2. Εκτελέστε το φταίξιμο git στο αρχείο για να πάρετε τα hash από κάθε commit στην περιοχή. Στη συνέχεια, μπορείτε να εκτελέσετε το git show -format = πληρέστερο για να δείτε αν ο εντολέας ήταν από mainline / stable, Google ή CodeAurora.
  • Καταλάβετε αν έχετε ήδη δεσμευτεί. Ορισμένοι προμηθευτές, όπως το Google ή το CAF, θα προσπαθήσουν να κοιτάξουν προς τα πάνω για κρίσιμα σφάλματα, όπως το Dirty COW fix, και τα backports τους θα μπορούσαν να έρθουν σε σύγκρουση με τα upstream's. Μπορείτε να εκτελέσετε git log -grep = "" και να δείτε αν επιστρέφει οτιδήποτε. Αν αυτό συμβαίνει, μπορείτε να παραλείψετε τη δέσμευση (αν επιλέξετε κεράσι χρησιμοποιώντας git reset -hard && git cherry-pick -continue) ή να αγνοήσετε τις συγκρούσεις (αφαιρέστε το <<<<< >>>>>).
  • Μάθετε εάν υπάρχει ένα backport που δυσχεραίνει την ανάλυση. Η Google και η CAF θέλουν να υποστηρίξουν ορισμένα μπαλώματα που δεν θα ήταν σταθερά. Σταθερό θα πρέπει συχνά να προσαρμόσει την επίλυση της κύριας δέσμευσης για την απόρριψη ορισμένων επιδιορθώσεων που η Google επιλέγει να υποστηρίξει. Μπορείτε να δείτε τη δέσμευση της κύριας γραμμής τρέχοντας git show (το hash κεντρικής γραμμής θα είναι διαθέσιμο στο μήνυμα δέσμευσης της σταθερής δέσμευσης). Αν υπάρχει αναδυόμενο παράθυρο, μπορείτε να απορρίψετε τις αλλαγές ή να χρησιμοποιήσετε την έκδοση mainline (κάτι που συνήθως θα χρειαστεί να κάνετε).
  • Διαβάστε τι επιχειρεί να κάνει η δέσμευση και δείτε εάν το πρόβλημα έχει ήδη διορθωθεί. Κάποιες φορές το CAF μπορεί να διορθώσει ένα σφάλμα ανεξάρτητο από τα ανάντη, πράγμα που σημαίνει ότι μπορείτε είτε να αντικαταστήσετε τη διόρθωσή τους για τα ανάντη είτε να το απορρίψετε, όπως παραπάνω.

Διαφορετικά, μπορεί να είναι απλώς αποτέλεσμα μιας προσθήκης CAF / Google / OEM, οπότε πρέπει απλά να ανακατέψετε κάποια πράγματα.

Εδώ είναι ένας καθρέφτης του αποθεματικού kernel.org σταθερού σε linux στο GitHub, το οποίο μπορεί να είναι πιο εύκολο για την αναζήτηση λίστας commit και διαφωνιών για την επίλυση συγκρούσεων. Σας συνιστώ να πηγαίνετε πρώτα στην προβολή λίστας διεπαφών και εντοπίστε το πρόβλημα δεσμεύστε να δείτε το αρχικό diff για να το συγκρίνετε με το δικό σας.

Παράδειγμα URL: //github.com/nathanchance/linux-stable/commits/linux-3.10.y/arch/arm64/mm/mmu.c

Μπορείτε επίσης να το κάνετε μέσω της γραμμής εντολών:

 git log .. git show 

Η επίλυση των ψηφισμάτων αφορά το πλαίσιο. Αυτό που πρέπει πάντα να κάνετε είναι να βεβαιωθείτε ότι η τελική διαφορά σας ταιριάζει με τις ακόλουθες εντολές σε δύο ξεχωριστά παράθυρα:

 git diff HEAD git diff v $ (make kernelversion) .. $ (ετικέτα git --sort = -taggerdate -lv $ (make kernelversion | cut -d. -f 1, 2) * | head -n1) 

Ενεργοποίηση ανανέωσης

Το Git έχει ένα χαρακτηριστικό που ονομάζεται rerere (σημαίνει Reuse Recorded Resolution), που σημαίνει ότι όταν ανιχνεύει μια σύγκρουση, θα καταγράψει πώς το επιλύσατε, ώστε να μπορείτε να το ξαναχρησιμοποιήσετε αργότερα. Αυτό είναι ιδιαίτερα χρήσιμο και για τους δύο χρόνους rebasers με συγχώνευση και cherry-picking όπως θα χρειαστεί να τρέξετε git add. && git - συνεχίστε όταν επαναφέρετε την ανάρτηση προς τα πάνω, καθώς η διένεξη θα επιλυθεί με τον τρόπο που το επιλύσατε προηγουμένως.

Μπορεί να ενεργοποιηθεί εκτελώντας την ακόλουθη εντολή στο repo του πυρήνα:

 git config rerere.enabled true 

Πώς να το git bisect όταν τρέχετε σε ένα compiler ή σφάλμα χρόνου εκτέλεσης

Δεδομένου ότι θα προσθέσετε ένα αρκετά μεγάλο αριθμό δεσμεύσεων, είναι πολύ πιθανό να εισαγάγετε έναν μεταγλωττιστή ή σφάλμα χρόνου εκτέλεσης. Αντί να παραιτηθείτε, μπορείτε να χρησιμοποιήσετε το ενσωματωμένο εργαλείο bisect του git για να καταλάβετε τη βασική αιτία του προβλήματος! Στην ιδανική περίπτωση, θα χτίζετε και αναβοσβήνετε κάθε έκδοση του πυρήνα καθώς το προσθέτετε, έτσι ώστε η διχοτόμηση θα χρειαστεί λιγότερο χρόνο αν χρειαστεί, αλλά μπορείτε να πετάξετε 5000 δεσμεύσεις χωρίς προβλήματα.

Τι θα κάνει ο git bisect είναι να αναλάβει μια δέσμη δεσμεύσεων, από όπου το θέμα είναι παρόν σε εκεί όπου δεν υπήρχε και στη συνέχεια να αρχίσει να μειώνει στο μισό το εύρος commit, επιτρέποντάς σας να χτίσετε και να δοκιμάσετε και να το ενημερώσετε αν είναι καλό ή όχι . Θα συνεχίσει αυτό μέχρι να σπάσει τη δέσμευση προκαλώντας το πρόβλημά σας. Σε αυτό το σημείο, μπορείτε να το διορθώσετε ή να το επαναφέρετε.

  1. Ξεκινήστε τη διχοτόμηση: έναρξη git bisect
  2. Επισήμανση της τρέχουσας αναθεώρησης ως άσχημης: git bisect bad
  3. Ετικέτα μια αναθεώρηση ως καλή: git bisect καλό
  4. Κατασκευάστηκε με τη νέα αναθεώρηση
  5. Βάσει του αποτελέσματος (εάν το ζήτημα είναι παρόν ή όχι), πείτε στο git: git bisect good OR git bisect bad
  6. Ξεπλύνετε και επαναλάβετε τα βήματα 4-5 έως ότου εντοπιστεί το πρόβλημα!
  7. Επαναφορά ή επιδιόρθωση του προβλήματος.

ΣΗΜΕΙΩΣΗ: Οι συγχωνεύσεις θα χρειαστεί να εκτελέσουν προσωρινά το git rebase -i για να εφαρμόσουν όλα τα patches στο υποκατάστημά σας για την κατάλληλη διχοτόμηση, διότι η διχοτόμηση με τις συγχωνεύσεις στη θέση τους συχνά θα πραγματοποιεί checkout στις προηγούμενες δεσμεύσεις, πράγμα που σημαίνει ότι δεν έχετε καμία από τις συγκεκριμένες δεσμεύσεις του Android. Μπορώ να πάω σε βάθος σε αυτό, κατόπιν αιτήματος, αλλά με εμπιστευθείτε, είναι απαραίτητο. Αφού προσδιορίσετε ότι το πρόβλημα επιλύθηκε, μπορείτε να το επαναφέρετε ή να το επαναφέρετε στη συγχώνευση.

ΜΗΝ σκουπίζετε ενημερώσεις προς τα πάνω

Πολλοί νέοι προγραμματιστές μπαίνουν στον πειρασμό να κάνουν αυτό, καθώς είναι "καθαρότεροι" και "ευκολότεροι" να διαχειριστούν. Αυτό είναι τρομερό για λίγους λόγους:

  • Ο συγγραφέας χάνεται. Είναι άδικο για άλλους προγραμματιστές να έχουν την πίστωση τους για την εργασία τους.
  • Η διχοτόμηση είναι αδύνατη. Αν σκουρύνετε μια σειρά δεσμεύσεων και κάτι είναι ένα θέμα σε αυτή τη σειρά, είναι αδύνατο να πείτε ποια διάπραξη προκάλεσε ένα πρόβλημα σε ένα σκουός.
  • Οι μελλοντικές κερασιές είναι πιο σκληρές. Εάν πρέπει να κάνετε rebase με μια σειρά με τσακίματα, είναι δύσκολο / αδύνατο να καταλάβετε από πού προέρχεται μια σύγκρουση.

Εγγραφείτε στη λίστα αλληλογραφίας του πυρήνα Linux για έγκαιρες ενημερώσεις

Για να λαμβάνετε ειδοποιήσεις κάθε φορά που υπάρχει ενημέρωση προς τα πάνω, εγγραφείτε στη λίστα linux-kernel-announce. Αυτό θα σας επιτρέψει να λαμβάνετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου κάθε φορά που κυκλοφορεί ένας νέος πυρήνας ώστε να μπορείτε να ενημερώσετε και να προωθήσετε όσο το δυνατόν γρηγορότερα.

Ενδιαφέροντα Άρθρα