<< No Boundaries >>

 | Home | AboutMe | Article | Gallery | Download | Link | 

Manajemen Device Mengunakan UDEV

Manajemen Device Menggunakan UDEV

Created by Toto Harjendro 190808
OS : CentOS 5

Apabila suatu user menggunakan suatu operating system, tentu saja dia ingin pekerjaannya sehari-hari dipermudah dengan operating system. Ketika umur Linux masih muda hal ini tidak diperhitungkan, dikarenakan pengguna Linux saat itu adalah para hacker-hacker dan lebih banyak dipergunakan pada server. Tetapi kemudian Linux juga mulai dilirik untuk digunakan pada desktop. Hal ini yang menyebabkan kemudahan adalah suatu hal yang harus diperhitungkan. Dan kemudahan pengaksesan device dan peripheral adalah salah satunya.

Tetapi di lain pihak Linux dan Unix like operating system lainnya memiliki pengenalan device sendiri. Dimana semua device di Linux akan di link suatu file didalam folder /dev, sesuai dengan major dan minor number yang dikenali oleh kernel. Oleh karena itu file-file di dalam direktori /dev disebut juga special device file. Macam-macam special device adalah :

  • Character Special Device, adalah tipe device yang mengirimkan data satu character dalam sekali waktu. Device-device yang biasa dideteksi sebagai tipe file ini biasanya berupa port-port dan controller hardware.
  • Block Special Device, adalah tipe device yang mengirimkan data satu block sekali waktumengirimkan data satu block sekali waktu. Device-device yang biasa dideteksi sebagai tipe file ini biasanya berupa device-device yang memiliki kapasitas, contoh : harddisk, flashdisk, floppy, CDROM.

Pengenalan Device di Linux

Seperti yang telah kita bahas sebelumnya bahwa device akan dikenali sebagai suatu file special di dalam /dev. Apabila suatu device terdeteksi, maka oleh kernel device tersebut akan diarahkan ke suatu file di dalam /dev sesuai dengan major dan minor number-nya. Hal ini dikarenakan setiap major dan minor sudah didaftarkan untuk device tertentu. Sebagai contoh apabila anda memiliki harddisk IDE yang dikenali sebagai /dev/hda maka akan memiliki major number "3" dan minor number "0". Untuk melihat major dan minor suatu device anda bisa gunakan perintah "file". Caranya :

# file /dev/hda
Hasilnya :
/dev/hda: block special (3/0)

Hal ini diatur oleh LANANA (The Linux Assigned Names And Number Authority). Untuk daftar device dan pasangan major dan minor number-nya bisa anda lihat di sini.

Pada kernel 2.4 jumlah untuk major number sepanjang 8 bit dan minor number pun juga sama yaitu 8 bit. Oleh karena itu Linux dapat mengalokasikan 8 bit major number untuk 255 block special device dan 255 character special device. Hal ini menjadi kendala, sebagai contoh pada harddisk SCSI hanya bisa sampai 16 disk dan setiap disk hanya sampai 15 partisi saja. Oleh karena itu jumlah major dan minor number ditambah pada kernel versi 2.6.

Anda pun bisa membuat file device dengan mengetahui major dan minor number dari suatu device. Caranya :

mknod /dev/abc b 8 1
Keterangan :
  • /dev/abc ==> adalah nama file device yang dibuat.
  • b ==> tipe file adalah block device.
  • 8 ==> major number yang dipakai. Dalam hal ini 8 menunjukkan adalah harddisk SCSI, Flashdisk atau harddisk SATA.
  • 1 ==> minor number yang dipakai. Dalam hal ini 1 menunjukkan partisi pertama.
Maka akan muncul device /dev/abc yang mengarah ke flashdisk partisi pertama. Anda bisa lihat dengan perintah :
# file /dev/abc
Hasilnya :
/dev/abc: block special (8/1)

UDEV

Udev adalah suatu program yang digunakan untuk mengatur device-device Linux. Dibuat oleh Greg Kroah-Hartman dan Kay Sievers. Udev digunakan mulai dari kernel 2.6. Udev menggantikan fungsi manajemen device yang dilakukan oleh devfs pada kernel 2.4.

Tidak seperti system Unix dimana file-file device di dalam /dev bersifat statis, udev bersifat dinamis dimana hanya membuat file-file device untuk hardware-hardware yang terpasang saja. Bahkan ketika device baru saja dipasang akan dibuatkan file devicenya.

