LINUX KERNEL MODÜL

linux centos red hat rhel kernel ve modul nedir

Dikkat: Bu yazıda geçen komutlar hem Linux tabanlı Centos hem de Linux tabanlı  Red Hat (RHEL) işletim sisteminde geçerlidir.

Modül Nedir Ne İşe Yarar?

Modüller C programlama dili ile geliştirilen yazılımlardır. Sıradan bir programa benzer. Bu programlar da kernel’e yani Linux çekirdeğe eklenir ve çalışabilir hale getirilir.

Driver yazılımları aslında birer modüldür. Bir donanıma ait örneğin DVD okuyucusuna ait driver yazılımını (sürücü) düşünelim. Bu driver ile kernel işletim sistemi ile donanımın haberleşmesini ve birlikte çalışmasını sağlar.

Bu işlem için kernel’e eklenti yapmamız gerekecektir. Kernel’de yapılan değişiklikler sonucu kernel baştan derlenecek ve sistem yeniden başlayacaktır. Eğer bu linux tabanlı işletim sistemi sürekli açık kalması gereken bir sunucu ise problem oluşturacaktır. Bu tip durumlarda modüller hayat kurtarmaktadır. Çünkü sistemi kapatmadan modülleri devreye alabiliriz.

Linux tabanlı işletim sistemlerinde hazır modüller vardır. Örneğin default’ta yüklü olarak gelen donanımlara ait sürücüler (driver) gibi… Bunlar dışında bir modül de eklenebilir. Veya ihtiyaç kalktığı anda modül kaldırılır ve kernel’in boyutu azaltılmış olur.

Modüllere özgü “insmod”,”modprobe”,”rmmod”, “lsmod”, “modinfo” gibi araçlar vardır.

Modüllerin Sistemdeki Yerleri

Kernel modüllerine ait dosya ve dizinler “/lib/modules” konumunda bulunurlar ve sistem açılırken yüklenirler.

Bu dizin içeriği “ls -al /lib/modules” komutu ile görülebilir.

linux centos red hat rhel kernel modullerinin yeri
“Kernel Modüllerinin Yeri”

Donanımlara ait sürücüler gibi dosyalar bu dizin altında bir yerlerdedir ve modüller “.ko” uzantılı olurlar. Örneğin aşağıda bazı modüller listelenmiştir.

linux centos red hat rhel .ko uzantili modul dosyalari
“.ko Uzantılı Modül Dosyaları”

Modül Bilgilerini Görme (modinfo Aracı)

Modüllerin bilgilerini görüntülemek için aşağıdaki komut kullanılır.

  • modinfo /home/nizam/modül_adi.ko (modülün yolu dosya uzantısıyla birlikte belirtilmelidir)

Bu komut aşağıda örneklendirilmiştir.

linux centos red hat rhel modinfo komutu ile modul bilgisi goruntuleme
“modinfo Komutu İle Modül Bilgisini Öğrenme”

Yüklü Modülleri Görmek (lsmod Aracı)

Yüklü modülleri görmek için aşağıdaki komutlardan birini kullanmanız gerekmektedir.

  • lsmod

Veya

  • cat /proc/modules

Aşağıda “lsmod” komutu ile yüklü modüller listelenmiştir.

linux centos red hat rhel lsmod komutu ile yuklu modulleri listeleme
“Yüklüyüz Modülleri Listeleme”

Modüllerin Kaldırılması/Silinmesi (rmmod Aracı)

Kullanılmayan modüller aşağıdaki komut ile silinebilmektedir.

  • rmmod modül_adi [modül_adi_2 modül_adi_3]

Silmek istediğiniz modül başka modüller tarafından kullanılıyor ise hata verir. Eğer modül kullanılmıyorsa silinir.

Eğer modülü bağımlı modüller ile birlikte kaldırmak istiyorsanız “-r” parametresi ile birlikte “modprobe -r” şeklinde komut kullanılır.

  • rmmod -r modül_adi

Kernel’e Modül Yüklemek (insmod/modprobe Araçları)

Kernel’e farklı fonksiyonlar eklemek için modüller yazılabilir. Bu modüller de sistemi kapatmadan çekirdeğe eklenebilir.

Aşağıdaki yapıda komut kullanılır.

  • modprobe modül_adi.ko (sadece modül adını belirtmek yeterlidir)
  • modprobe modül_adi (sadece modül adını belirtmek yeterlidir)

Veya

  • insmod /home/nizam/modül_adi.ko (modülün yolu dosya uzantısıyla birlikte belirtilmelidir)

Bazı modüller başka modüllerin yüklenmiş olmasına bağımlıdır. Yani bazı modüller yüklü ise yükleme başarılı olur. Bağımlı olunan modüllerin yüklü olmadığı durumlarda ise insmod komutu başarısız olur. Bu durumda önce bağımlı olunan modülleri tek tek manuel olarak yani elle yüklenmesi gereklidir ya da bu zahmetten kurtulmak için modprobe aracı kullanılır. Çünkü modprobe otomatik bu modülleri depmod komutu tarafından geliştirilen veri tabanında arar ve yükler.

