Patching kernel-ului Linux

Întrebări frecvente Linux kernel Lista de discuții - acest lucru este de a aplica un patch pentru kernel-ul, sau, mai precis, cum să patch-uri este un nucleu potrivit. În acest document, acesta este explicat.







În plus față de explicația modului de aplicare și de a anula patch-uri, aici este o scurtă descriere a structurii diferitelor ramuri ale miezului (și exemple de modul în care să se aplice patch-uri specifice ale acestora).

Ce este un plasture (patch-uri)?

Patch, sau patch-uri - un document text mic, care conține esența modificărilor între două versiuni diferite ale codului sursă. Patch-urile sunt create folosind programul „dif“. Pentru aplicarea corectă a plasturelui trebuie să știți, pe baza căruia a fost creat, și în care o nouă versiune a patch-ul se va transforma sursele de kernel. Ambele pot fi reprezentate în fișierul de metadate și plasturele poate, în numele său.

Cum se aplica sau se debaraseze de patch-uri?

Plasturele este aplicat printr-un program de „plasture“. Acest program citește fișierul diferență (sau patch-uri) și face modificări în locurile potrivite codul sursă.

Patch-uri pentru kernel-ul Linux sunt generate în raport cu directorul părinte care conține sursele de kernel.

Acest lucru înseamnă că, căile de fișier în fișierul de patch-uri conține numele sursei kernel-ului director cu privire la care a fost generat de patch-uri (sau alte nume de directoare, cum ar fi #xab; a / # xbb; sau #xab; b / # xbb;).

Deoarece acest nume este puțin probabil să se potrivească cu numele pe directorul mașinii codul sursa kernel-ului (deși de multe ori ajută pentru a vedea patch-ul a fost creat pentru o versiune a kernel-ului), trebuie să mergeți în directorul care conține codul sursa kernel-ului, și apoi aruncați primul element din de călătorie în fișierul nume de fișiere patch-uri înainte de utilizarea sa (pentru aceasta este cheia pentru -p1 program „patch-uri“).

Pentru a anula plasturele aplicat, utilizați -R cheie. De exemplu, dacă aplicați plasturele după cum urmează:

apoi anula, puteți:

Cum de a transfera un / program de patch-uri de patch-uri de fișiere 'patch-uri'?

Acest lucru (și alte sisteme de operare de tip Unix) se poate face în mai multe moduri. In toate exemplele de mai jos, am da fișierul (dezarhivati ​​într-un), program prin intrarea standard, folosind următoarea sintaxă:

Programul „plasture“ poate trece numele de fișier folosind opțiunea -i, ca în exemplul următor:

Dacă fișierul de patch-uri este conținută în gzip arhivă sau bzip, și nu doriți să-l despacheta în avans, puteți apela „patch-uri“, după cum urmează:

Dacă fișierul patch este conținut în arhivă, și doriți să-l extrage manual înainte de utilizare (în exemplele de mai jos, se presupune), puteți face acest lucru:

Acest lucru vă va da un fișier text simplu pe care le puteți transfera „patch-uri“ program de intrare standard sau opțiunea -I, după cum doriți.

Printre program de alte chei interesante „patch-uri“ sunt -s, forțând programul nu afișează niciun mesaj, cu excepția mesajelor de eroare, permițându-le să observe mai bine și cheia --dry-rula ceea ce face programul de ușor pentru a da o listă a ceea ce se va întâmpla, dar, în realitate, nimic nu sa schimbat. În cele din urmă, comutator --verbose spune „patch-uri“ program pe nevoile maxime de date de ieșire a ceea ce se întâmplă.

erori de bază

În cazul în care programul „plasture“ se aplică patch-ul, ea încearcă să verifice fișierul în diferite moduri. În special, se verifică faptul că fișierul este un fișier de corecție valid și codul de biți care trebuie să fie modificate, în conformitate cu contextul plasturelui din jur.

În cazul în care programul „patch“ consideră că plasturele ceva arată greșit, ea poate alege una dintre opțiunile de comportament - să refuze să efectueze modificările și a ieși, sau să încerce să găsească o cale de a aplica plasturele cu câteva modificări.

Un exemplu de o situație #xab, că ceva este greșit # xbb, care programul încearcă să stabilească - este atunci când schimbările de context sunt prezente, rândurile sunt, dar au alte camere. Deci, se poate întâmpla, de exemplu, în cazul în care programul „patch“ face schimbări în mijlocul fișierului, dar din anumite motive, câteva linii la începutul fișierului a fost adăugat sau eliminate. Dacă totul altceva este în ordine, programul ajustează în mod obișnuit numerele de linie și se aplică plasturele.

Ori de câte ori un program de „plasture“ se aplică un patch pentru pre-modificare, vă spune că plasturele este aplicat pe ( „puful“) „se potrivesc“.

Trebuie sa fii atent cu aceste schimbări, pentru că, chiar dacă totul pare corect, nu este întotdeauna cazul, și ceva poate fi greșit.

În cazul în care programul se confruntă cu schimbările pe care ea nu se poate face chiar o potrivire, ea le respinge și produce un fișier cu extensia .rej (respinge fișier). O puteți citi pentru a afla exact ce modificări nu au putut fi aplicate, și repara ceva, dacă doriți.

Dacă nu se aplică la codul sursă de patch-uri sale nucleu neoficiale și de a folosi doar patch-uri din resursa kernel.org, aplicarea lor în ordinea corectă, și nu face modificări neautorizate la sursa kernel-ului, nu veți vedea mesajul „Fuzz“ sau „respinge plasture „programul““. În cazul în care sunt emise, acesta indică deteriorarea sursei locale sau de patch-uri descărcate. Ar trebui să încercați din nou să încărcați patch-uri, iar dacă aceasta nu rezolvă problema, descărcați codul sursă complet pentru kernel-ul de la kernel.org.

Să ne uităm la alte rapoarte care pot genera un program de „plasture“.

În cazul în care programul se oprește și afișează mesajul „File Corecția:“, atunci ea nu a putut găsi fișierul de patch-uri. Acest lucru înseamnă, de obicei, că ați uitat să specificați cheia -p1 sau nu sunt în directorul corect. Dar, uneori, se întâmplă atunci când aplicați un plasture pentru care aveți nevoie de un -p0 cheie, nu -p1 (explora un fișier de corecție pentru ea, și dacă da, este o eroare umană, de a crea un patch, și este reparabil).

Dacă primiți un mesaj de "Halcă # 2 a reușit în 1887 cu 2 Fuzz (offset 7 linii)." sau similare, ceea ce înseamnă că programul „patch“ reglementat aplica modificările (în acest caz, a trebuit să se mute la 7 linii de locul unde acestea urmau să fie aplicate acestora, a devenit posibil să se aplice). Fișierul rezultat se poate transforma corect sau greșit în funcție de motivele pentru care fișierul sursă nu a fost la fel cum era de așteptat. Ori de câte ori se întâmplă atunci când încercați să aplicați un plasture la versiunea greșită a kernel-ului.







Dacă primiți un mesaj de „Halcă # 3 ESUAT la 2387.“, acest lucru înseamnă că programul nu a putut să aplice plasturele chiar și cu potrivire. În acest caz, informațiile din fișierul generat .rej o schimbare nu a reușit, precum și un fișier cu extensia .orig, conținând textul original, care nu a putut fi înlocuit.

Mesajul „Reversed (sau anterior aplicate) plasture detectat! Să presupunem -R? [N]“ înseamnă că programul a constatat că plasturele a fost deja aplicată.

Dacă ați aplicat cu adevărat acest patch, iar a doua aplicare - aceasta este o greșeală, apăsați [n] și să finalizeze programul. Dacă ați folosit-o, și acum doriți să anulați, pur și simplu, uitând pentru a specifica tasta R, apăsați [y]. Acest lucru se întâmplă, de asemenea, atunci când oamenii creează un plasture inversat sursă și destinație directoarele, și în acest caz, utilizarea plasturelui și este revenirea.

După cum sa menționat anterior, aceste erori nu apar atunci când aplicați patch-urile oficiale de la kernel.org de resurse în ordinea corectă și nu a modificat sursa kernel-ului. Deci, în cazul în care acest lucru se întâmplă cu patch-uri de la kernel.org, acesta reprezintă un patch de descărcare denaturare sau codul sursă de pe mașina dvs., și ar trebui să fie complet re-pompa sursa kernel-ului sau de patch-uri pe care intenționați să se aplice.

Există un program de „plasture“ alternative?

Se va lăsa să pleci, de exemplu, prin 2.6.12.2 la 2.6.12.3 într-un singur pas. Flag Programul interdiff -z vă permite să lucrați cu patch-uri în gzip arhive și bzip2, fără a scoate-le în prealabil cu mâna și fără utilizarea zcat și bzcat.

Cu toate acestea, în timp ce programul va salva un pas sau doi, se recomandă să se aplice tuturor etapelor, deoarece, în unele cazuri, interdiff poate să nu reușească.

Alte instrumente interesante sunt diffstat, care prezintă un rezumat al modificărilor efectuate de patch-uri de software; lsdiff, care afișează o listă scurtă de fișiere care specificați fișierul de patch-uri afectate, împreună cu un număr variabil de rânduri; și grepdiff, care arată o listă de fișiere de patch-uri modificate pentru care elementele de patch-uri conțin expresia regulată specificată.

De unde pot obține patch-uri?

În schimb puteți utiliza ftp.kernel.org ftp.cc.kernel.org. în cazul în care cc - codul de țară. Folosind o oglindă pentru a descărca cel mai aproape de tara permite o încărcare mai rapidă, reducerea traficului la nivel mondial și de a reduce sarcina de pe serverul kernel.org. Prin urmare, dacă este posibil, folosiți o oglindă.

kernel 2.6.x

Există practic versiuni stabile emise de către Linus Torvalds. Cu cât numărul, eliberarea în stare proaspătă.

Dacă regresie detectată sau alte dezavantaje grave de corectare plasture -stable (vezi mai jos) este produs pentru aceste versiuni de bază. De îndată ce există un nou kernel 2.6.x eliberare ramura principală și a lansat un patch care îi permite să meargă la eliberarea anterioară.

Pentru a aplica patch-ul de la 2.6.11 la 2.6.12, trebuie să faceți următoarele (rețineți că aceste patch-uri nu sunt aplicate nuclee 2.6.xy versiuni, acestea pot fi aplicate numai la bază versiunea kernel 2.6.x - dacă vrei să mergi de la 2,6 la 2.6.xy .x + 1, trebuie să aplicăm mai întâi patch-ul, de abrogare a 2.6.xy, adică revenirea la 2.6.x).

Iată câteva exemple:

nucleu 2.6.x.y

Kernel numere de versiune cu chetyrehtsifrennymi numit -stable. Acestea conțin o remedieri critice minime referitoare la problemele de securitate sau regresii semnificative descoperite într-un anumit nucleu 2.6.h.

Această ramură, care sunt recomandate pentru utilizatorii care doresc să aibă un nucleu stabil și nu sunt interesați în dezvoltarea și testarea versiunilor experimentale.

În cazul în care nu există nici un nucleu 2.6.x.y disponibile, versiunea curentă este nucleul stabil cu cel mai mare număr de 2.6.x.

Notă: Echipa de dezvoltare -stable face de obicei disponibile patch-uri nu numai pentru ultima versiune majoră, dar patch-uri incrementale. Cu toate acestea, mai jos sunt doar eu vorbesc despre nici un patch-uri incrementale. Aceleași patch-uri Incremental disponibile pe ftp://ftp.kernel.org/pub/linux/kernel/v2.6/incr/

Nu este patch-uri incrementale înseamnă, de exemplu, că patch-uri pentru 2.6.12.3 actualizare de bază versiunea 2.6.12, dar nu intermediar versiunea 2.6.12.2. Pentru a aplica un patch kernel-ului existent 2.6.12.3 2.6.12.2, trebuie să anulați mai întâi 2.6.12.2 patch-uri (du-te înapoi la versiunea 2.6.12), și apoi aplicați plasturele 2.6.12.3.

Iată un exemplu:

Kernel -rc: core Release Candidate

Ele sunt cu experiență de bază, produs de Linus, atunci când consideră că arborele git curent (sursa de management cod kernel aplicație) este într-o stare destul de potrivită pentru testare.

Aceste nuclee nu sunt stabile, și trebuie să vă așteptați probleme intermitente, în cazul în care acestea sunt de gând să ruleze. Cu toate acestea, ele sunt cele mai stabile din toate ramurile de bază cu experiență și, în plus, se va transforma în cele din urmă într-un nucleu stabil. Astfel, este important pentru a le testa pentru mulți oameni.

Aceasta este o alegere bună pentru cei care doresc să testeze noul kernel, dar, de fapt, nu vrea să experimenteze. (Aceste persoane ar trebui să citească următoarele secțiuni și -git -mm de mai jos).

Patch-uri -rc - nu elementare, ele sunt aplicate la 2.6.x. nucleu de bază cum ar fi plasturi 2.6.x.y, notat mai sus. O parte din nucleu numărul versiunii pentru -rcN sufix indică numărul de versiune de kernel, care, în cele din urmă, totul a devenit.

Astfel, 2.6.13-RC5 înseamnă că acest lucru este eliberarea cincilea candidat pentru 2.6.13 nucleu și plasturele trebuie aplicat la versiunea 2.6.12.

Iată trei exemple de impunerea de patch-uri:

Aceste instantanee de zi cu zi Linus copac nucleu (făcute în GIT depozit, astfel încât numele său).

Aceste patch-uri reprezintă, de obicei, de zi cu zi și starea actuală a versiunii Linus. Ele sunt mai mult experimentale decât nucleu -rc ca generate automat, fără măcar o privire sumară la performanțele lor.

Patches -git - nu incremental și aplicat pe kernel bază kernel 2.6.x sau bază 2.6.x.rc, ceea ce este evident din numele lor. Patch numit 2.6.12-git1 se aplică kernel 2.6.12, și un plasture cu numele 2.6.13-RC3-git2 - la 2.6.13-RC3.

Iată câteva exemple de aplicare a patch-uri:

Acest nucleu experimental produs Andryu Mortonom (Andrew Morton).

ramură -mm este un fel de teren de testare pentru formarea de patch-uri cu noi caracteristici și alte caracteristici experimentale.

După unele patch-uri se dovedește utilitatea în ramura -mm în timpul unora din timp, Andrew ofera lui Linus pentru a fi incluse în ramura principală.

Deși în conformitate cu normele stabilite, aceste patch-uri sunt trimise la Linus prin ramura -mm, aceste reguli nu sunt respectate întotdeauna. Maintainers subsisteme (sau dezvoltatorii), uneori, trimite patch-uri direct la Linus, chiar dacă acestea au fost combinate și testate în -mm (și, uneori, chiar și fără testare prealabilă în -mm).

Pentru a se asigura de testare maximă în cele mai multe cazuri, ar trebui să depună eforturi pentru a obține patch-uri prin intermediul -mm.

Această ramură este în dezvoltare constantă și conține multe caracteristici experimentale; există o mulțime de patch-uri de depanare nu este potrivit pentru ramuri principale, etc. Este cea mai experimentală a tuturor ramurilor descrise în acest document.

Aceste boabe nu sunt adecvate pentru a fi utilizate în sisteme care trebuie să fie stabil, utilizarea lor are un risc mai mare atunci când se ocupă cu nuclee de orice altă ramură (nu uita de rezervă - ar trebui să fie efectuată prin utilizarea oricărui nucleu experimental, și așa mai departe mai mult atunci când se lucrează cu ramuri de miez -mm).

Pentru aceste nuclee, în plus față de toate celelalte patch-uri experimentale, de obicei susținute de diverse modificări la principalele nuclee ramură -git nuclee pentru a elibera timp.

Miezurile de testare -mm este foarte lăudabil și ocupare este eșecuri buruienilor de regresie, corupere de date (sau alte erori), înainte de a le aplica în ramuri principale Linus. Dar testere -mm ramură trebuie să înțeleagă că, în aceste versiuni mai multe erori decât oricare alta.

nucleele -mm nu sunt eliberate pe orice plan de set, dar este, de obicei, între edițiile de nucleu -rc din mai multe versiuni -mm nucleu (de obicei unul la trei). plasturi -mm ramuri sunt aplicate la 2.6.x nucleu de bază (pentru a ieși din -rc versiune) sau la ramura -rc Linus.

Iată câteva exemple de cum să le folosească:

Pe această listă de clarificări cu privire la diferitele copaci kernel pot fi completate.

Sper că acum clar cum să aplice diverse patch-uri și miezuri de testare ajutor.

Mulțumiri speciale Rendi Danlep (Randy Dunlap), Rolfe Eike Beru (Rolf Eike Bere), Linus Torvalsu (Linus Torvalds), Dumnezeu Eggert (Bodo Eggert), Johannes Stezenbahu (Johannes Stezenbach), Grant Cody (Grant Coady), Paul Machek (Pavel Machek) și altele, pe care am uitat să precizeze, pentru ajutorul lor în crearea acestui document.