Belge

Linux’ta Cihaz Algılama ve Yönetimi için Udev Nasıl Kullanılır?

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.shKomut 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.shkomut 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.