insmod komutunda modülün yolu dosya uzantısıyla birlikte belirtilmelidir. Ancak modprobe komutunda sadece modül adını belirtmek yeterlidir.

Eğer parametre gerekliyse aşağıdaki şekilde parametreler gönderilebilir.

  • modprobe modül_adi.ko param=parametre1 param=parametre2

Modülleri Düzenleme

/etc/modprobe.conf dosyası modprobe komutunun çalışmasını kontrol eden çeşitli parametreleri belirlemek için kullanılır. Örneğin,

  • Modüllere daha uygun isimlerle kullanmamızı sağlayan takma isimler (alias)
  • Yüklenme aşamasında modüle kendiliğinden (default) geçecek parametreler
  • Bir modül yüklendiği veya kaldırıldığı zaman yürütülecek kabuk (bash) komutları

gibi isteklerinizi bu dosya aracılığıyla gerçekleştirebilirsiniz.

ÖRNEK: Basit Bir Kernel Modülü Yazma

1.Masaüstünde “module” isimli bir klasör oluştur. İçerisinde “nizammodul.c” isimli bir dosya oluştur ve dosya içeriğine aşağıdaki komutları yaz.

#include <linux/module.h> // butun kernel modullerde kullanilir

#include <linux/kernel.h> // printk icin kullanildi

#include <linux/init.h> // included for __init and __exit macros

MODULE_AUTHOR(“nizam”);

MODULE_DESCRIPTION(“networkkampus_modul”);

static int __init hello_init(void)

{

printk(KERN_INFO “Selam Networkkampus Insanlari !\n”);

return 0; // Non-zero return means that the module couldn’t be loaded.

}

static void __exit hello_cleanup(void)

{

printk(KERN_INFO “Modul siliniyor…\n”);

}

module_init(hello_init);

module_exit(hello_cleanup);

Bu örnekte;

linux/module.h : Bu header dosyası bütün kernel modüllerde kullanılır.

linux/kernel.h : Bu header dosyası ise printk() kullanabilmek için kullanılır.

printk() C dilindeki printf() gibidir fakat kernel seviyesinde ekrana yazdırma için kullanılır. Ekrana çıktı vermez, “/var/log/messages” dosyasında veya “dmesg” komutunun çıktısında görülebilir.

linux centos red hat rhel kernele basit bir modul yazma
“C Dili İle Kernel’e Basit Bir Modül Yazma”

2.Yine masaüstünde oluşturulan “module” isimli klasör içerisine modülü derlemek için bir “Makefile” isimli dosya oluştur ve aşağıdaki komutları içerisine yaz.

obj-m += nizammodul.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

linux centos red hat rhel kernel modul derleme
“C Dili İle Yazılmış Bir Modülü Derleme İçin Makefile Dosyası Yazma”

3.Şimdi aynı klasörde açtığımız terminal ekranda “make” komutunu kullanalım ve derleme işlemini yapalım.

linux centos red hat rhel make komutu ile kernele modul derleme
“make Komutu İle Kernel’e Modül Derleme”

Derleme sonrası klasörde 7 adet dosya daha oluştu. Toplamda 9 dosya oldu.

linux centos red hat rhel make komutu ile derleme sonrasi
“make Komutu İle Derleme İşlemi Sonrası”

Yine aynı klasörde “modinfo nizammodul.ko” komutu ile yeni modülümüzü kontrol edelim.

linux centos red hat rhel modinfo komutu ile modul bilgisi goruntuleme
“modinfo Komutu İle Yeni Eklediğimiz Modüle İlişkin Bilgileri Öğrenme”

Görüldüğü üzere bağımlılığı olmayan, “nizammodul.ko” isimli, yazarı “nizam” olan ve “networkkampus_modul” açıklamalı bir modül oluşturmuşuz.

4.Şimdi modülümüzü “insmod” komutu ile ekleyelim.

linux centos red hat rhel insmod komutu ile kernele modul yuklemek
“insmod Komutu İle Kernel’e Modül Yüklemek”

Yükleme aşamasında “root” olmayı unutmayalım. Bakalım modülümüz yüklenmiş mi? Bunun için “lsmod | grep nizam*” komutunu kullanabiliriz.

linux centos red hat rhel lsmod komutu ile yuklu modullere bakmak
“lsmod Komutu İle Yüklü Modüllere Bakmak”

Görüldüğü üzere modülümüz yüklendi. Peki “nizammodul.c” dosyasında C dili ile yazdığımız komutlar çalışıyor mu? Yani programımız doğru çalışıyor mu? Bunun için de “dmesg | tail -1” komutunu kullanalım.

linux centos red hat rhel dmesg komutu ornek
“C Dilinde Yazdığımız Modüldeki printk Komutu Çalışıyor mu?”

Burada “tail -1” parametresi “son satırı göster !“anlamına gelmektedir. Eğer canlı görmek isteniyorsa “tail -f / /var/log/messages” komutu kullanılabilir. Bu şekilde “rmmod nizammodul.ko” komutu ile modül silindiğinde “Modul siliniyor…“, “insmod /home/nizam/Desktop/module/nizammodul.ko” komutu kullanıldığında da “Selam Networkkampus Insanlari !” mesajı ekrana anlık olarak düşecektir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir