Ako aktualizovať jadro systému Android na najnovšiu verziu systému Linux

Uviedli sme sprievodcov v jadrách pre Android, ako napríklad „Ako zostaviť vlastné jadro“ a „Najlepšie vlastné jadrá pre Android“, dnes vám však ukážeme, ako upstream jadro proti najnovšej stabilite systému Linux.

Prosím, uvedomte si, že toto sú pokročilé veci - ak ste ešte nikdy nezostavili jadro, mali by ste postupovať podľa vyššie uvedenej príručky „Ako zostaviť vlastné jadro“ a táto príručka bude zahŕňať výbery zlučovania a zlúčenia z najnovších Linux- stabilné jadro s jadrom Android pred jeho kompiláciou.

Upgradovanie jadra systému Android na najnovšiu verziu systému Linux má mnoho pozitívnych výhod, napríklad aktuálnosť s najnovšími potvrdeniami o zabezpečení a opravy chýb - niektoré výhody a nevýhody vysvetlíme neskôr v tejto príručke.

Čo je jadro stabilné v systéme Linux?

Linux-stabilný, ako už názov napovedá, je stabilnou vetvou jadra Linuxu. Druhá ruka je známa ako „mainline“, čo je hlavná vetva . Celý vývoj jadra Linuxu sa odohráva v hlavnej línii a vo všeobecnosti sleduje tento proces:

  1. Linus Torvalds odoberie od svojich správcov veľa opráv počas dvoch týždňov.
  2. Po týchto dvoch týždňoch uvoľní jadro rc1 (napr. 4, 14-rc1).
  3. Za každý týždeň počas nasledujúcich 6-8 týždňov uvoľní ďalšie jadro RC (napr. 4.14-rc2, 4.14-rc3, atď.), Ktoré obsahuje LEN opravy chýb a regresie.
  4. Akonáhle bude považovaný za stabilný, bude vydaný ako tarball na stiahnutie na org (napr. 4.14).

Čo sú jadrá LTS?

Greg vyberie každý rok jedno jadro a bude ho udržiavať buď dva roky (LTS) alebo šesť rokov (predĺžené LTS). Sú navrhnuté tak, aby mali produkty, ktoré potrebujú stabilitu (napríklad telefóny s Androidom alebo iné zariadenia IOT). Proces je presne rovnaký ako vyššie, len sa to deje dlhšie. Momentálne existuje šesť jadier LTS (ktoré si vždy môžete prezrieť na stránke s vydaním kernel.org):

  • 4, 14 (LTS), udržiavaný Greg Kroah-Hartman
  • 4, 9 (LTS), udržiavaný Greg Kroah-Hartman
  • 4, 4 (eLTS), udržiavaný Greg Kroah-Hartman
  • 4, 1 (LTS), udržiavaná Sasha Levin
  • 3, 16 (LTS), udržiavané Ben Hutchings
  • 3.2 (LTS), udržiavané Ben Hutchings

Aké sú výhody rozšírenia jadra systému Android na platformu Linux Stable?

Ak sú odhalené / opravené dôležité zraniteľné miesta, stabilné jadrá sú prvé, ktoré ich získajú. Preto bude vaše jadro Android oveľa bezpečnejšie proti útokom, bezpečnostným chybám a iba chybám vo všeobecnosti.

Linux stabilný obsahuje opravy pre mnoho ovládačov, ktoré moje zariadenie Android nepoužíva, nie je to väčšinou zbytočné?

Áno a Nie, v závislosti od toho, ako definujete „väčšinou“. Linuxové jadro môže obsahovať veľa kódu, ktorý sa v systéme Android nepoužíva, ale to nezaručuje, že pri zlúčení nových verzií nebudú z týchto súborov dochádzať ku konfliktom! Pochopte, že prakticky nikto nevytvára každú jednotlivú časť jadra, dokonca ani najbežnejšie Linuxové distribúcie ako Ubuntu alebo Mint. To neznamená, že by ste tieto opravy nemali robiť, pretože pre ovládače, ktoré spúšťate, existujú opravy. Vezmite napríklad ramená / ramená64 a ext4, ktoré sú najbežnejšou architektúrou systému Android a súborovým systémom. V 4.4, od 4.4.78 (verzia najnovšej značky Oreo CAF) po 4.4.121 (posledná značka proti prúdu), sú to tieto čísla pre záväzky týchto systémov:

 ~ / kernels / linux-stabilný (master) $ git log --format =% h v4.4.78..v4.4.121 | wc -l2285 ~ / kernels / linux-stabilný (master) $ git log --format =% h v4.4.78..v4.4.121 arch / arm | wc -l58 ~ / kernels / linux-stabilný (master) $ git log --format =% h v4.4.78..v4.4.121 arch / arm64 | wc -l22 ~ / kernels / linux-stabilný (master) $ git log --format =% h v4.4.78..v4.4.121 fs / ext4 | wc -18 

