Yama Nedir?

patch (yama) uygulaması, iki dosya arasındaki farklılıkları bulmak icin kullanılan GNU'nun diff uygulaması elde edilen yama dosyasını kullanarak eski dosyanın yeni surumunu elde etmekte kullanılır. diff oldukca fazla seceneğe sahiptir fakat genellikle iki dosya arasında değişen satırları listelemek ve değişen satırları orjinal halleri ile gostermek icin listeleyen bir dosyanın oluşturulması icin kullanılır. Yama asıl olarak kaynak kodu dosyalarını iceren bir dizini, butun kaynak kodunu Internet'ten indirmeden guncellemek icin kullanılır. Bir yamayı indirmek esas olarak sadece değişen satırları indirmektir.

Yamanın Kullanılması

patch uygulaması, butun seceneklerini iceren oldukca iyi hazırlanmış bir kılavuz sayfası ile beraber gelmektedir. Fakat bunların sadece ikisi butun işinizi gormek icin yeterli olmaktadır.


Kod:
patch -p1 < [yama_dosyası]

patch -R < [yama_dosyası]


-p1 seceneği yama dosyası icindeki dosya adlarından en soldakini cıkarmak icin kullanılır. Bu seceneği kullanmak icin yamayı, yamanacak dizine yerleştirin ve daha sonra bu dizin icinde


Kod:
patch -p1 < [yama_dosyası]


komutunu verin.
Bu seceneği daha iyi anlamak icin aşağıdaki PIII.patch orneğini ele alalım:



Kod:
# diff -u -recursive --new-file koc-yama/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- koc-yama/linux/Documentation/Configure.help Sat Jan 29 04:37:46 2000
+++ linux/Documentation/Configure.help Sat Jan 29 04:20:53 2000
@@ -1637,10 +1637,10 @@
all x86 CPU types (albeit not optionally fast), you can specify "386" here.
- if you specify one of "486" or "586" or "Pentium" or "PPro", then
- the kernel will not necessarily run on earlier architectures (e.g. a
- Pentium optimized kernel will run on a Ppro, but not necessarily on
- a i486).
+ if you specify one of "486" or "586" or "Pentium" or "PPro" or "PIII",
+ then the kernel will not necessarily run on earlier architectures
+ (e.g. A Pentium optimized kernel will run on a Ppro, but not necessarily
+ on a i486).


Bu şekilde hazırlanmış olan bir yamayı -p1 seceneği ile uyguladığımız zaman patch uygulaması bulunduğumuz dizinde Documentation adlı altdizini arar daha sonra ise Configure.help adlı dosyaya bakar. Bu ornekte eksi işaretli olan satır ile artı işaretli olan satır yer değiştirir. Patch calışırken cıktıyı ekrana gonderir fakat bu cıktı genellikle cok hızlı ilerler. Ozgun dosyalar, yeni yamanmış dosyalar onların yerini alırken *.orig diye tekrar isimlendirilir.

Cekirdeğe Yama Uygulaması icin Bazı Oneriler

Bircok Linux kullanıcısı patch'i cekirdek kodunu yamamak icin kullanır. Bunun icin en kolay yol bir kabuk betiği olan patch-kernel'i kullanmaktir. Bu betik cekirdeğin kaynak kod dizini icinde scripts adlı altdizinde bulunur. Bu betik Nick Holloway tarafindan 1995 yılında yazılmıştır. Birkac yıl sonra Adam Sulmicki bu betiğe bazı sıkıştırma algoritmaları desteğini ekelmiştir. Bunlar *.bz, *.bz2, compress, gzip ve normal metindir. Bu betik sizin /usr/src/linux dizini icinde bulunduğunuzu ve yamanızında bu dizinde olduğunu varsayar. Bu iki değeri komut satırında



Kod:
patch-kernel [ kaynakdizini [yamadizini] ]


yazarak değiştirebilirsiniz. Patch-kernel, herhangi bir yama başarısız olursa durur. Fakat eğer yama başarılı olursa find komutunu calıştırır ve butun *.orig dosyalarını siler. Eğer komutların cıktılarını gormek veya *.orig dosyalarını saklamak istiyorsaniz patch komutunu doğrudan uygulayabilirsiniz. Bu yontem ben de dahil olmak uzere bircok kişi tarafından daha guvenilir bulunuyor. Sıkıştırılmış yamayı acmadan uygulamak icin aşağıdaki kanallama (pipe) kullanılabilir:


Kod:
# gzip -cd patchXX.gz | patch -p1


Yama uygulandıktan sonra işlemin uygulanamadığı dosyaları bulmak icin find komutu aşağıdaki şekilde kullanılır.


Kod:
# find . -name *.rej


Eğer find, *.rej dosyasını bulursa ismini ekrana basar. Eğer find birşey bulamazsa yama doğru olarak uygulanmış demektir. Bir başka işlem *.orig dosyalarını bulmak ve silmektir. Bunun icin find'i aşağıdaki şekilde kullanabiliriz:


Kod:
# find . -name *.orig -print0 | xargs -0r rm -f


Eğer bu komutu her seferinde elle yazmak istemezseniz .bash_profile, .bash_login veya .profile dosyasına aşağıdaki şekilde bir alias ekleyebilirsiniz:

Bu size origbul yazarak yukarıdaki komutu calıştırmanızı sağlar. Sistemden cıkmadan bu komutu calıştırmanız icin:


Kod:
# source .profile


yazmanız yeterlidir.
Şimdi bu anlattıklarımıza ornek olması amacı ile linux_dvd_2_2_12_diff.patch adlı yamayı uygulayalım ve sonra bu yamayı kaldıralım:


Kod:
# cd /usr/src/linux
# patch -p1 < linux_dvd_2.2.12_diff.patch
patching file drivers/block/ide-cd.c
Hunk #1 succeeded at 2097 (offset 10 lines).
Hunk #2 succeeded at 2631 (offset 2 lines).
patching file drivers/block/ide-cd.h
Hunk #2 succeeded at 666 (offset 4 lines).
Hunk #4 succeeded at 793 (offset 4 lines).
patching file include/linux/cdrom.h
# find . -name *.rej → (ekrana birşey basılmazsa işlem başarı ile tamamlanmış)
# find . -name *.orig
./drivers/block/ide-cd.c.orig
./drivers/block/ide-cd.h.orig → (yamanmış dosyaların orijinalleri)
# find . -name *.orig -print0 | xargs -0r rm -f → (bu dosyaları silmek icin)


Buraya kadar olan komutlar ile cekirdeği yamama işlemimiz bitiyor. Şimdi bu yamayı kaldıralım:


Kod:
# patch -p1 -R < linux_dvd_2_2_12_diff.patch
patching file drivers/block/ide-cd.c
Hunk #1 succeeded at 2097 (offset 10 lines).
Hunk #2 succeeded at 2308 (offset 2 lines).
patching file drivers/block/ide-cd.h.
Hunk #2 succeeded at 663 (offset 4 lines).
Hunk #4 succeeded at 784 (offset 4 lines).
patching file include/linux/cdrom.h.
# find . -name *.rej
# origbul


Boylece uygulamış olduğumuz yamayı kaldırmış olduk.


__________________