Udev berjalan sebagai daemon di dalam Linux dan mendengarkan sinyal uevent yang kernel keluarkan (menggunakan netlink socket) apabila ada device yang dipasang atau dilepas. Setelah itu system akan menerapkan aturan untuk device yang akan dicocokkan dengan nilai dari suatu event atau berdasarkan dari atribut device tersebut.

Selain itu juga udev dapat bekerja sama dengan program lain seperti HAL dimana akan dapat berinteraksi dengan D-BUS agar bisa menjalankan pop-up pada Gnome atau KDE apabila suatu device seperti flashdisk dipasang.

Perbandingan UDEV dan DEVFS

disadur dari pernyataan Greg Kroah Hartman

Greg Kroah Hartman salah satu developer UDEV memaparkan perbedaan antara UDEV dan DEVFS dengan menanyakan permasalahan terbesar dalam manajemen device di Linux, yaitu :

Permasalahan :
  1. Pengaturan /dev dengan cara statis terlalu susah dan besar. Akan lebih baik apabila hanya menampilkan pada /dev device-device yang ada di system saja.
  2. Linux kehabisan major dan minor number. Pada kernel 2.6 sudah ditambahkan.
  3. User ingin suatu device dengan nama yang selalu sama. Misalnya anda memiliki flashdisk apabila dipasang di mana saja akan memiliki nama yang sama, myflash.
  4. Program di dalam userspace ingin mengetahui suatu device kapan dipasang dan dilepas. Dan file di dalam /dev yang diasosiasikan di dengan device tersebut.
Pembatasan :
  1. Tidak ada aturan di kernel.
  2. Mengikuti standar (seperti LSB).
  3. Harus kecil sehingga device embedded bisa memakainya.

Bagaimana DEVFS mengatasi hal ini : Permasalahan :
  1. devfs hanya menampilkan file-file /dev untuk device yang ada di dalam system.
  2. devfs tidak mengatasi kebutuhan akan major dan minor number yang dinamis.
  3. devfs tidak menyediakan suatu cara penamaan device yang selalu sama untuk suatu device.
  4. devfs tidak menyediakan suatu daemon/service yang dapat digunakan suatu program device apa yang sedang dipasang dan dilepas.
Pembatasan :
  1. devfs memaksakan aturan penamaan device devfs ke dalam kernel.
  2. devfs tidak mengikuti penamaan standard device LSB.
  3. devfs kecil, dan embedded device memakainya. Tetapi devfs dijalankan di dalam non-pageable memory karena berjalan di kernelspace.

Bagaimana UDEV mengatasi hal ini : Permasalahan :
  1. Dengan menggunakan udev, direktori /dev hanya diisi dengan device yang saat ini berada pada system.
  2. Udev tidak memperdulikan major dan minor number. Apabila suatu ketika pengaturan major dan minor number berubah maka tidak akan menjadi masalah.
  3. Udev dapat mengatur agar suatu device dapat selalu dikenali di dalam /dev dengan nama yang selalu sama.
  4. Udev mengeluarkan sinyal D-BUS sehingga program lain (seperti HAL) dapat mengetahui device apa saja yang dipasang dan dilepas. Udev juga memperbolehkan suatu program untuk melihat databasenya dan mendapatkan informasi device apa yang sedang terpasang dan sedang dinamakan sebagai apa (dengan mengarahkan ke direktori sysfs untuk device tersebut).
Pembatasan :
  1. Udev memindahkan seluruh aturan penmaan dari kernel ke userspace.
  2. Udev secara default menggunakan penamaan sesuai standard LSB (Linux Standard Base). Tetapi apabila user ingin mengganti dengan penamaan yang lain juga bisa.
  3. Udev kecil, dan berjalan pada userspace, dimana bisa di-cache ke swap dan tidak perlu jalan setiap saat.

Aturan Pembuatan Rule UDEV

Ketika hendak memberikan nma unutk suatu device udev membaca file-file yang berisi aturan-aturan penamaan device (rule). File-file tersimpan pada /etc/udev/rules.d, dan file-file tersebut harus memiliki ekstensi .rules. Dimana aturan default rule udev berada pada file /etc/udev/rules.d/50-udev.rules.

Aturan pada /etc/udev/rules.d pada nomor rules yang lebih rendah posisinya lebih kuat. Oleh karena itu disarankan apabila ingin membuat rule baru maka sebaiknya anda gunkan nomor rule yang lebih kecil, misalnya /etc/udev/rules.d/01-flash.rules.