Najnáročnejšou časťou je počiatočné vychytávanie; akonáhle ste úplne v obraze, zlúčenie nového vydania, ktoré zvyčajne neobsahuje viac ako 100 potvrdení, netrvá vôbec času. Výhody, ktoré to prináša (väčšia stabilita a lepšia bezpečnosť pre vašich používateľov), by však mali tento proces vyžadovať.

Ako zlúčiť Linuxové stabilné jadro do jadra Android

Najprv musíte zistiť, akú verziu jadra vaše zariadenie s Androidom používa.

Ako sa zdá byť triviálne, je potrebné vedieť, kde musíte začať. Spustite nasledujúci príkaz v strome jadra:

 urobiť jadrovú premenu 

Vráti späť verziu, na ktorej ste. Prvé dve čísla sa použijú na určenie vetvy, ktorú potrebujete (napr. Linux-4.4.y pre akékoľvek jadrá 4.4) a posledné číslo sa použije na určenie verzie, ktorú musíte začať so zlúčením (napr. Ak používate 4.4) .21, zlúčite 4.4.22 ďalej).

Získajte najnovší zdroj jadra zo stránky kernel.org

kernel.org obsahuje najnovší zdroj jadra v úložisku stabilnom v Linuxe. V dolnej časti tejto stránky sa nachádzajú tri odkazy na načítanie. Podľa môjho názoru je zrkadlo spoločnosti Google zvyčajne najrýchlejšie, ale vaše výsledky sa môžu líšiť. Spustite nasledujúce príkazy:

 git remote add-linux-stabilný //kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit načítať linux-stabilný 

Rozhodnite sa, či chcete zlúčiť celé jadro alebo prevziať čipy

Ďalej si budete musieť vybrať, či chcete zlúčiť záväzky alebo výbery cherry. Tu sú klady a zápory každého a kedy ich budete chcieť urobiť.

POZNÁMKA: Ak je váš zdroj jadra vo forme tarballu, pravdepodobne budete musieť čerešne vybrať, inak získate tisíce konfliktov súborov, pretože git zaplňuje históriu výlučne na proti smeru, nie to, čo má OEM alebo CAF. zmenilo. Preskočte na krok 4.

Zbieranie čerešní:

Pros:

  • Ľahšie vyriešite konflikty, pretože presne viete, čo spôsobuje konflikt.
  • Ľahšie oživiť, pretože každý záväzok je sám o sebe.
  • Ľahšie sa rozdeľuje, ak sa vyskytne problém

Zápory:

  • Trvá to dlhšie, pretože každý záväzok musí byť vybratý individuálne.
  • Trochu ťažšie povedať, či je spáchanie na prvý pohľad na prvý pohľad

Zlúčiť

Výhody :

  • Je to rýchlejšie, pretože nemusíte čakať na zlúčenie všetkých čistých záplat.
  • Je ľahšie zistiť, kedy je odovzdanie potvrdené od začiatku, pretože nebudete príkazcom, predradeným správcom bude.

Zápory:

  • Riešenie konfliktov môže byť o niečo ťažšie, pretože budete musieť vyhľadať, ktorý záväzok spôsobuje konflikt pomocou git log / git viny, to vám priamo nepovie.
  • Rebasing je obtiažny, pretože nemôžete znova zlúčiť zlúčenie, ponúkne sa tým, že vyberiete všetky potvrdenia individuálne. Nemali by ste sa však často opakovať, namiesto toho by ste namiesto toho mali používať git reverziu a git zlúčenie, ak je to možné.

Odporučil by som urobiť čerešňu, aby ste zistili prípadné konflikty problémov spočiatku, potom by sme ich zlúčili, a potom by sme sa vrátili k potvrdeniu problému, takže aktualizácia je jednoduchšia (pretože zlúčenie je rýchlejšie po aktualizácii).

