Bir gün, bir Linux makinaya USB bellek veya disk takıldığında kullanıcıya hiç sormadan o belleği/diski formatlama gereği çıktı. “Niye?” diye sormayın; çıktı işte…
Çözümü udev uygulamasıyla ve şu adresteki uygulama notlarıyla buldum (yazarı Nicolas Bernaerts). Uygulama notlarının özeti şöyle:
Bir USB belek ya da disk seçip makinanıza takın
Taktıktan sonra konsoldan “dmesg” komutunu verip çıktının sonuna bakınız.
# dmesg
[...] USB Mass Storage support registered.
[...] usb-storage: device scan complete
[...] scsi 2:0:0:0: Direct-Access TOSHIBA TransMemory PMAP PQ: 0 ANSI: 4 CCS
[...] sd 2:0:0:0: [sdc] 781422768 512-byte hardware sectors (400088 MB)
[...] sd 2:0:0:0: [sdc] Write Protect is off
[...] sd 2:0:0:0: [sdc] Mode Sense: 34 00 00 00
[...] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[...] sd 2:0:0:0: [sdc] 781422768 512-byte hardware sectors (400088 MB)
[...] sd 2:0:0:0: [sdc] Write Protect is off
[...] sd 2:0:0:0: [sdc] Mode Sense: 34 00 00 00
[...] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[...] sdc: sdc1
[...] sd 2:0:0:0: [sdc] Attached SCSI disk
Bu çıktıdan USB diskinize /dev/sdc1 olarak erişildiğini öğrenmiş olacaksınız.
Taktığınız disk/USB bellek hakkında daha ayrıntılı bilgi için şu komutu kullanınız: Komutun çıktısı oldukça uzun olacaktır. Burada sadece bir kısmını listeledim.
# udevadm info -a -p $(udevadm info -q path -n /dev/sdc)
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/host2/target2:0:0/2:0:0:0': KERNELS=="2:0:0:0" SUBSYSTEMS=="scsi" DRIVERS=="sd" ATTRS{device_blocked}=="0" ATTRS{type}=="0" ATTRS{scsi_level}=="3" ATTRS{vendor}=="TOSHIBA " ATTRS{model}=="TransMemory " ATTRS{rev}==" "
Şimdi artık makinanıza “TOSHIBA” marka “TransMemory” modeli bir USB bellek takıldığında yapılacak işi tarif eden udev kuralını oluşturabilirsiniz:
# vi /etc/udev/rules.d/90-local.rules
KERNEL=="sd?1", ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="XTOSHIBA ", ATTRS{model}=="TransMemory ", RUN+="/root/cua.sh %k"
# /etc/init.d/udev/restart
# vi /root/cua.sh
#!/bin/bash
echo USB $1 takildi >> /var/log/usblog
nohup /root/cua-task.sh $1
udev kural dosyasında belirtilen marka-model USB disk takıldığında başlatılacak iş RUN parametresinde belirtilmektedir. Bu başlatılan iş kısa süre sonra udev işini bitirdiğinde hala çalışıyor olsa bile, üst process (udev) öldüğü için öldürülecektir. Bunu önlemek için RUN parametresinde belirttiğiniz betik, asıl yapılması gerekenleri halledecek olan betik ya da programı nohup parametresiyle başlatmalıdır. Kural satırında geçek %k parametresi, takılan USB belleğin partition numarası bilgisini de içeren “sd1” gibi bir değer içeriyor olacaktır.
Artık gerisi /root/cua-task.sh betiğine kalmış. İster USB belleği formatlayın; ister kopyalayın.