Selain itu anda juga dapat memberikan beberapa rule untuk satu device. Misalnya anda dapat menulis dua rule yang akan memberikan nama untuk device tersebut dengan nama yang berbeda. Hal ini dikarenakan udev tidak akan berhenti memproses walaupun menemukan rule yang tepat dengan suatu device, tetapi terus mencari dan menjalankan semua rule yang ada.

Setiap rule di udev berisi beberapa kombinasi key-value. Jenis dari key-value adalah :

  • Match keys, adalah kondisi yang digunakan untuk mengidentifikasi device yang ingin diatur.
  • Assigment keys, adalah aturan yang diberlakukan untuk device yang didefinisikan oleh match keys.
Pada setiap rule udev paling tidak harus berisi satumatch keys dan satu asssigment keys.

Bentuk standard dari rule udev :
match_key_1==..., match_key_2==..., ... , assign_key_1=..., assign_key_2=..., ...
Sebagai contoh :
KERNEL=="hdb", NAME="mydisk"
Aturan di atas berisi satu match key (KERNEL) dan satu assigment key (NAME).

Match keys operator :
  • == nilai key sama dengan
  • != nilai key tidak sama dengan

Assigment keys operator :
  • = menentukan nilai dari key. Hanya satu nilai yang bisa diberikan.
  • += menambah nilai dari key yang berisi beberapa nilai.
  • := menentukan nilai dari key dan tidak akan berubah apabila walaupun ada rule lain yang merubah key tersebut.

Pattern Matching dan String Subtitution


Udev mendukung pattern matching dimana anda bisa menentukan device dengan pola tertentu. Contoh pola-pola yang didukung adalah :
  • * - sesuai dengan semua character
  • ? - sesuai dengan satu character
  • [] - sesuai dengan satu character di dalam kurung, bisa juga berupa range
Selain itu juga udev mendukung string subtitution seperti pada pemograman. String subtitution ini hanya bisa digunakan pada assigment key. String subtitution yang didukung adalah :
  • $kernel, %k - string akan diganti dengan nama device yang didapatkan dari kernel.
  • $number, %n - string akan diganti nomor device yang dikenali oleh kernel. Contoh sda3 memiliki nomor 3.
  • $major, %M - string akan diganti dengan major number dari device.
  • $minor %m - string akan diganti dengan minor number dari device.
  • $$ - string diganti dengan "$"
  • %% - string diganti dengan "%"

contoh penggunaan :
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k"
Apabila terdapat device floppy drive, maka file device floppy akan dibuat dibawah folder /dev/floppy dan akan dibuat symbolic link yang berada pada /dev/. semua device yang dikenali oleh kernel sebagai fd0, fd1, ..., fd9 akan memiliki file device /dev/floppy/0, /dev/floppy/1, ..., /dev/floppy/9 dan symbolic link di /dev/fd0, /dev/fd1, ..., /dev/fd9.

KERNEL=="sd*", NAME="usb/%k"
Apabila terdapat device SCSI, flashdisk atau SATA maka akan memiliki file device di dalam folder /dev/usb. Sebagai contoh apabila terdapat device sda3, maka akan memiliki file device di /dev/usb/sda3.

Jenis-jenis Match Keys

  • BUS
    Key akan mencocokkan device dengan type bus yang dipakai. Contoh : usb, scsi, ide, dll.
  • KERNEL
    Key akan mencocokkan device dengan nama yang dikenali oleh kernel. Contoh : sda, ttyUSB0, lp0, dll.
  • SUBSYSTEM
    Key akan mencocokkan device dengan nama susbystem dari device. Terkadang key akan memberikan nilai yang sama dengan BUS tapi terkadang juga berbeda. Contoh : usb, scsi, dll.
  • DRIVER
    Key akan mencocokkan device dengan driver di kernel yang mengontrol device tersebut. Contoh : orinoco, usb-storage, dll.
  • ID
    Key akan mencocokkan dengan nomor device di dalam bus dimana device itu terpasang. Contoh : PCI bus id atau USB bus id => usb4.
  • PLACE
    Key akan mencocokkan dengan posisi topologi device di dalam bus dimana device itu dipasang. Hal ini biasanya hanya berlaku untuk device USB.
  • SYSFS{filename}
    Udev akan membaca sysfs filename yang ada di dalam direktori untuk device tersebut dan berusaha mencocokkan key dengan nilai dari file tersebut. Anda bisa menentukan berdasarkan vendor, label, serial number, UUID, atau system label dari suatu device. Semua yang ada di sysfs dapat dicocokkan dengan key. Hingga 5 macam sys file dapat dicocokkan dalam satu rule.
  • PROGRAM
    Key ini memperbolehkan udev untuk memanggil program lain dan menggunakan hasil output dari program itu dalam penamaan device. Key ini akan berlaku apabila program tersebut berhasil memberikan nilai balik. Ketika program dijalankan, semua enviroment variable yang diberikan udev juga dapat digunakan oleh program tersebut. Hasil nilai balik oleh program dapat juga dicocokkan dengan key RESULT.
  • RESULT
    Key ini digunakan untuk mencocokkan key dengan nilai baik dari key PROGRAM.

Jenis-jenis Assigment Keys

  • NAME
    Ini adalah nama file device yang akan dibuat.
  • SYMLINK
    Ini adalah nama symbolic link yang akan mengarah ke nama file device. Beberapa symbolic link dpat diberikan dengan memberikan spasi.

Pengaturan Hak Akses

Dengan menggunakan udev anda dapat mengatur hak akses dari file device yang akan dibuat. Dengan cara seperti ini maka anda bisa buat device yang telah dibuat dapat digunakan selain oleh user root. Key yang dapat digunakan :

  • GROUP
    Ini adalah group pemilik dari file device yang akan dibuat.
  • OWNER
    Ini adalah user pemilik dari file device yang akan dibuat.
  • MODE
    Ini adalah hak akses yang dimiliki oleh file device. Nilainya sesuai dengan sesuai dengan Unix permission. Misalnya : MODE="0660" memberikan hak akses baca dan tulis kepada user dan group pemilik.

Contoh penggunaannya :
KERNEL=="lp*", OWNER="root", GROUP="print", MODE="0660"

Jadi, dari perintah di atas menyebabkan semua device printer yang menggunakan port LPT merupakan milik user root dan group print. Dimana hak user-user dalam group print dapat membaca dan menulis ke dalam device tersebut.

Menjalankan Program pada Event Tertentu

Dengan menggunakan udev anda dapat mengatur agar suatu program/perintah berjalan apabila terjadi event tertentu. Event yang mungkin terjadi misalnya ketika device terpasang atau dilepas. Oleh karena itu key dapat digunakan adalah :

  • ACTION
    Key akan mencocokkan nilai key dengan keadaan yang sedang terjadi. Terdapat dua nilai yaitu "add" saat device sedang dipasang dan "remove" saat device sedang dilepas.
  • RUN
    Key akan menjalankan program lain. Hal ini berbeda dengan key PROGRAM dimana key ini hanya dipergunakan untuk menghasilkan nama file device. Selain itu PROGRAM berjalan ketika file device belum terbentuk sehingga tidak memungkinkan untuk menggunakan device tersebut.
    Sedangkan key RUN berjalan ketika file device tersebut sudah terbentuk sehingga dapat mempergunakan device tersebut.
Contoh penggunaannya :
ACTION=="add" KERNEL=="sda" RUN+="/usr/bin/myprogram"

Sesuai dengan perintah di atas menyebabkan ketika device flashdisk dipasang maka program /usr/bin/myprogram akan dijalankan.

Untuk program tersebut akan berjalan tidak pada shell tertentu. Dan jangan harapkan keluarnya standard output dari perintah tersebut.

Percobaan 1 : Membuat Device Menggunakan Penamaan yang Selalu Sama

Dalam percobaan ini saya ingin flashdisk saya agar memiliki penamaan yang sama ketika dihubungkan ke komputer. Maka langkah-langkahnya :

  • Cari atribut dari device flashdisk. Dalam hal ini flashdisk dikenali sebagai /dev/sda. Oleh karena itu dikenali oleh sysfs di /sys/block/sda.
    # udevinfo -a -p /sys/block/sda
    Hasilnya :
    Udevinfo starts with the device specified by the devpath and then
    walks up the chain of parent devices. It prints for every device
    found, all possible attributes in the udev rules key format.
    A rule to match, can be composed by the attributes of the device
    and the attributes from one single parent device.

    looking at device '/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    SYSFS{stat}==" 426 1281 14288 1192 2 0 2 16 0 1036 1208"
    SYSFS{size}=="3948544"
    SYSFS{removable}=="1"
    SYSFS{range}=="16"
    SYSFS{dev}=="8:0"

    looking at parent device '/devices/pci0000:00/0000:00:10.3/usb4/4-4/4-4:1.0/host2/target2:0:0/2:0:0:0':
    ID=="2:0:0:0"
    BUS=="scsi"
    DRIVER=="sd"
    SYSFS{ioerr_cnt}=="0x1"
    SYSFS{iodone_cnt}=="0xa30"
    SYSFS{iorequest_cnt}=="0xa30"
    SYSFS{iocounterbits}=="32"
    SYSFS{timeout}=="60"
    SYSFS{state}=="running"
    SYSFS{rev}=="0.00"
    SYSFS{model}=="USB Flash Disk  "
    SYSFS{vendor}=="UT165   "
    SYSFS{scsi_level}=="3"
    SYSFS{type}=="0"
    SYSFS{queue_type}=="none"
    SYSFS{queue_depth}=="1"
    SYSFS{device_blocked}=="0"
    SYSFS{max_sectors}=="240"
  • Ambil atribut yang unik untuk device tersebut dalam hal ini saya akan ambil pada vendornya dan saya masukkan ke dalam rules dari udev.
    # vi /etc/udev/rules.d/01-flash.rules
    diisi dengan :
    SUBSYSTEM=="block", SYSFS{vendor}=="UT165   ", NAME="myhd"
  • Kemudian anda refresh konfigurasi udev anda :
    udevcontrol reload_rules
  • Maka sekarang flashdisk akan dikenali sebagai /dev/myhd bukan sebagai /dev/sda.
    ls /dev/ |grep myhd
    Bahkan anda bisa gunakan, dalam hal ini saya mount.
    # mount /dev/myhd /mnt