Potvrdenia pridajte do svojho zdroja po jednej verzii

Najdôležitejšou časťou tohto procesu je jedna verzia naraz. Vo vašej protiprúdovej sérii sa môže vyskytnúť problémová záplata, ktorá by mohla spôsobiť problém so zavedením systému alebo poškodiť niečo ako zvuk alebo nabíjanie (vysvetlené v časti Tipy a triky). Z tohto dôvodu je dôležité robiť prírastkové zmeny verzií. Je ľahšie nájsť problém pri 50 potvrdeniach, ako pri niektorých verziách viac ako 2000. Odporúčam vykonať úplnú zlúčenie, len keď viete, že všetky problémy sa vyskytli a vyriešili konflikty.

Zbieranie čerešní

formát:

 git cherry pick 

Príklad:

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

Zlúčiť

formát:

 spojiť git 

Príklad:

zlúčenie git v3.10.74

Odporúčam sledovať konflikty v zlúčených odovzdaniach odstránením značiek #.

Ako vyriešiť konflikty

Nemôžeme poskytnúť podrobnú príručku na riešenie každého konfliktu, pretože zahŕňa dobrú znalosť jazyka C, ale tu je niekoľko rád.

Ak sa zlučujete, zistite, čo je príčinou konfliktu. Môžete to urobiť jedným z dvoch spôsobov:

  1. git log -pv $ (make kernelversion) .. pre získanie zmien medzi vašou aktuálnou verziou a najnovšou z upstream. Parameter -p vám poskytne zmeny vykonané každým potvrdením, aby ste ich mohli vidieť.
  2. Spustite git vinu v súbore, aby ste dostali hashe každého spáchania v oblasti. Potom môžete spustiť program git show –format = fuller, aby ste zistili, či bol príkaz z hlavnej línie / stajne, Google alebo CodeAurora.
  • Zistite, či už máte záväzok. Niektorí dodávatelia, ako je Google alebo CAF, sa budú snažiť vyhľadať kritické chyby, napríklad opravu špinavého COW, a ich spätné správy by mohli byť v rozpore s predchádzajúcimi. Môžete spustiť git log –grep = ”” a zistiť, či niečo vráti. Ak sa tak stane, môžete vynechať odovzdanie (ak vyberáte čerešne pomocou resetovania gitov --hard &&it - cherry-pick –continue) alebo ignorovať konflikty (odstráňte <<<<< >>>>>).
  • Zistite, či existuje backport, ktorý rozpráva rozlíšenie. Google a CAF radi podporia niektoré opravy, ktoré by stabilný nebol. Stabilný bude často musieť prispôsobiť rozlíšenie hlavného záväzku absencii určitých záplat, ktoré sa spoločnosť Google rozhodne backportovať. Na hlavné potvrdenie sa môžete pozrieť spustením git show (hash hlavnej línie bude k dispozícii v správe potvrdenia stabilného potvrdenia). Ak je k dispozícii backport, môžete zmeny zahodiť alebo môžete použiť hlavnú verziu (čo je zvyčajne potrebné urobiť).
  • Prečítajte si, čo sa odhodlanie snaží urobiť, a zistite, či je problém už vyriešený. Niekedy môže CAF opraviť chybu nezávislú od upstream, čo znamená, že môžete prepísať ich opravu upstream alebo ju zahodiť, ako je uvedené vyššie.

V opačnom prípade to môže byť len dôsledok pridania modelu CAF / Google / OEM, v takom prípade stačí zamiešať niektoré veci.

Tu je zrkadlo linuxového archívu kernel.org na serveri GitHub, ktorý môže byť ľahší pri vyhľadávaní zoznamov potvrdení a líši sa pri riešení konfliktov. Odporúčam najskôr ísť do zoznamu potvrdených zoznamov a lokalizovať problémové potvrdenie, aby ste videli pôvodný rozdiel a porovnali ho s vašimi.

Príklad adresy URL: //github.com/nathanchance/linux-stable/commits/linux-3.10.y/arch/arm64/mm/mmu.c

Môžete to urobiť aj cez príkazový riadok:

 git log .. git show 

Riešenie uznesení sa týka iba kontextu. VŽDY by ste mali zaistiť, aby sa váš konečný rozdiel porovnal proti smeru toku dát spustením nasledujúcich príkazov v dvoch samostatných oknách:

 git diff HEAD git diff v $ (make kernelversion) .. $ (git tag --sort = -taggerdate -lv $ (make kernelversion | cut -d. -f 1, 2) * | head -n1) 

Povoliť opakovanie

Git má funkciu s názvom rerere (znamená Reuse Recorded Resolution), čo znamená, že keď zistí konflikt, zaznamená to, ako ste ho vyriešili, aby ste ho mohli znova použiť neskôr. To je užitočné najmä pre chronických rebaserov pri zlučovaní aj vyberaní čerešní, pretože stačí spustiť pridávanie git. && git - pokračovať v opakovaní privádzania na vyššiu úroveň, pretože konflikt bude vyriešený tak, ako ste ho predtým vyriešili.

Môže sa povoliť spustením nasledujúceho príkazu vo vašom repozitári jadra:

 git config rerere.enabled true 

Ako git bisect pri spustení do kompilátora alebo runtime chyba

Vzhľadom na to, že pridávate značný počet potvrdení, je veľmi možné uviesť chybu kompilátora alebo runtime. Namiesto toho, aby ste sa vzdali, môžete použiť zabudovaný nástroj bisit spoločnosti git na zistenie hlavnej príčiny problému! V ideálnom prípade budete budovať a blikať každú verziu jadra, keď ju pridáte, takže rozdeľovanie bude trvať menej času, ak je to potrebné, ale môžete roztriediť 5 000 záväzkov bez problémov.

Čo urobí git bisect bude mať rozsah záväzkov, od miesta, kde je problém k miestu, kde nebol prítomný, a potom začnite znižovať rozsah záväzkov na polovicu, čo vám umožní zostaviť a otestovať a dať mu vedieť, či je dobrý alebo nie., Bude to pokračovať dovtedy, kým nevyplivne záväzok spôsobujúci váš problém. V tom okamihu to môžete buď opraviť, alebo vrátiť.

  1. Začať rozdeľovať: začnite rozdeľovať
  2. Označte aktuálnu revíziu ako zlú: git bisect bad
  3. Označte revíziu ako dobrú: git bisect good
  4. Budujte s novou revíziou
  5. Na základe výsledku (ak je problém prítomný alebo nie), povedzte git: git bisect good ALEBO git bisect bad
  6. Vypláchnite a opakujte kroky 4-5, kým sa nenájde problém s potvrdením!
  7. Vráťte alebo opravte problém s potvrdením.

POZNÁMKA: Fúzie budú musieť dočasne spustiť git rebase -i, aby na svoju vetvu použili všetky záplaty kvôli správnemu rozdeľovaniu, pretože rozdeľovanie so zavedenými zlúčeniami sa často krát odhlási na predbežné potvrdenia, čo znamená, že nemáte žiadne konkrétne potvrdenia pre Android. Na požiadanie sa k tomu dostanem do hĺbky, je mi to však potrebné veriť. Akonáhle ste zistili problém s potvrdením, môžete ho vrátiť alebo premeniť na zlúčenie.

NEVYŤAŽUJTE aktualizácie

Mnoho nových vývojárov je v pokušení to urobiť, pretože je to „čistejšie“ a „ľahšie“ spravovať. To je hrozné z niekoľkých dôvodov:

  • Autorstvo sa stratilo. Pre ostatných vývojárov je nespravodlivé, ak majú za svoju prácu pridelený kredit.
  • Rozdeľovanie nie je možné. Ak potlačíte sériu potvrdení a niečo je problémom v tejto sérii, je nemožné povedať, čo odovzdanie spôsobilo problém v prípade squash.
  • Budúce čerešne sú ťažšie. Ak potrebujete oživiť s rozdrvenými sériami, je ťažké / nemožné povedať, odkiaľ konflikt vyplýva.

Ak chcete dostávať včasné aktualizácie, prihláste sa na odber poštového zoznamu linuxového jadra

Aby ste dostali upozornenie vždy, keď dôjde k aktualizácii, prihláste sa na zoznam linux-kernel-announce. To vám umožní získať e-mail zakaždým, keď sa vydá nové jadro, takže môžete aktualizovať a tlačiť čo najrýchlejšie.

Zaujímavé Články