İçindekiler:
- Donanım ve Kernel İlişkisi
- Aygıt İnceleme Komutları: lspci ve lsusb
- Kernel Modüllerinin İncelenmesi
Donanım ve Kernel İlişkisi
Bir bilgisayar donanımı temel olarak aşağıdaki bileşenlerden oluşur:
- İşlemci (CPU) – Komutları çalıştırır.
- Bellek (RAM) – Çalışan programların geçici verilerini tutar.
- Disk (SSD / HDD / NVMe) – Kalıcı veri depolama alanıdır.
- Giriş aygıtları – Klavye, mouse gibi kullanıcı etkileşim araçları.
- Çıkış aygıtları – Ekran (GPU üzerinden), hoparlör vb.
-
Ağ arayüzü – Ethernet ya da Wi-Fi kartı.
-
Uygulamaların Donanıma Erişimi : Bir uygulama ekrana yazı yazmak, dosya okumak ya da ağ üzerinden veri göndermek istediğinde sistem çağrıları (system calls) aracılığıyla çekirdeğe (kernel) başvurur. Kernel, bu isteği alır ve ilgili sürücü (driver) üzerinden donanımla iletişim kurar. Kernel uygun driver’ı belirler. Driver donanımın teknik seviyesinde işlem yapar. Sonuç tekrar kernel üzerinden uygulamaya döner. Bu yapı sayesinde sistem hem güvenli hem de donanımdan bağımsız çalışabilir.
-
Driver ve Kernel İlişkisi: Linux’ta her sürücü ya kernel içine gömülü olarak derlenmiştir ya da yüklenebilir bir kernel modülü olarak bulunur. Eğer ilgili driver kernel’e gömülü değilse ve modül olarak derlenmişse, burada: Gerekirse ilgili driver (kernel modülü) devreye girer. Bu modül zaten yüklüyse kullanılır; değilse sistem modprobe mekanizması ile yükleyebilir.
- Kernel modülleri çalışan bir sistemde yüklenip kaldırılabileceği gibi kalıcı olarak da yüklenip kaldırılması sağlanabilir.
Kernel Uygun Driver’ı Nasıl Belirler?
Bir donanım sistemi üzerinde bulunduğunda (örneğin PCI aygıtı, USB cihazı veya disk), kernel bu donanımı algılar ve kimliğini belirler. Bu kimlik, aygıtın bağlı olduğu veri yoluna göre farklı şekilde tanımlanır:
- PCI cihazları → Vendor ID ve Device ID ile
- USB cihazları → VID / PID ile
- Platform cihazları → ACPI veya Device Tree ile tanımlanır.
Platform cihazları, fiziksel olarak sistem üzerinde sabit bulunan ve varlığı firmware (ACPI ya da Device Tree) tarafından bildirilen entegre bileşenlerdir. Örneğin güç yönetimi denetleyicileri, dahili kontrol birimleri veya anakart üzerindeki bazı yerleşik donanımlar bu kapsama (ACPI) girer.
Sistem açılışında ya da yeni bir cihaz takıldığında kernel ilgili veri yolunda bir enumeration (tarama) işlemi yapar. Bu süreçte:
- Donanım algılanır.
- Aygıtın kimlik bilgileri okunur.
- Kernel, kendi içinde kayıtlı sürücü listesiyle bu kimliği eşleştirir.
Linux’ta sürücüler (driver), ya doğrudan kernel içine gömülü olabilir ya da yüklenebilir kernel modülü olarak bulunabilir. Eğer eşleşen sürücü kernel içinde yerleşik değilse, userspace tarafında çalışan mekanizma (örneğin udev) gerekli kernel modülünü otomatik olarak yükler (modprobe çağrısı ile).
Uygun sürücü bulunduğunda:
- Sürücü aygıt ile eşleşir (bind edilir)
- Sürücü aygıt için gerekli başlatma işlemlerini yapar
- Donanım sistem tarafından kullanılabilir hale gelir
Özetle kernel, donanımı kimlik bilgilerine göre tanımlar, bu kimliği sürücülerin destek listesiyle eşleştirir ve uygun sürücüyü yükleyip aygıta bağlayarak cihazı aktif hale getirir.
Aygıt İnceleme Komutları: lspci ve lsusb
Linux’ta sistemde bulunan donanımları incelemek için kullanılan temel komutlardan ikisi:
lspci-
lsusb - Bu komular ile PCI ve USB cihazların detay bilgisinin yanında kernel modülleri ile ilişkisini de görüntüleyebiliriz.
- Bu komutlar, kernel’in tanıdığı aygıtları ilgili bus (veriyolu) üzerinden listeler.
lspci – PCI Aygıtlarını Listeleme
lspci komutu, sistemdeki PCI ve PCIe cihazlarını gösterir.
PCI üzerinden bağlanan tipik cihazlara şunlar örnek verilebilir:
- Ekran kartı (GPU)
- Ethernet kartı
- NVMe kontrolcüsü
- SATA kontrolcüsü
- Ses kartı
Örneğin bir harici PCI video kartını inceliyor olalım:
lspci
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620
00:14.0 USB controller: Intel Corporation USB 3.0 Controller
00:1f.2 SATA controller: Intel Corporation SATA Controller
Daha detaylı bilgi için listedeki id kullanılabilir:
lspci -s <id> -k
lspci -s <id> -v
Bu çıktı şunları gösterir:
- Cihaz bilgisi
- Kullanılan kernel driver (
kernel driver in use) - Yüklenebilir alternatif kernel modülleri (
kernel modules)
Bu özellikle driver sorunlarını teşhis etmek için kritiktir.
Aşağıdaki örnekte bir wireless kartı driver bilgisi görülmektedir:
lspci -s 04:02.0 -v
04:02.0 Network controller: Ralink corp. RT2561/RT61 802.11g PCI
Subsystem: Linksys WMP54G v4.1
Flags: bus master, slow devsel, latency 32, IRQ 21
Memory at e3100000 (32-bit, non-prefetchable) [size=32K]
Capabilities: [40] Power Management version 2
kernel driver in use: rt61pci
Buradaki önemli satır:
kernel driver in use: rt61pci
Bu, cihazın şu anda aktif olarak hangi driver tarafından yönetildiğini gösterir.
[acs@archlinux ~]$ lspci -s 02:00.0 -v
02:00.0 Network controller: Intel Corporation Wireless 8265 / 8275 (rev 78)
Subsystem: Intel Corporation Dual Band Wireless-AC 8265 [Windstorm Peak]
Flags: bus master, fast devsel, latency 0, IRQ 133
Memory at ef100000 (64-bit, non-prefetchable) [size=8K]
Capabilities: <access denied>
Kernel driver in use: iwlwifi
Kernel modules: iwlwifi
Birden Fazla Modül Durumu
Aşağıdaki örnekte bir NVIDIA GPU için driver bilgisi görülmektedir:
[acs@archlinux ~]$ lspci -s 01:00.0 -k
01:00.0 3D controller: NVIDIA Corporation GP108M [GeForce MX150] (rev a1)
Subsystem: ASUSTeK Computer Inc. Device 163e
Kernel driver in use: nvidia
Kernel modules: nouveau, nvidia_drm, nvidia
[acs@archlinux ~]$ lspci -s 01:00.0 -v
01:00.0 3D controller: NVIDIA Corporation GP108M [GeForce MX150] (rev a1)
Subsystem: ASUSTeK Computer Inc. Device 163e
Flags: bus master, fast devsel, latency 0, IRQ 134
Memory at ee000000 (32-bit, non-prefetchable) [size=16M]
Memory at d0000000 (64-bit, prefetchable) [size=256M]
Memory at e0000000 (64-bit, prefetchable) [size=32M]
I/O ports at e000 [size=128]
Expansion ROM at ef000000 [virtual] [disabled] [size=512K]
Capabilities: <access denied>
Kernel driver in use: nvidia
Kernel modules: nouveau, nvidia_drm, nvidia
Burada:
kernel driver in use: nvidia: Aktif olarak kullanılan driver.kernel modules:..: Bu cihaz için uygun olabilecek diğer modüller.
Bu durum özellikle açık kaynak (nouveau) ve kapalı kaynak (nvidia) driver’lar arasında geçiş yaparken önemlidir.
lsusb – USB Aygıtlarını Listeleme
lsusb komutu, sistemdeki USB bus üzerinde bulunan aygıtları listeler.
USB üzerinden bağlanan tipik cihazlara şunlar örnek verilebilir:
- Klavye
- Mouse
- USB bellek
- Webcam
- Harici disk
- Bluetooth adaptörü
- Wi-Fi adaptörü
Örneğin cihaz üzerindeki Bluetooth adaptörü inceliyor olalım:
[acs@archlinux ~]$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 13d3:5a07 IMC Networks VGA UVC WebCam
Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bluetooth adaptörü listede görüyoruz.
Tek satırda görüntülemek için lsusb -s <busid>:<devid> kullanılır:
[acs@archlinux ~]$ lsusb -s 01:03
Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Bu çıktıda:
Bus 001: Cihazın bağlı olduğu USB bus numarasıDevice 003: Aygıt numarası8087: Vendor ID (Üretici kimliği)0a2b: Product ID (Ürün kimliği)
Vendor ve Product ID bilgileri, hangi driver’ın kullanılacağını belirlemede önemlidir.
Burada driver veya modül bilgisini henüz göremiyoruz.
Benzer olarak lsusb -t komutunu da kullanabilirdik.
[acs@archlinux ~]$ lsusb -t
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/12p, 480M
|__ Port 006: Dev 002, If 0, Class=Video, Driver=uvcvideo, 480M
|__ Port 006: Dev 002, If 1, Class=Video, Driver=uvcvideo, 480M
|__ Port 008: Dev 003, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 008: Dev 003, If 1, Class=Wireless, Driver=btusb, 12M
/: Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/6p, 5000M
Bu komut USB aygıtlarını ağaç (tree) yapısında gösterir ve:
- Bağlı olduğu port
- Cihaz sınıfı (Class)
- Kullanılan driver (varsa) bilgilerini içerir.
Eğer aygıt için eşleşen bir kernel modülü varsa, satırın sonunda şu şekilde görünür:
Driver=btusb
Buradaki Driver= alanı, cihazın hangi kernel modülü tarafından yönetildiğini gösterir.
Bluetooth adaptörünün kullandığı btusb hem bir driver hem de bir kernel modülü olduğunu görüyoruz.
Modinfo komutunu kullanarak ilgili modülün detaylarını görebiliriz:
[acs@archlinux ~]$ modinfo btusb
filename: /lib/modules/6.17.9-arch1-1/kernel/drivers/bluetooth/btusb.ko.zst
license: GPL
version: 0.8
description: Generic Bluetooth USB driver ver 0.8
author: Marcel Holtmann <marcel@holtmann.org>
srcversion: 6A8C48A720E1F879F7AFCAF
alias: usb:v8087p0A5Ad*dc*dsc*dp*ic*isc*ip*in*
alias: usb:v0930p*d*dc*dsc*dp*icFFisc01ip01in*
alias: usb:v413Cp*d*dc*dsc*dp*icFFisc01ip01in*
alias: usb:v13D3p*d*dc*dsc*dp*icFFisc01ip01in*
alias: usb:v050Dp*d*dc*dsc*dp*icFFisc01ip01in*
Yine daha detaylı bilgi için lsusb -v -d <busid>:<devid> komutunu kullanabiliriz:
$ lsusb -v -d 8087:0a2b
Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Negotiated speed: Full Speed (12Mbps)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 224 Wireless
bDeviceSubClass 1 Radio Frequency
bDeviceProtocol 1 Bluetooth
bMaxPacketSize0 64
idVendor 0x8087 Intel Corp.
idProduct 0x0a2b Bluetooth wireless interface
bcdDevice 0.10
iManufacturer 0
iProduct 0
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
...
lsusb -v -d <busid>:<devid> donanım hakkında detaylı bilgi verir, ancak o donanımı hangi modülün (sürücünün) kontrol ettiğini doğrudan söylemez.
Sonuç olarak İlgili modülü görüntülemenin en kolay yolunun lsusb -t komutu olduğunu gördük.
USB Cihazların Farklılığı
Doğal olarak USB cihazları ve PCI cihazları arasında farklılıklar bulunur. USB cihazları dinamik olarak (hotplug) bağlanıp çıkarılabilir.
Bir USB aygıt takıldığında süreç şu şekilde işler:
- USB cihaz takılır
- Kernel USB bus üzerinden cihazı algılar
- Vendor ID / Product ID okunur
- Uygun driver aranır
- Gerekirse modül yüklenir (modprobe)
- Cihaz kullanılabilir hale gelir
Device Class Nedir?
lsusb komutlarında gördüğümüz Class alanı cihazın genel kategorisini belirtir.
Örneğin:
- Human Interface Device (HID) → Klavye, mouse
- Wireless → Kablosuz adaptörler
- Mass Storage → USB bellek, harici disk
- Vendor Specific Class → Üreticiye özel cihazlar
Bu bilgi usb cihazları sınıflandırmanın yanında hangi tür driver’ın gerekli olabileceğini anlamaya yardımcı olur.
Kernel Modüllerinin İncelenmesi
Kernel modülleri (veya tam adıyla Loadable Kernel Module - LKM), işletim sisteminin çekirdeğine (kernel) özellik ekleyip çıkarmaya yarayan kod parçalarıdır.
Modüller olmasa dünyadaki her türlü fare, klavye, ekran kartı ve Wi-Fi adaptörünün sürücüsünü kernel’ın içine gömmek zorunda kalınırdı. Bu da kernel’ın devasa boyutta olmasına ve sistemin çok yavaş açılmasına neden olurdu.
Her modül bir driver (sürücü) değildir. Sürücüler haricinde sistemde aşağıdaki gibi modüller bulunebilir:
- Dosya Sistemi Modülleri (ext4, xfs, vfat, ntfs3 veya isofs)
- Ağ ve Güvenlik Modülleri (Netfilter / Iptables)
- Kriptografi (Şifreleme) Modülleri
- Sanallaştırma Modülleri
Örnek bir sistemde yüklü modül sayısı:
[acs@archlinux ~]$ lsmod | wc -l
195
Bir modülün sistemde yüklü olması kullanıldığı anlamına gelmez. Bir sistemde yüklü (RAM’de yer kaplayan) ama o an hiçbir donanım veya yazılım tarafından aktif olarak çağrılmayan modüller bulunabilir.
Modüller Üzerinde Temel Komutlar
Sistem üzerinde modülleri yönetmek için temel komutlar aşağıdaki gibidir:
lsmod: Şu an “canlı” olan, yani bellekte yüklü tüm modülleri listeler.- Örnek:
lsmod | grep video(Video ile ilgili modülleri bulur).
- Örnek:
modprobe: Bir modülü yükler veya kaldırır.- Yüklemek için:
sudo modprobe btusb - Kaldırmak için:
sudo modprobe -r btusb
- Yüklemek için:
modinfo: Bir modülün kim tarafından yazıldığını, hangi lisansa sahip olduğunu ve hangi parametrelerle çalıştığını gösterir.- Örnek:
modinfo iwlwifi
- Örnek:
Modülü Parametre İle Geri Yükleme
sudo modprobe -r btusb # Önce yüklü modülü kaldır
sudo modprobe btusb enable_autosuspend=N # Parametreyle geri yükle
lsmod ve kmod Araçları
Standart bir Linux sisteminde genellikle çok sayıda kernel modülü yüklü durumdadır.
lsmod komutu ile sistem üzerinde yüklü modülleri ve bağımlılılarını görebiliriz.
Bu modüllerle etkileşim kurmanın en doğru yolu, kmod paketinin sağladığı araçları kullanmaktır.
kmod araçları şunları yapabilir:
- Modül yükleme
- Modül kaldırma
- Modül listeleme
- Bağımlılık çözme
- Alias kontrolü
- Modül özelliklerini inceleme
Örneğin:
lsmod
Module Size Used by
kvm_intel 138528 0
kvm 421021 1 kvm_intel
iTCO_wdt 13480 0
iTCO_vendor_support 13419 1 iTCO_wdt
snd_usb_audio 149112 2
snd_hda_codec_realtek 51465 1
snd_ice1712 75006 3
snd_hda_intel 44075 7
arc4 12608 2
snd_cs8427 13978 1 snd_ice1712
snd_i2c 13828 2 snd_ice1712,snd_cs8427
snd_ice17xx_ak4xxx 13128 1 snd_ice1712
snd_ak4xxx_adda 18487 2 snd_ice1712,snd_ice17xx_ak4xxx
microcode 23527 0
snd_usbmidi_lib 24845 1 snd_usb_audio
gspca_pac7302 17481 0
gspca_main 36226 1 gspca_pac7302
videodev 132348 2 gspca_main,gspca_pac7302
lsmod komutu, o anda kernel içine yüklenmiş tüm modülleri listeler.
Bu çıktı genellikle şu bilgileri içerir:
- Module: Modül adı
- Size: Bellekte kapladığı alan
- Used by: Kaç bileşen tarafından kullanıldığı
Belirli Bir Modülü Arama
Belirtilen modülün yüklü olup olmadığını kontrol etmek için fgrep aracını kullanabiliriz.
lsmod | fgrep -i snd_hda_intel
Modülleri Boyutuna Göre Sıralama
Modülleri boyutlarına göre büyükten küçüğe sıramak için sort aracını kullanabiliriz.
Örneğin aşağıdaki komut modülleri büyükten küçüğe sıralar ve en büyükleri gösterir.
lsmod | sort -k2,2nr | head
Modül Kaldırma (Canlı Sistemden)
sudo modprobe -r snd_hda_intel
Belirtilen modülü ve ona bağlı modülleri sistemden kaldırır.
Bu işlem canlı sistem üzerinde yapılır (live unload).
Modül Hakkında Bilgi Alma
[acs@archlinux ~]$ modinfo nouveau
filename: /lib/modules/6.17.9-arch1-1/kernel/drivers/gpu/drm/nouveau/nouveau.ko.zst
firmware: nvidia/gp100/acr/ucode_load.bin
firmware: nvidia/gp100/acr/bl.bin
firmware: nvidia/gm206/acr/ucode_load.bin
firmware: nvidia/gm206/acr/bl.bin
firmware: nvidia/gm204/acr/ucode_load.bin
firmware: nvidia/gm204/acr/bl.bin
firmware: nvidia/gm200/acr/ucode_load.bin
firmware: nvidia/gm200/acr/bl.bin
[acs@archlinux ~]$ modinfo -p nouveau
vram_pushbuf:Create DMA push buffers in VRAM (int)
kms_vram_pushbuf:Place EVO/NVD push buffers in VRAM (default: auto) (int)
tv_norm:Default TV norm.
Supported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J,
hd480i, hd480p, hd576i, hd576p, hd720p, hd1080i.
Default: PAL
*NOTE* Ignored for cards with external TV encoders. (charp)
mst:Enable DisplayPort multi-stream (default: enabled) (int)
tv_disable:Disable TV-out detection (int)
ignorelid:Ignore ACPI lid status (int)
duallink:Allow dual-link TMDS (default: enabled) (int)
hdmimhz:Force a maximum HDMI pixel clock (in MHz) (int)
config:option string to pass to driver core (charp)
debug:debug string to pass to driver core (charp)
noaccel:disable kernel/abi16 acceleration (int)
modeset:enable driver (default: auto, 0 = disabled, 1 = enabled, 2 = headless) (int)
atomic:Expose atomic ioctl (default: disabled) (int)
runpm:disable (0), force enable (1), optimus only default (-1) (int)
NVreg_RegistryDwords:A semicolon-separated list of key=integer pairs of GSP-RM registry keys (charp)
keep_gsp_logging:Migrate the GSP-RM logging debugfs entries upon exit (bool)
Belirtilen modülün:
- Parametrelerini
- Açıklamalarını
- Versiyon bilgisini
- Lisans bilgisini
gösterir.
Kalıcı Ayarlar (Persistent Configuration)
Geçici olarak yapılan modül ayarları sistem yeniden başlatıldığında kaybolur.
Kalıcı yapılandırma için modprobe konfigürasyon dosyaları kullanılır.
Konfigürasyon Dizini
/etc/modprobe.d/
Bu dizin altına .conf uzantılı dosyalar eklenir.
Örnek:
/etc/modprobe.d/nouveau.conf
Modül Parametresi Ekleme
Örneğin nouveau modülünde modeset özelliğini kapatmak için:
options nouveau modeset=0
Bu ayar:
- Kernel modeset özelliğini devre dışı bırakır.
- Özellikle NVIDIA proprietary driver kurulumu öncesinde kullanılır.
Modül Kara Listeye Alma (Blacklist)
Bir modül kaldırıldıktan sonra onun otomatik olarak yüklenmesini engellemek isteyebiliriz.
Bir modülün otomatik yüklenmesini engellemek modprobe konfigürasyonuna için blacklist komutu kullanılabilir.
Genel bir blacklist konfigürasyon dosyası blacklist.conf içerisine blacklist nouveau satırı eklenebilir.
/etc/modprobe.d/blacklist.conf
Ancak tercih edilen yöntem her bir modül için ayrı bir dosya oluşturmaktır:
/etc/modprobe.d/nouveau-blacklist.conf
Dosya içeriğine blacklist nouveau satırını eklememiz yeterlidir.
blacklist nouveau
Bu yöntem daha düzenli ve yönetilebilir olduğu için önerilir.
Kernel Modullerini Kaldırırken Hata Vermesi Durumu
Bir modül eğer kullanımdaysa sistem kaldırırken hata verebilir.
Böyle bir durumda:
modprobe -r bluetooth
Komut aşağıdaki gibi bir hata verir:
Module bluetooth is in use
Bu modülün kullanımda olduğu anlamına gelir. Modülü kullanan çalışan bir process ya da ona bağlı çalışan bir başka modül olabilir.
Böyle bir durumda ilgili servisin durdurulması ya da önce bağlı bulunan modülün kaldırılması gerekir.