Percobaan 2 : Mengeksekusi program ketika suatu device dimasukkan

Dalam hal ini saya akan menggunakan program untuk memount flash secara otomatis

  • Buat mount point dalam hal ini saya taruh di /media/usb
    # mkdir /media/usb
  • buat rules udev-nya
    # vi /etc/udev/rules.d/01-flash.rules
    Isi dengan :
    ACTION=="add", KERNEL=="sd*", SYMLINK+="flash-%k", RUN+="/bin/mount /dev/flash-%k /media/usb"
  • Refresh konfigurasi udev
    # udevcontrol reload_rules
  • Sekarang apabila anda memasukan flashdisk akan termount secara otomatis ke /media/usb.

Percobaan 3 : Memberikan permission ketika device dipasang

Dalam hal ini saya memiliki device GSM modem yang dipasang menggunakan USB port. Dimana saya ingin device tersebut bisa digunakan oleh user tertentu misalnya "smsadmin" yang merupakan anggota group "smsusers". Saya asumsikan user "smsadmin" dan group "smsusers" sudah dibuat.

  • Masukkan user "smsadmin" sebagai anggota group "smsusers".
    # usermod -G smsusers smsadmin
  • Pasangkan device GSM modem dan kemudian jalankan perintah dmesg.
    # dmesg
    Hasilnya :
    usb 1-1: new full speed USB device using uhci_hcd and address 2
    usb 1-1: configuration #1 chosen from 1 choice
    usbcore: registered new driver usbserial
    drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
    usbcore: registered new driver usbserial_generic
    drivers/usb/serial/usb-serial.c: USB Serial Driver core
    drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
    pl2303 1-1:1.0: pl2303 converter detected
    usb 1-1: pl2303 converter now attached to ttyUSB0
    usbcore: registered new driver pl2303
    drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver
  • Diketahui dari hasil diatas bahwa device dikenali oleh kernel sebagai /dev/ttyUSB0. Dapatkan atribut dari sysfs yang bisa dipakai dengan perintah :
    # udevinfo -a -p /sys/class/tty/ttyUSB0
    Hasilnya :
    ...
    looking at parent device '/devices/pci0000:00/0000:00:10.0/usb1/1-1':
    ID=="1-1"
    BUS=="usb"
    DRIVER=="usb"
    SYSFS{configuration}==""
    SYSFS{product}=="USB-Serial Controller"
    SYSFS{manufacturer}=="Prolific Technology Inc."
    SYSFS{maxchild}=="0"
    SYSFS{version}==" 1.10"
    SYSFS{devnum}=="2"
    SYSFS{speed}=="12"
    SYSFS{bMaxPacketSize0}=="64"
    SYSFS{bNumConfigurations}=="1"
    ....
  • Kemudian anda atur aturan udev untuk device tersebut.
    # vi /etc/udev/rules.d/02-mysms.rules
    Isi dengan :
    KERNEL=="ttyUSB*", SYSFS{manufacturer}=="Profilic Technology Inc.", \
    SYMLINK+="mysms", GROUP="smsusers", MODE="0660"
  • Kemudian refresh konfigurasi udev
    # udevcontrol reload_rules
Silakan kalau ingin tanya-tanya




Advertisement
Keep the Car. Get OpenOffice.org Firefox 2

Developed by Toto Harjendro © 2006