Bagaimana cara mengikat perangkat USB dengan nama statis?

43

Saya memiliki Arduino yang terkadang terikat /dev/ttyUSB0dan lain kali /dev/ttyUSB1, membuat skrip saya gagal.

Saya tidak ingin menyebutkan semua kemungkinan di mana perangkat saya berada, tetapi saya lebih suka memilikinya terikat di suatu tempat yang statis, misalnya /dev/arduino.

Bagaimana saya mencapainya?

k0pernikus
sumber
4
Cukup tulis udev-rule sederhana yang akan menetapkan symlink / dev / arduino untuk dikerjakan dengan benar oleh VID & PID-nya.
Eddy_Em
1
Setelah Anda mengubah aturan, lihat Cara memuat ulang aturan udev tanpa mem-boot ulang?
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

41

Seperti yang disarankan, Anda dapat menambahkan beberapa aturan udev. Saya mengedit /etc/udev/rules.d/10-local.rulesagar mengandung:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

Anda dapat memeriksa variabel perangkat Anda dengan menjalankan

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

Ada panduan lebih mendalam yang dapat Anda baca di http://www.reactivated.net/writing_udev_rules.html

Kotte
sumber
Bekerja seperti pesona. Satu pertanyaan: Bagaimana cara keluar udevam? Dan penting untuk dicatat yang my_uartmenciptakan symlink di bawah /dev/my_uart. Saya pertama kali menulis /dev/arduinopertama kali dan gagal sementara arduinocukup.
k0pernikus
udevadmharus keluar dengan sendirinya ketika sudah selesai.
Kotte
Kemudian untuk beberapa alasan yang tidak diketahui, itu membekukan sesi terminal ke Raspberry Pi saya saat membuat laporan.
k0pernikus
35

Sintaks aturan di atas mungkin berfungsi pada beberapa distribusi, tetapi tidak berfungsi pada saya (Raspbian). Karena saya tidak pernah menemukan satu dokumen yang menjelaskan semua seluk beluk, saya menulis sendiri, untuk ditemukan di sini . Inilah yang menjadi intinya.
1. cari tahu apa yang ada di ttyUSB:

dmesg | grep ttyUSB  

2. daftar semua atribut perangkat:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(dengan nomor perangkat Anda, bukan x, tentu saja). Pilih satu set pengenal unik, mis. IdVendor + idProduct. Anda juga mungkin memerlukan SerialNumber jika Anda memiliki lebih dari satu perangkat dengan idVendor dan idProduct yang sama. SerialNumber harus unik untuk setiap perangkat.
3. Buat file /etc/udev/rules.d/99-usb-serial.rulesdengan sesuatu seperti baris ini di dalamnya:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(dengan asumsi Anda tidak memerlukan nomor seri di sana, dan tentu saja dengan nomor untuk idVendor dan idProduct yang Anda temukan di langkah 2.
4. Muat aturan baru:

sudo udevadm trigger

5. Verifikasi apa yang terjadi:

ls -l /dev/your_device_name  

akan menunjukkan nomor ttyUSB yang digunakan untuk symlink. Jika ya /dev/ttyUSB1, verifikasi siapa yang memiliki itu dan milik kelompok itu:

ls -l /dev/ttyUSB1   

Maka hanya untuk bersenang-senang:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)
RolfBly
sumber
Jadi apakah ada solusi jika idVendordan idProductpersis sama? (dua sensor terpasang pada model identik USB ke modul UART)
Steven Lu
@ SevenLu Ya, lihat langkah 2, lakukan udevadm info --name=/dev/ttyUSB1 --attribute-walkuntuk kedua perangkat dan cari nomor seri, mereka harus unik untuk setiap perangkat. Jika sensor Anda tidak memiliki nomor seri, dapatkah Anda menentukan apa itu?
RolfBly
itu luar biasa, saya akan melaporkan kembali ketika saya mencoba ini
Steven Lu
Dongle USB ke UART $ 2 saya memiliki nomor seri 0001. Tidak bisa mengatakan saya terkejut. Sepertinya saya harus mengidentifikasi sensor berdasarkan protokol output mereka.
Steven Lu
@ SevenLu Nasib buruk. Konverter FTDI USB-UART memang memiliki nomor seri unik, AFAIK. Beberapa dolar ekstra, tetapi lebih sedikit waktu untuk berkembang.
RolfBly
9

Masalah multi-identik-USB-perangkat

Saya memiliki Rasperry Pi dengan empat kamera. Aku mengambil pix dengan fswebcamyang mengidentifikasi kamera sebagai /dev/video0.. video3. Kadang-kadang kamera video0, vide02, video4dan video6tapi kami bisa melupakan bahwa untuk saat ini.

Saya memerlukan ID gigih untuk mengidentifikasi nomor kamera sehingga, mis. video0Selalu kamera yang sama karena saya caption gambar. Sayangnya ini tidak terjadi secara andal - saat boot, kamera-kamera tersebut disebutkan sebagai video0.. video3tetapi tidak selalu dengan cara yang sama.

Semua kamera memiliki ID dan nomor seri yang sama.

Solusi untuk masalah ini melibatkan aturan udev, tetapi ada banyak pancing di sana juga.

Jika Anda mengeluarkan perintah

udevadm info –attribute-walk –path=/dev/video0

Anda mendapatkan screed dari output tetapi bit yang menonjol adalah

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

Bit KERNELS adalah port hub USB. Dengan empat kamera ada empat ini - mereka tidak berubah saat reboot, tetapi yang video{x}terkait dengan port mungkin berubah.

Jadi kita memerlukan aturan udev untuk mengikat nomor video ke port hub USB - sesuatu seperti:

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

Terlihat sederhana - akses kamera dengan

fswebcam –d  $realpath /dev/camera0

Kecuali itu tidak berfungsi - jika Anda meletakkan ini dalam aturan udev dan sistem telah mengalokasikan video0 (saat boot) ke port yang berbeda, aturan udev diabaikan. Symlink pada /dev/camera0dasarnya mengatakan no such device. Satu persegi.

Yang kami inginkan adalah mengikat symlink ke alamat hub USB, bukan video{x}nomor. Butuh program Python.

Langkah pertama adalah berlari

fswebcam –d /dev/video${x}  tst.jpg

untuk xantara 1 dan 8. Keberadaan tst.jpgsetelah setiap panggilan mengidentifikasi apakah ada kamera pada nomor video ini. Dari ini buat daftar nomor video aktif. Pengalaman saya telah bahwa itu adalah baik 0,1,2,3atau 0,2,4,6untuk kamera saya telah digunakan.

Orang lain tentu saja membangun daftar ini menggunakan proses yang berbeda.

Kemudian untuk setiap nomor video dalam daftar jalankan

udevadm info –attribute-walk –path=/dev/videox > dd

dan ekstrak KERNELS= linedari dd. Dari proses ini Anda berakhir dengan daftar alamat port USB untuk kamera. Urutkan daftar ini sehingga pada langkah berikutnya, Anda selalu memprosesnya dalam urutan yang sama. Sebut ini "daftar alamat".

Jalankan udevadm … > ddhal itu lagi dan buat daftar yang terlihat seperti

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

Sekarang lewati daftar alamat - untuk setiap entri temukan entri yang sesuai dari daftar video. Buat daftar baru yang terlihat seperti kumpulan garis

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

X (nomor symlink) diganti dengan nomor urut dalam daftar alamat.

Sekarang Anda memiliki aturan udev yang berfungsi. Symlink yang terikat ke alamat hub USB tidak peduli berapa nomor video yang dialokasikan ke port tersebut saat boot.

Tulis daftar akhir ke dalam file /etc/udev/rules.d/cam.rules. Jalankan udevadm triggeruntuk mengaktifkannya dan pekerjaan selesai. /dev/camera2akan menjadi kamera yang sama (port USB) terlepas dari nomor videonya.

Ian Boag
sumber
Selamat datang di unix stackexchange. Harap format jawaban Anda menggunakan penurunan harga. Aku hanya melakukannya untukmu. Juga perlu diingat bahwa kami ingin jawaban langsung ke intinya. Ini berbunyi lebih seperti entri blog (yang tidak sepenuhnya buruk) namun tidak membantu untuk membaca tentang pendekatan yang tidak berhasil. Anda dapat memo bagian itu.
k0pernikus
Maaf. Saya baru disini. Saya telah meneliti masalah ini selama berbulan-bulan. Saya menemukan orang lain bergumul dengan masalah yang sama dan saya tidak menemukan jawaban yang cocok untuk saya. Asal tahu saja, di mana Anda menyarankan agar saya memposting sesuatu seperti ini? Saya menahan diri dan tidak memasukkan sumber Python :-)
Ian Boag
1

Saya juga dapat menemukan perangkat unik di /dev/serial/by-id. Saya belum mencoba reboot, tetapi file-file di direktori itu hanyalah tautan ke file perangkat yang sesuai ( ttyACM[0-9]) .`

Saya menjalankan linux arch di Raspberry Pi, tapi saya menemukan mereka hanya dengan melakukan findnama file yang mengandung "Arduino". Program python saya berjalan dengan baik menggunakan file-file itu sebagai perangkat untuk membaca / menulis data ke / dari Arduinos saya (sejauh ini, dua pada satu Pi).

huey_driver
sumber
0

Hanya untuk mengatakan bahwa di atas bekerja untuk saya dan juga mengotomatiskan perangkat untuk saya setelah saya meletakkan entri di / etc / fstab (dan juga memanggil umount setelah melepas tongkat)

yaitu

/ etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

cat /etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

Jadi setelah memasukkan stik usb saya, saya dapat:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Akan
sumber