Linux kernel patchelés

A HupWiki-ből...

Tartalomjegyzék

Linux kernel patchelés mini-HOWTO

Linux kernel patchelés mini-HOWTO
Micskó Gábor trey () hup ! hu - Hungarian Unix Portal

v.1.1, 2004. február. 3. kedd, 14:24:26 - Copyright Hungarian Unix Portal
v.1.0, 2002. szeptember 12. Csütörtök, 10:12:24 - Copyright Hungarian Unix Portal

Mi a patch?

A patch jelentése magyarul "folt". Nevét onnan kaphatta, hogy a meglevő forráskódunkat "megjavítjuk" a patch-csel, vagy egy benne levő biztonsági lyukat befoltozunk vele. A patchelés során valamely szoftver forráskódját módosítjuk annak érdekében, hogy azon hibajavítást, vagy funkció bővítést végezzünk (a legtöbb esetben). A patch nem más, mint az eredeti forráskód és a módosított forráskód különbsége (differenciája (diff)) egy file formájában. A patchet legtöbbször a diff névre hallgató programmal állítjuk elő.

Miért hasznos a patch?

Gondoljuk el, hogy egy több 10 megabyte-os forráskódon dolgozunk. Ebben a forráskódban minimális módosítást végzünk. Ahhoz, hogy másokhoz eljuttassuk az általunk végzett módosításokat, nem szükséges a több 10 megabyte-os forráskódot elküldeni. Elegendő az általunk készített patchet kiadni. Annak segítségével azután bárki aki rendelkezik az eredeti forráskóddal, könnyen elkészítheti a módosított forráskódot.

A Linux kernel patchelése

(A Patchset készítés részletesen ismerteti egy konkrét patchset összeállításán keresztül a lépseket és a buktatókat.)

A Linux kernel forráskódját letölthetjük a kernel.org-ról FULL vagy patch formájában. A FULL verziót akkor érdemes letöltnünk, ha még egyáltalán nem rendelkezunk annak a kernelnek a forrásával, amelyet használni szeretnénk. Ha már rendelkezünk egy korábbi kernel forrással (ugyanabból a kernelfából), akkor érdemesebb csak a két kernel közötti differenciát letölteni patch formájában.

Példa: Tegyük fel, hogy mi a 2.6.1-es Linux kernelt szeretnénk használni, és már rendelkezünk a 2.6.0-ás kernel forrásával. Ilyenkor felesleges letöltnünk a teljes 2.6.1-es kernel forrást.

Akkor mégis hogyan lesz a 2.6.0-ás kernel forrásból 2.6.1-es? Egyszerű. Letöltjük a patch-2.6.1.bz2 névre hallgató patchet, és alkalmazzuk a 2.6.0-ás kernel forrásán. Lássuk:

Kernel forrás előkészítése

trey@alderaan:~$ su

(jelszó)

alderaan:/home/trey# cd /usr/src

(2.6.0-ás kernel teljes forrás kibontása, ezzel már régebb óta rendelkezünk)

alderaan:/usr/src# tar xvzf linux-2.6.0.tar.gz

Kernel patch letöltése

alderaan:/usr/src# cd linux-2.6.0

alderaan:/usr/src/linux-2.6.0# wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.1.bz2
--14:53:28-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.1.bz2
=> `patch-2.6.1.bz2'
IP keresés www.kernel.org... 204.152.189.116
Csatlakozás www.kernel.org[204.152.189.116]:80-hoz... kapcsolódva.
HTTP kérés elküldve, várom a választ... 200 OK
Hossz: 777,959 [application/x-bzip2]

100%[======================================>] 777,959 74.86K/s ETA 00:00

14:53:38 (80.17 KB/s) - `patch-2.6.1.bz2' lementve [777959/777959]

A kernel patchelése

A kernel megpatcheléséhez adjuk ki az alábbi parancsot:

ha a patch .bz2-ben van

