Çekirdeğe Yama Uygulanması
Önceki Çekirdeğe Yama Uygulanması ve Çekirdeğin Derlenmesi NASIL Sonraki
Çekirdeğe Yama Uygulanması
Yama Nedir?
patch (yama) uygulaması, iki dosya arasındaki farklılıkları bulmak için kullanılan GNU'nun diff uygulaması elde edilen yama dosyasını kullanarak eski dosyanın yeni sürümünü elde etmekte kullanılır. diff oldukça fazla seçeneğe sahiptir fakat genellikle iki dosya arasında değişen satırları listelemek ve değişen satırları orjinal halleri ile göstermek için listeleyen bir dosyanın oluşturulması için kullanılır. Yama asıl olarak kaynak kodu dosyalarını içeren bir dizini, bütün kaynak kodunu Internet'ten indirmeden güncellemek için kullanılır. Bir yamayı indirmek esas olarak sadece değişen satırları indirmektir.
Yamanın Kullanılması
patch uygulaması, bütün seçeneklerini içeren oldukça iyi hazırlanmış bir kılavuz sayfası ile beraber gelmektedir. Fakat bunların sadece ikisi bütün işinizi görmek için yeterli olmaktadır.
patch -p1 < [yama_dosyası]

patch -R < [yama_dosyası]
-p1 seçeneği yama dosyası içindeki dosya adlarından en soldakini çıkarmak için kullanılır. Bu seçeneği kullanmak için yamayı, yamanacak dizine yerleştirin ve daha sonra bu dizin içinde
patch -p1 < [yama_dosyası]
komutunu verin.
Bu seçeneği daha iyi anlamak için aşağıdaki PIII.patch örneğini ele alalım:
# diff -u -r -N 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 seçeneği ile uyguladığımız zaman patch uygulaması bulunduğumuz dizinde Documentation adlı altdizini arar daha sonra ise Configure.help adlı dosyaya bakar. Bu örnekte eksi işaretli olan satır ile artı işaretli olan satır yer değiştirir. Patch çalışırken çıktıyı ekrana gönderir fakat bu çıktı genellikle çok hızlı ilerler. Özgün dosyalar, yeni yamanmış dosyalar onların yerini alırken *.orig diye tekrar isimlendirilir.
Çekirdeğe Yama Uygulaması için Bazı Öneriler
Birçok Linux kullanıcısı patch'i çekirdek kodunu yamamak için kullanır. Bunun için en kolay yol bir kabuk betiği olan patch-kernel'i kullanmaktır. Bu betik çekirdeğin kaynak kod dizini içinde scripts adlı altdizinde bulunur. Bu betik Nick Holloway tarafindan 1995 yılında yazılmıştır. Birkaç yıl sonra Adam Sulmicki bu betiğe bazı sıkıştırma algoritmaları desteğini eklemiştir. Bunlar *.bz, *.bz2, compress, gzip ve normal metindir. Bu betik sizin /usr/src/linux dizini içinde bulunduğunuzu ve yamanızında bu dizinde olduğunu varsayar. Bu iki değeri komut satırında
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 çalıştırır ve bütün *.orig dosyalarını siler. Eğer komutların çıktılarını görmek veya *.orig dosyalarını saklamak istiyorsaniz patch komutunu doğrudan uygulayabilirsiniz. Bu yöntem ben de dahil olmak üzere birçok kişi tarafından daha güvenilir bulunuyor. Sıkıştırılmış yamayı açmadan uygulamak için aşağıdaki borulama (pipe) kullanılabilir:
# gzip -cd patchXX.gz | patch -p1
veya
# bzip2 -dc patchXX.bz2 | patch -p1
Yama uygulandıktan sonra işlemin uygulanamadığı dosyaları bulmak için find komutu aşağıdaki şekilde kullanılır.
# 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 için find'i aşağıdaki şekilde kullanabiliriz:
# 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:
alias origbul="find .-name *.orig -print0 | xargs -0r rm -f"
Bu size origbul yazarak yukarıdaki komutu çalıştırmanızı sağlar. Sistemden çıkmadan bu komutu çalıştırmanız için:
# source .profile
yazmanız yeterlidir.
Şimdi bu anlattıklarımıza örnek olması amacı ile linux_dvd_2_2_12_diff.patch adlı yamayı uygulayalım ve sonra bu yamayı kaldıralım:
# 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 için)
veya eğer yukarıdaki alias'ı tanımlamışsak:
#origbul
Buraya kadar olan komutlar ile çekirdeği yamama işlemimiz bitiyor. Şimdi bu yamayı kaldıralım:
# 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
Böylece uygulamış olduğumuz yamayı kaldırmış olduk.
Önceki Üst Ana Başlık Sonraki
Çekirdeğe Yama Uygulanması ve Çekirdeğin Derlenmesi NASIL Başlangıç Çekirdeğin Derlenmesi
Bir Linux Kitaplığı Sayfası