Saturday, June 3, 2017

Udev (userspace /dev)

Halo guys, berawal dari postingan ane sebelumnya yaitu "Mengatasi USB Modem tidak terdeteksi di Linux" yang ane post di salah satu group fb ternyata mendapat tanggapan berupa pertanyaan "gimana caranya biar modem otomatis ke detect, tanpa repot-repot nulis command nya lagi setiap coloking modem", jawabannya yaitu dengan memanfaatkan udev sebagai trigger.

Jadi, apa itu udev?
Udev merupakan  device manager untuk linux kernel yang fungsi utamanya untuk manajemen devices node di direktori "/dev". Pada saat yang sama, udev juga meng handle semua user space event ketika ada devices yang ditambahkan atau di remove dari system.

Bagaimana udev bekerja?
Saat udev diberi tau oleh kernel tentang adanya device baru, udev mengumpulkan beberapa informasi terkait device tersebut terutama sesuatu yang unik misalkan mac address untuk network card, atau serial number untuk beberapa perangkat USB.

Berdasarkan informasi yang telah didapat, udev kemudian mencari rules yang akan diterapkan, rules-rules tersebut tersimpan di /etc/udev/rules.d/ dan /lib/udev/rules.d/, pada proses ini rules menentukan bagaimana memberikan nama suatu device, symboliclink apa yang akan dibuat (untuk memberikan alternative name), dan perintah apa yang akan dijalankan.

Syntax dari file-file rules cukup sederhana, setiap baris terdapat selection criteria dan variable assignment. Yang pertama digunakan untuk memilih event dan menentukan dimana event akan bereaksi, kemudian menentukan action apa yang akan dilakukan. Semuanya dipisahkan oleh koma (,), untuk selection criteria digunakan comparison operator (seperti ==, !=) atau assignment directive (seperti =, +=, :=). Untuk lebih detail mengenai udev ini, silahkan teman teman mengunjungi dokumentasi distro linux yang digunakan.

Sekarang, bagaimana caranya agar ketika modem usb dicolokan akan langsung mengeksekusi perintah yang kita inginkan (dalam kasus ini membuat usb terdeteksi sebagai modem) ? untuk menjawab pertanyaan tersebut, teman-teman dapat mengikuti langkah-langkah berikut ini:
  • pertama colokan modem usb, untuk melihat ATTR{product} yang akan digunakan di file rules
  • selanjutkan kita harus tau, dimana usb modem di mount. Caranya dengan mengetikan: lsusb
  • pada gambar diatas terlihat bahwa modem sudah ter mount di /dev/bus/usb/003/004
  • selanjutnya kita akan menggunakan path dari usb modem untuk bertanya kepada udev bagaimana udev melihat device (modem usb) tersebut, caranya dengan mengetikan: udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/003/004) 
  • hasilnya kurang lebih akan terlihat seperti ini (perhatikan ATTR{product} nanti akan digunakan di rules)
  • langkah selanjutnya adalah membuat file rules di direktori /etc/udev/rules.d/, format penamaan sebuah file rules yaitu: angka-namafile.rules (harus diawali angka, kemudian dash, dan ber extension .rules)
  • disini saya membuat file rules dengan nama 100-local.rules, dengan isi sebagai berikut: 
    • ACTION=="add", SUBSYSTEM=="block", ATTRS{product}=="Qualcomm CDMA Technologies MSM", RUN+="/usr/local/bin/modem_ane.sh"
    • penjelasan untuk isi file rules diatas adalah sebagai berikut:
      • ACTION = add, rules akan dijalankan ketika usb dicolokan/ditambahkan ke system
      • SUBSYSTEM = block, kernel subsystem yang akan me generate request/permintaan
      • ATTR{product} =  Qualcomm CDMA Technologies MSM, product name usb device milik kita
      • RUN = /usr/local/bin/modem_ane.sh, path script yang akan kita jalankan
  • selanjutnya kita akan membuat script untuk membuat usb terdeteksi sebagai modem di direktori /usr/local/bin/ dengan nama modem_ane.sh, agar lebih readable contoh script dapat dilihat disini
  • jangan lupa untuk menambahkan permission execute pada shell script yang telah dibuat, dengan cara: sudo chmod +x file_name.sh 
  • restart udev service dengan cara: sudo /etc/init.d/udev restart atau sudo service udev restart
  • saatnya melakukan uji coba. Seharusnya ketika usb modem dicolokan/ditancapkan, script modem_ane.sh akan otomatis tereksekusi
  • untuk melihat apakah script yang telah kita buat sedang jalan atau tidak, dapat menggunakan perintah: ps -aux | grep modem, berikut hasilnya

 
Sekian artikel kali ini, mohon maaf apabila ada kesalahan ...
 
referensi:
https://debian-handbook.info/browse/stable/sect.hotplug.html
http://manpages.ubuntu.com/manpages/wily/man7/udev.7.html
http://weininger.net/how-to-write-udev-rules-for-usb-devices.html
https://en.wikipedia.org/wiki/Udev