Belajar Memahami udev Di Linux


Salah satu tugas sistem operasi adalah mengelola perangkat keras yang terhubung pada komputer. Pada versi awal Linux, perangkat yang terhubung dengan komputer akan didaftarkan di directory /dev. Sebagai contoh, perangkat harddisk IDE zaman dulu (yang kini semakin langka) biasanya dikenali dengan nama seperti /dev/hda, /dev/hdb, dan seterusnya. Partisi di dalam harddisk pertama dikenali dengan nama seperti /dev/hda1, /dev/hda2 dan seterusnya. Pada harddisk SATA modern, perangkat harddisk memiliki nama seperti /dev/sda, /dev/sdb dan sebagainya. Bila saya mencolokkan perangkat USB Flash Drive (UFD), akan ada tambahan perangkat baru seperti /dev/sdc.

Lalu mengapa beralih ke udev? Komputer modern umumnya memiliki banyak port USB dimana pengguna bisa mencolok dan melepas perangkat kapan saja. Bila masih tetap memakai cara lama, maka nama sebuah perangkat di /dev akan sulit dicari karena bisa berubah tergantung pada urutan saat ia dikenali. Oleh sebab itu, Linux memakai udev untuk memetakan perangkat yang dikenali kernel dengan sebuah nama yang statis.

Bagaimana cara udev memetakan sebuah perangkat keras ke sebuah nama statis? Jawabannya adalah melalui rules yang ditulis oleh pengguna atau pembuat distro. Pengguna bisa menambahkan file rules di lokasi /etc/udev/rules.d. Distro Linux biasanya sudah dilengkapi dengan segudang rules untuk perangkat keras yang umum dipakai di lokasi /lib/udev/rules.d. Nomor di depan nama file dipakai untuk menentukan prioritas dari rules yang ada.

Sebagai contoh, berikut ini adalah salah satu baris di file /lib/udev/rules.d/60-persistence-storage.rules bawaan UBuntu:

# probe filesystem metadata of disks
KERNEL!="sr*", IMPORT{builtin}="blkid"
...
ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"

IMPORT akan mengerjakan sesuatu untuk memperoleh sebuah nilai yang nantinya dapat dibaca dengan ENV. Ia bisa mengerjakan program eksternal seperti pada IMPORT{program}, memanggil function built-in seperti pada IMPORT{builtin}, membaca isi file seperti pada IMPORT{file} dan sebagainya. SYMLINK akan membuat sebuah symbolic link sehingga perangkat sesuai dengan nama kernel tetap ada.

Sebagai hasilnya, saya bisa mencari nama partisi berdasarkan label, seperti pada:

$ ls /dev/disk/by-label/

Karena rules menggunakan SYMLINK, maka hasil yang saya jumpai adalah symbolic link ke nama seperti /dev/sda, /dev/sdb dan sebagainya. Dengan demikian, saya tetap bisa mencari perangkat berdasarkan cara lama (seperti /dev/sda) ataupun memakai cara yang lebih konsisten (seperti berdasarkan id, label, dan sebagainya).

Salah satu fitur menarik dari udev adalah ia bisa mengerjakan sebuah program pada saat perangkat dicolok atau dilepaskan dengan menggunakan RUN. Sebagai latihan, saya akan membuat sebuah rule yang akan mengerjakan program untuk menulis ke sebuah file setiap kali ada perangkat Samsung yang dicolokkan melalui USB.

Langkah pertama yang perlu saya lakukan adalah melihat informasi apa saja yang dikenali oleh kernel. Untuk itu, saya mencolokkan perangkat dan memberikan perintah:

$ lsusb
Bus 002 Device 003: ID xxxx:xxxx SanDisk Corp.
Bus 002 Device 005: ID xxxx:xxxx Samsung Electronics Co., Ltd
...

Berdasarkan informasi tersebut (Bus 002 Device 005), saya mengetahui bahwa perangkat dipetakan ke file /dev/bus/usb/002/005. Untuk melihat atribut apa saja yang ada, saya dapat memberikan perintah berikut ini:

$ udevadm info --name=/dev/bus/usb/002/005 --query=property
...
ID_VENDOR_ID=04e8
...

Nilai 04e8 adalah USB Vendor ID (VID) untuk Samsung. Selain memakai cara manual, saya juga bisa menemukan VID untuk seluruh pembuat perangkat USB dengan mencari nama perusahaan di http://www.usb.org/developers/tools/comp_dump. Sebagai informasi, setiap perusahaan yang ingin menciptakan perangkat keras yang memakai USB harus membayar sekitar U$5000 untuk memperoleh VID ini.

Saya kemudian membuat sebuah file baru di folder /etc/udev/rules.d dengan nama 10-latihan.rules yang isinya seperti berikut ini:

SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", RUN+="/home/snake/latihan.sh %p %E{ID_MODEL}"

Rules di atas akan mengerjakan script /home/snake/latihan.sh bila ada perangkat dengan ID_VENDOR 04e8 dihubungkan ke USB. Di dalam RUN, saya dapat memakai string substitution seperti %p yang akan diganti menjadi nama perangkat sesuai yang dikenali oleh kernel, %n mewakili nomor perangkat, dan %E{...} untuk mengakses property dari perangkat tersebut.

Langkah berikutnya, saya membuat sebuah script sederhana di lokasi /home/snake/latihan.sh yang isinya seperti berikut ini:

#!/bin/sh
echo `date`: Perangkat Samsung Ditemukan Pada "$@" >> /home/snake/log.txt

Sekarang, setiap kali sebuah perangkat Samsung dihubungkan ke PC melalui USB, akan ada baris baru di /home/snake/log.txt seperti:

Fri Feb 7 10:20:23 WIB 2015: Perangkat Samsung Ditemukan Pada /devices/xxx SAMSUNG_Android  

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: