GNU/Linux >> Belajar Linux >  >> Linux

Pengantar Udev:Subsistem Linux untuk mengelola acara perangkat

Udev adalah subsistem Linux yang memasok komputer Anda dengan acara perangkat. Dalam bahasa Inggris sederhana, itu berarti kode yang mendeteksi ketika Anda memiliki sesuatu yang dicolokkan ke komputer Anda, seperti kartu jaringan, hard drive eksternal (termasuk USB thumb drive), mouse, keyboard, joystick dan gamepad, drive DVD-ROM, dan sebagainya pada. Itu menjadikannya utilitas yang berpotensi berguna, dan cukup jelas bahwa pengguna standar dapat membuat skrip secara manual untuk melakukan hal-hal seperti melakukan tugas tertentu saat hard drive tertentu dicolokkan.

Artikel ini mengajarkan Anda cara membuat skrip udev yang dipicu oleh beberapa peristiwa udev, seperti mencolokkan thumb drive tertentu. Setelah Anda memahami proses bekerja dengan udev, Anda dapat menggunakannya untuk melakukan banyak hal, seperti memuat driver tertentu saat gamepad terpasang, atau melakukan pencadangan otomatis saat Anda memasang drive cadangan.

Skrip dasar

Cara terbaik untuk bekerja dengan udev adalah dalam potongan kecil. Jangan menulis seluruh skrip di awal, tetapi mulailah dengan sesuatu yang hanya mengonfirmasi bahwa udev memicu beberapa peristiwa khusus.

Bergantung pada tujuan skrip Anda, Anda tidak dapat menjamin bahwa Anda akan pernah melihat hasil skrip dengan mata kepala sendiri, jadi pastikan skrip Anda mencatat bahwa skrip berhasil dipicu. Tempat biasa untuk file log adalah di /var direktori, tapi itu sebagian besar domain pengguna root. Untuk pengujian, gunakan /tmp , yang dapat diakses oleh pengguna biasa dan biasanya dibersihkan dengan boot ulang.

Buka editor teks favorit Anda dan masukkan skrip sederhana ini:

#!/usr/bin/bash

/usr/bin/date>> /tmp/udev.log

Tempatkan ini di /usr/local/bin atau tempat semacam itu di jalur default yang dapat dieksekusi. Sebut saja trigger.sh dan, tentu saja, membuatnya dapat dieksekusi dengan chmod +x .

$ sudo mv trigger.sh /usr/local/bin
$ sudo chmod +x /usr/local/bin/trigger.sh

Skrip ini tidak ada hubungannya dengan udev. Saat dijalankan, skrip menempatkan stempel waktu di file /tmp/udev.log . Uji skrip sendiri:

$ /usr/local/bin/trigger.sh
$ cat /tmp/udev.log
Sel 31 Okt 01:05:28 NZDT 2035

Langkah selanjutnya adalah membuat udev memicu skrip.

Identifikasi perangkat unik

Agar skrip Anda dipicu oleh peristiwa perangkat, udev harus tahu dalam kondisi apa skrip harus dipanggil. Dalam kehidupan nyata, Anda dapat mengidentifikasi thumb drive berdasarkan warnanya, pabrikannya, dan fakta bahwa Anda baru saja menghubungkannya ke komputer Anda. Namun, komputer Anda memerlukan serangkaian kriteria yang berbeda.

Udev mengidentifikasi perangkat dengan nomor seri, produsen, dan bahkan ID vendor dan nomor ID produk. Karena ini adalah awal dari masa pakai skrip udev Anda, buatlah seluas mungkin, tidak spesifik, dan mencakup semua. Dengan kata lain, Anda ingin menangkap hampir semua peristiwa udev yang valid terlebih dahulu untuk memicu skrip Anda.

Dengan pemantau udevadm perintah, Anda dapat memanfaatkan udev secara real time dan melihat apa yang dilihatnya saat Anda mencolokkan perangkat yang berbeda. Menjadi root dan mencobanya.

$ su
# udevadm monitor

Fungsi monitor mencetak acara yang diterima untuk:

  • UDEV:acara yang dikirim udev setelah pemrosesan aturan
  • KERNEL:kernel uevent

Dengan pemantau udevadm berjalan, colokkan thumb drive dan saksikan semua jenis informasi dimuntahkan ke layar Anda. Perhatikan bahwa jenis acaranya adalah TAMBAHKAN peristiwa. Itu cara yang baik untuk mengidentifikasi jenis acara yang Anda inginkan.

Pemantau udevadm command memberikan banyak info bagus, tetapi Anda dapat melihatnya dengan format yang lebih cantik dengan perintah udevadm info , dengan asumsi Anda tahu di mana thumb drive Anda saat ini berada di /dev . Anda pohon. Jika tidak, cabut dan pasang kembali thumb drive Anda, lalu segera jalankan perintah ini:

$ su -c 'dmesg | tail | fgrep -i sd*' 

Jika perintah itu mengembalikan sdb:sdb1 , misalnya, Anda tahu kernel telah menetapkan thumb drive Anda sdb label.

Sebagai alternatif, Anda dapat menggunakan lsblk perintah untuk melihat semua drive yang terpasang ke sistem Anda, termasuk ukuran dan partisinya.

Sekarang setelah Anda menetapkan di mana drive Anda berada di sistem file Anda, Anda dapat melihat informasi udev tentang perangkat itu dengan perintah ini:

# udevadm info -a -n /dev/sdb | less 

Ini mengembalikan banyak informasi. Fokus pada blok pertama info untuk saat ini.

Tugas Anda adalah memilih bagian dari laporan udev tentang perangkat yang paling unik untuk perangkat tersebut, lalu memberi tahu udev untuk memicu skrip Anda saat atribut unik tersebut terdeteksi.

Info udevadm memproses laporan pada perangkat (ditentukan oleh jalur perangkat), lalu "berjalan" ke atas rantai perangkat induk. Untuk setiap perangkat yang ditemukan, ia mencetak semua atribut yang mungkin menggunakan format nilai kunci. Anda dapat membuat aturan untuk dicocokkan sesuai dengan atribut perangkat ditambah atribut dari satu perangkat induk tunggal.

melihat perangkat '/devices/000:000/blah/blah//block/sdb':
  KERNEL=="sdb"
  SUBSYSTEM=="block"
  DRIVER==""
  ATTR{ro}=="0"
  ATTR{size}=="125722368"
  ATTR{stat}==" 2765 1537 5393"
  ATTR{ range}=="16"
  ATTR{discard\_alignment}=="0"
  ATTR{removable}=="1"
  ATTR{blah}=="blah"

Aturan udev harus berisi satu atribut dari satu perangkat induk tunggal.

Atribut induk adalah hal-hal yang menggambarkan perangkat dari tingkat paling dasar, seperti itu sesuatu yang telah dicolokkan ke port fisik atau itu adalah sesuatu dengan ukuran atau ini adalah perangkat yang dapat dilepas .

Karena label KERNEL dari sdb dapat berubah tergantung pada berapa banyak drive lain yang dicolokkan sebelum Anda mencolokkan thumb drive itu, itu bukan atribut induk yang optimal untuk aturan udev. Namun, ini berfungsi untuk bukti konsep, sehingga Anda bisa menggunakannya. Kandidat yang lebih baik lagi adalah atribut SUBSYSTEM, yang mengidentifikasi bahwa ini adalah perangkat sistem "blok" (itulah sebabnya lsblk perintah mencantumkan perangkat).

Buka file bernama 80-local.rules di /etc/udev/rules.d dan masukkan kode ini:

SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/trigger.sh" 

Simpan file, cabut thumb drive uji Anda, dan reboot.

Tunggu, boot ulang di mesin Linux?

Secara teoritis, Anda cukup mengeluarkan udevadm control --reload , yang seharusnya memuat semua aturan, tetapi pada tahap ini dalam permainan, yang terbaik adalah menghilangkan semua variabel. Udev cukup rumit, dan Anda tidak ingin berbaring di tempat tidur sepanjang malam bertanya-tanya apakah aturan itu tidak berhasil karena kesalahan sintaks atau apakah Anda seharusnya melakukan boot ulang. Jadi reboot terlepas dari apa yang dikatakan kebanggaan POSIX Anda.

Saat sistem Anda kembali online, alihkan ke konsol teks (dengan Ctl+Alt+F3 atau yang serupa) dan colokkan thumb drive Anda. Jika Anda menjalankan kernel terbaru, Anda mungkin akan melihat banyak keluaran di konsol Anda saat Anda mencolokkan drive. Jika Anda melihat pesan kesalahan seperti Tidak dapat mengeksekusi / usr /local/bin/trigger.sh , Anda mungkin lupa membuat skrip dapat dieksekusi. Jika tidak, mudah-mudahan yang Anda lihat hanyalah perangkat yang terpasang, perangkat tersebut memiliki semacam penetapan perangkat kernel, dan seterusnya.

Sekarang, momen kebenaran:

$ cat /tmp/udev.log
Sel 31 Okt 01:35:28 NZDT 2035

Jika Anda melihat tanggal dan waktu terbaru yang dikembalikan dari /tmp/udev.log , udev telah berhasil memicu skrip Anda.

Menyempurnakan aturan menjadi sesuatu yang berguna

Masalah dengan aturan ini adalah sangat umum. Memasukkan mouse, thumb drive, atau thumb drive orang lain akan memicu skrip Anda tanpa pandang bulu. Sekarang saatnya untuk mulai berfokus pada thumb drive yang Anda inginkan untuk memicu skrip Anda.

Salah satu cara untuk melakukannya adalah dengan ID vendor dan ID produk. Untuk mendapatkan nomor ini, Anda dapat menggunakan lsusb perintah.

$ lsusb
Perangkat Bus 001 002:ID 8087:0024 Hub Slacker Corp.
Perangkat Bus 002 002:ID 8087:0024 Hub Slacker Corp.
Perangkat Bus 003 005:ID 03f0 :3307 TyCoon Corp.
Perangkat Bus 003 001:ID 1d6b:0002 hub Linux Foundation 2.0
Perangkat Bus 001 003:ID 13d3:5165 Jaringan SBo

Dalam contoh ini, 03f0:3307 sebelum TyCoon Corp. menunjukkan atribut idVendor dan idProduct. Anda juga dapat melihat angka-angka ini di output udevadm info -a -n /dev/sdb | penjual grep , tapi saya menemukan keluaran lsusb sedikit lebih nyaman di mata.

Anda sekarang dapat menyertakan atribut ini dalam aturan Anda.

SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/thumb.sh" 

Uji ini (ya, Anda masih harus mem-boot ulang, hanya untuk memastikan Anda mendapatkan reaksi baru dari udev), dan itu akan bekerja sama seperti sebelumnya, hanya sekarang jika Anda mencolokkan, katakanlah, thumb drive yang diproduksi oleh perusahaan lain (oleh karena itu dengan idVendor yang berbeda) atau mouse atau printer, skrip tidak akan dipicu.

Terus tambahkan atribut baru untuk lebih fokus pada satu itu thumb drive unik yang Anda inginkan untuk memicu skrip Anda. Menggunakan udevadm info -a -n /dev/sdb , Anda dapat mengetahui hal-hal seperti nama vendor, terkadang nomor seri, atau nama produk, dan sebagainya.

Untuk kewarasan Anda sendiri, pastikan untuk menambahkan hanya satu atribut baru pada satu waktu. Sebagian besar kesalahan yang saya buat (dan telah dilihat orang lain secara online) adalah membuang banyak atribut ke dalam aturan udev mereka dan bertanya-tanya mengapa hal itu tidak lagi berfungsi. Menguji atribut satu per satu adalah cara teraman untuk memastikan udev berhasil mengidentifikasi perangkat Anda.

Keamanan

Ini memunculkan masalah keamanan dalam menulis aturan udev untuk melakukan sesuatu secara otomatis saat drive dicolokkan. Pada mesin saya, saya bahkan tidak mengaktifkan pemasangan otomatis, namun artikel ini mengusulkan skrip dan aturan yang menjalankan perintah hanya dengan memiliki sesuatu yang terpasang.

Dua hal yang perlu diingat di sini.

  1. Fokuskan aturan udev Anda setelah aturan tersebut berfungsi sehingga aturan tersebut hanya trigger memicu skrip ketika Anda benar-benar menginginkannya. Menjalankan skrip yang secara membabi buta menyalin data ke atau dari komputer Anda adalah ide yang buruk jika ada orang yang kebetulan membawa merek thumb drive yang sama mencolokkannya ke dalam kotak Anda.
  2. Jangan menulis aturan dan skrip udev Anda dan melupakannya. Saya tahu komputer mana yang memiliki aturan udev saya, dan kotak-kotak itu paling sering adalah komputer pribadi saya, bukan yang saya bawa ke konferensi atau di kantor saya di tempat kerja. Semakin "sosial" sebuah komputer, semakin kecil kemungkinannya untuk mendapatkan aturan udev di dalamnya yang berpotensi mengakibatkan data saya berakhir di perangkat orang lain atau data atau malware orang lain di saya perangkat.

Dengan kata lain, seperti halnya begitu banyak daya yang disediakan oleh sistem GNU, tugas Anda adalah memperhatikan bagaimana Anda menggunakan kekuatan itu. Jika Anda menyalahgunakannya atau tidak memperlakukannya dengan hormat, itu bisa sangat salah.

