Linux kernel patchelés
A HupWiki-ből...
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
cdfs: honlap (2.4; 2.6)
exec-shield: honlap (2.4; 2.6)
Genetic Library honlap (2.6)
grsecurity: honlap (2.4; 2.6)
openwall: honlap (2.0, 2.2, 2.4)
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
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!