Belajar Memahami udev Di Linux
CATATAN HACKING - 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:
1
2
| #!/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
Post a Comment for "Belajar Memahami udev Di Linux"