Udev di dunia nyata

Sekarang Anda dapat mengonfirmasi bahwa skrip Anda dipicu oleh udev, Anda dapat mengalihkan perhatian Anda ke fungsi skrip. Saat ini, tidak ada gunanya, tidak melakukan apa-apa selain mencatat fakta bahwa itu telah dieksekusi.

Saya menggunakan udev untuk memicu pencadangan otomatis dari thumb drive saya. Idenya adalah bahwa salinan master dari dokumen aktif saya ada di thumb drive saya (karena itu ada di mana pun saya pergi dan dapat dikerjakan kapan saja), dan dokumen master itu dicadangkan ke komputer saya setiap kali saya mencolokkan drive ke mesin itu. Dengan kata lain, komputer saya adalah drive cadangan dan data produksi saya adalah seluler. Kode sumber tersedia, jadi silakan lihat kode lampiran untuk contoh lebih lanjut dalam membatasi pengujian udev Anda.

Karena itulah yang paling sering saya gunakan udev, itulah contoh yang akan saya gunakan di sini, tetapi udev dapat mengambil banyak hal lain, seperti gamepad (ini berguna pada sistem yang tidak disetel untuk memuat modul xboxdrv saat gamepad terpasang) serta kamera dan mikrofon (berguna untuk menyetel input saat mikrofon tertentu dipasang), jadi ketahuilah bahwa itu bagus untuk lebih dari satu contoh ini.

Versi sederhana dari sistem pencadangan saya adalah proses dua perintah:

SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", SYMLINK+="safety%n"
SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", TINDAKAN=="tambahkan", RUN+="/usr/local/bin/trigger.sh"

Baris pertama mendeteksi thumb drive saya dengan atribut yang telah dibahas, lalu memberikan symlink pada drive thumb tersebut di dalam pohon perangkat. symlink yang diberikannya adalah safety%n . %n adalah makro udev yang memutuskan ke nomor berapa pun yang diberikan kernel ke perangkat , seperti sdb1, sdb2, sdb3, dan seterusnya. Jadi %n akan menjadi 1 atau 2 atau 3.

Ini membuat symlink di pohon dev, sehingga tidak mengganggu proses normal menghubungkan perangkat. Artinya, jika Anda menggunakan lingkungan desktop yang suka memasang perangkat secara otomatis, Anda tidak akan menimbulkan masalah untuk itu.

Baris kedua menjalankan skrip.

Skrip cadangan saya terlihat seperti ini:

#!/usr/bin/bash

mount /dev/safety1 /mnt/hd
sleep 2
rsync -az /mnt/hd/ /home/seth /backups/ &&umount /dev/safety1

Script menggunakan symlink, yang menghindari kemungkinan udev memberi nama drive sesuatu yang tidak terduga (misalnya, jika saya memiliki thumb drive bernama DISK yang sudah terpasang ke komputer saya, dan saya mencolokkan thumb drive saya yang lain yang juga disebut DISK, yang kedua akan diberi label DISK_, yang akan menggagalkan skrip saya). Itu memasang safety1 (partisi pertama drive) di titik pemasangan /mnt/hd . pilihan saya .

Setelah dipasang dengan aman, ia menggunakan rsync untuk mencadangkan drive ke folder cadangan saya (skrip saya yang sebenarnya menggunakan rdiff-backup, dan milik Anda dapat menggunakan solusi pencadangan otomatis apa pun yang Anda inginkan).

Udev adalah pengembang Anda

Udev adalah sistem yang sangat fleksibel dan memungkinkan Anda untuk menentukan aturan dan fungsi dengan cara yang hanya bisa diberikan oleh beberapa sistem lain kepada pengguna. Pelajari dan gunakan, dan nikmati kekuatan POSIX.

Artikel ini dibuat berdasarkan konten dari Buku Pegangan Slackermedia, yang dilisensikan di bawah Lisensi Dokumentasi Gratis GNU 1.3.


Linux
  1. Kali di Subsistem Windows untuk Linux

  2. Kali Linux untuk Gemini PDA

  3. Skrip transliterasi untuk shell linux

  1. Panduan terminal Linux untuk pemula

  2. 8 tips untuk baris perintah Linux

  3. Pengantar perintah chown Linux

  1. Pengantar perintah alternatif di Linux

  2. Menjinakkan perintah tar:Kiat untuk mengelola cadangan di Linux

  3. 8 perintah Linux virsh untuk mengelola VM pada baris perintah