Udev (kullanıcı alanı /dev), çekirdek sürümü 2.6’dan beri dinamik cihaz algılama ve yönetimi için kullanılan bir Linux alt sistemidir. Devfs ve hotplug’ın yerini almıştır.
İşlevi 1) sistem uygulamalarına cihaz olayları sağlamak, 2) cihaz düğümlerinin izinlerini yönetmek ve 3) /dev dizininde cihazlara erişim için faydalı sembolik bağlantılar oluşturmak ve hatta ağ arayüzlerini yeniden adlandırmaktır.
Udev’in artılarından biri, keşif sıralarına rağmen cihazların yeniden başlatmalar arasında tutarlı bir şekilde adlandırılmasını garanti etmek için kalıcı cihaz adlarını kullanabilmesidir. Bu özellik yararlıdır çünkü çekirdek, keşif sırasına göre tahmin edilemeyen aygıt adları atar.
Linux’ta Udev’in Temellerini Öğrenin
Udev arka plan programı, systemd-udevd ( veya systemd-udevd.service ) çekirdekle iletişim kurar ve sisteme her aygıt eklediğinizde veya sistemden bir aygıt çıkardığınızda veya bir aygıt durumunu değiştirdiğinde doğrudan aygıt olaylarını alır.
Udev kurallara dayanır – kuralları esnek ve çok güçlüdür. Alınan her aygıt olayı, /lib/udev/rules.d ve /run/udev/rules.d içinde bulunan dosyalardan okunan kurallar kümesiyle eşleştirilir.
Bir aygıtı işlemek için /etc/udev/rules.d/ dizinine (dosyalar .rules uzantısıyla bitmelidir) özel kural dosyaları yazabilirsiniz. Bu dizindeki kural dosyalarının en yüksek önceliğe sahip olduğunu unutmayın.
Bir aygıt düğüm dosyası oluşturmak için, udev’in etiket , seri numarası , kullanılan ana ve ek numarası, veri yolu aygıt numarası ve çok daha fazlası gibi belirli öznitelikleri kullanarak bir aygıtı tanımlaması gerekir . Bu bilgiler sysfs dosya sistemi tarafından dışa aktarılır.
Sisteme bir cihaz bağladığınızda, çekirdek onu algılar ve başlatır ve /sys/ dizini altında cihaz özniteliklerini saklayan cihaz adıyla bir dizin oluşturulur.
udev için ana yapılandırma dosyası /etc/udev/udev.conf ‘dır ve udev arka plan programının çalışma zamanı davranışını kontrol etmek için udevadm yardımcı programını kullanabilirsiniz.
Alınan çekirdek olaylarını ( uevents ) ve udev olaylarını (kural işlemeden sonra udev’in gönderdiği) görüntülemek için udevadm’i monitor komutuyla çalıştırın. Ardından sisteminize bir cihaz bağlayın ve terminalden cihaz olayının nasıl işlendiğini izleyin.
Aşağıdaki ekran görüntüsü, test sistemine bir USB flash disk bağladıktan sonra bir ADD olayının bir alıntısını göstermektedir:
$ udevadm monitor
monitor will print the received events for: UDEV - the event which udev sends out after rule processing KERNEL - the kernel uevent KERNEL[806.169372] remove /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:093A:2532.0001/input/input6/mouse0 (input) UDEV [806.171335] remove /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:093A:2532.0001/input/input6/mouse0 (input) KERNEL[806.184495] remove /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:093A:2532.0001/input/input6/event4 (input) UDEV [806.185435] remove /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:093A:2532.0001/input/input6/event4 (input) KERNEL[806.196345] remove /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:093A:2532.0001/input/input6 (input)
USB diskinize atanan adı bulmak için, sysfs dosya sistemini okuyan lsblk yardımcı programını ve işlenmiş cihazlar hakkında bilgi toplamak için udev db’yi kullanın.
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 4K 1 loop /snap/bare/5
loop1 7:1 0 55,5M 1 loop /snap/core18/2344
loop2 7:2 0 55,6M 1 loop /snap/core18/2538
loop3 7:3 0 55,5M 1 loop /snap/core18/2409
loop4 7:4 0 62M 1 loop /snap/core20/1611
loop5 7:5 0 62M 1 loop /snap/core20/1593
loop6 7:6 0 65,2M 1 loop /snap/gtk-common-themes/1519
loop7 7:7 0 62M 1 loop /snap/core20/1587
loop8 7:8 0 81,3M 1 loop /snap/gtk-common-themes/1534
loop9 7:9 0 91,7M 1 loop /snap/gtk-common-themes/1535
loop10 7:10 0 254,1M 1 loop /snap/gnome-3-38-2004/106
loop11 7:11 0 400,8M 1 loop /snap/gnome-3-38-2004/112
sda 8:0 0 477G 0 disk
├─sda1 8:1 0 476G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 975M 0 part [SWAP]
Önceki komutun çıktısından, USB diski sdb1 olarak adlandırılır (mutlak yol /dev/sdb1 olmalıdır). Udev veritabanından cihaz özelliklerini sorgulamak için info komutunu kullanın.
$ udevadm info /dev/sda1
P: /devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sda/sda1
N: sda1
L: 0
S: disk/by-partuuid/6c313b85-01
S: disk/by-path/pci-0000:00:17.0-ata-2.0-part1
S: disk/by-id/wwn-0x5002538d00000000-part1
S: disk/by-path/pci-0000:00:17.0-ata-2-part1
S: disk/by-id/ata-SAMSUNG_MZNLN512HCJH-000L1_S201NXAH204918-part1
S: disk/by-uuid/1410afa0-36dc-4fed-9e1f-def36fc5a6be
E: DEVPATH=/devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sda/sda1
E: DEVNAME=/dev/sda1
Linux’ta Udev Kuralları Nasıl Çalışılır
Bir kural, bir veya daha fazla anahtar/değer çiftinin virgülle ayrılmış listesinden oluşur. Kurallar, diğerlerinin yanı sıra, bir aygıt düğümünü varsayılan addan yeniden adlandırmanıza, bir aygıt düğümünün izinlerini ve sahipliğini değiştirmenize, bir aygıt düğümü oluşturulduğunda veya silindiğinde bir programın veya komut dosyasının yürütülmesini tetiklemenize olanak tanır.
Bir USB aygıtı eklendiğinde ve çalışan sistemden kaldırıldığında bir komut dosyası başlatmak için basit bir kural yazalım.
İki komut dosyası oluşturarak başlayalım:
$ sudo vim /bin/device_added.sh
device_added.sh
Komut dosyasına aşağıdaki satırları ekleyin .
#!/bin/bash echo "USB aygıtı $(date) tarihinde eklendi" >>/tmp/scripts.log
İkinci komut dosyasını açın.
$ sudo vim /bin/device_removed.sh
device_removed.sh
komut dosyasına aşağıdaki satırları ekleyin .
#!/bin/bash echo "USB aygıtı $(date) tarihinde kaldırıldı" >>/tmp/scripts.log
Dosyaları kaydedin, kapatın ve her iki komut dosyasını da çalıştırılabilir hale getirin.
$ sudo chmod +x /bin/device_added.sh $ sudo chmod +x /bin/device_removed.sh
Ardından, /etc/udev/rules.d/80-test.rules adlı yukarıdaki komut dosyalarının çalışmasını tetiklemek için bir kural oluşturalım .
$ vim /etc/udev/rules.d/80-test.rules
Dosyanın içine aşağıdaki iki kuralı ekleyin.
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"
"=="
: eşitlik için karşılaştırılacak bir operatördür."+="
: bir giriş listesini tutan bir anahtara değer eklemek için kullanılan bir operatördür.- SUBSYSTEM : olay cihazının alt sistemiyle eşleşir.
- ACTION : etkinlik eyleminin adıyla eşleşir.
- ENV{DEVTYPE} : bir cihaz özelliği değeriyle eşleşir, bu durumda cihaz türü.
- RUN : olay işlemenin bir parçası olarak yürütülecek bir program veya komut dosyası belirtir.
Dosyayı kaydedin ve kapatın. Ardından root olarak systemd-udevd’ye kural dosyalarını yeniden yüklemesini söyleyin (bu aynı zamanda çekirdek modülü dizini gibi diğer veritabanlarını da yeniden yükler).
$ sudo udevadm control --reload
Şimdi makinenize bir USB sürücü bağlayın ve device_added.sh
komut dosyasının yürütülüp yürütülmediğini kontrol edin. Öncelikle scripts.log dosyası /tmp altında oluşturulmalıdır .
$ ls -l /tmp/scripts.log
Oluşturulan dosyanın iiçne baktığınızda ilgili satırları görebilmeniz gerekir.
Yazının orijinalini buradan okuyabilirsiniz.
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.