alderaan:/usr/src/linux-2.6.0# bunzip2 -cd patch-2.6.1.bz2 | patch -p1

ha a patch .gz-ben van

alderaan:/usr/src/linux-2.6.0# gunzip -cd patch-2.6.1.gz | patch -p1

ha a patch cleartext formában van

patch -p1 < patch-2.6.1

vagy

cat patch-2.6.1 | patch -p1

patch visszavonása, ha a patch cleartext formában van

cat patch-2.6.1 | patch -p1 -R

Patch kezelés quilt segítségével

A quilt egy script gyűjtemény, ami egyszerűvé teszi nagymennyiségű (akár több ezer) patch kezelését.

Lényege, hogy egy series állomány tartalma alapján (minden sora egy-egy patch állomány neve; a #-t megjegyzésként kezeli) kezeli a patch/ könyvtárban lévő patcheket.
(Megj.: a series és a patch/ egyaránt legyen ugynazon a könyvtárszinten, ahol a patchelés történni fog; tehát pld kernel forrás esetén ott, ahol a Makefile is van.)

Alapvető parancsok:

quilt push
A seriesben szereplő következő patch beillesztése (fentről lefelé sorról sorra).
quilt pop
Egy patch visszavonása (lentről felfelé).

Alapvető opciók:

-a
Autómatikusan végigfut a series állományon.
-q
Csendes üzemmód: csak a patchek nevét írja ki, a patchelés folyamatát nem.

További infók: man quilt

Hol veszed hasznát?
Legegyszerűbb példa belenézni egy -mm broken-outba.

Buktatók a patcheléskor

  • Több független patchet nem érdemes használni, mert a foltok inkompatibilisek lehetnek egymással
  • Tapasztalataim szerint a patchelés nem megy, ha pl.: az /usr/src/linux könyvtárban vagyunk, a patch pedig pl. a ../kernel/ez.a.patch útvonalon.

Utolsó simítások

Ha sikeresen lefutott a patchelés, akkor nevezzük át a kernel könyvtárt linux-2.6.0-ról linux-2.6.1-re, és kész is a 2.6.1-es kernelforrásunk. Konfiguráljuk, fordítsuk, stb. ízlés szerint. Jó étvágyat!

Fontosabb patchek és patchgyűjtemények

Patchek

badmem: honlap (2.4; 2.6)

cdfs: honlap (2.4; 2.6)

-ck: honlap böngészés (2.6)

exec-shield: honlap (2.4; 2.6)

Genetic Library honlap (2.6)

grsecurity: honlap (2.4; 2.6)

kexec: infó letöltés (2.6)

openwall: honlap (2.0, 2.2, 2.4)

PaX: honlap (2.2; 2.4; 2.6)

realtime-preempt: honlap (2.6)

The Linux Kernel Translation Project: honlap (2.6)

Patch gyűjtemények

ArchCK: honlap (2.6) (-ck alapokon)

-cko: honlap (2.6) ck overloaded (-ck alapokon)

Debian kernel patchek: böngészés (2.4; 2.6)

Gentoo Linux Kernel Patches: böngészés (2.6)

KernelNewbies: Where to get patches honlap (részben elavult)

-lck: honlap (2.4)

Linux Kernel 2.4 Useful Patches: honlap (2.4)

-mc: merge candidate

-mm: honlapja (2.6)

nitro: honlap (2.6) (-ck alapokon)

tiny: honlap (2.6)

wolk: honlap böngészés (2.2; 2.4; 2.6)

Copyright, licenc, visszajelzés és ilyesmi

Micskó Gábor trey () hup ! hu - Hungarian Unix Portal - http://www.hup.hu/

Ez a dokumentum szabadon másolható és terjeszthető a GNU GPL terjesztési feltételei szerint.

Garancia nincs.

Visszajelzéseket, építő jellegű kritikát a trey () hup ! hu email címre várok.

Sok szerencsét!