aturan udev untuk menetapkan symlink yang diketahui untuk perangkat serial usb identik

8

Saya memiliki dua (dan mungkin di masa depan, lebih banyak) perangkat serial USB yang identik (turun ke nomor seri, sayangnya) - mereka sebenarnya adalah penambang BTC. Saat ini mereka berakhir di ttyUSBXmana X adalah 0, 1 atau 2, karena ada perangkat serial USB lain yang tidak terkait juga (yang tidak perlu khawatir di sini).

Saya ingin menulis aturan udev yang akan memberi mereka nama yang dapat diprediksi di dalam /dev, seperti di /dev/miner0mana nol adalah bilangan bulat yang bertambah. Saya tidak peduli yang mana dari mereka yang akhirnya, tetapi saya perlu mereka berada dalam kisaran yang dapat diprediksi yang tidak akan berubah.

Saat ini saya punya ini:

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="miner%n"

Ini cukup dekat, karena saya berakhir dengan nama-nama seperti yang saya inginkan. Satu-satunya masalah adalah, karena penambang dan perangkat ketiga kadang-kadang dapat muncul dalam urutan acak, saya mungkin berakhir dengan dua miner0, miner1dan miner2, tapi saya tidak pernah tahu yang dua (tanpa melihat secara manual). Jika saya menambahkan lagi perangkat serial non-penambang usb (yang kemungkinan), itu akan memperburuk masalah.

Saya telah menemukan referensi %eyang sepertinya melakukan apa yang saya inginkan, tetapi sepertinya tidak ada lagi .

Bagaimana saya bisa memberikan perangkat ini nama yang dapat diprediksi? Saya lebih suka untuk tidak mengikat mereka ke lokasi mereka di bus USB juga jika memungkinkan.


Informasi / latar belakang lebih lanjut

Perlu disebutkan bahwa saya tidak terlalu peduli dengan namanya, hanya saja mereka dikenal dan tidak berubah bahkan jika / ketika perangkat terhubung ke soket USB yang berbeda. Saya hanya akan melupakan seluruh hal udev dan menggunakan entri /dev/serial/by-id, tetapi karena mereka memiliki nomor seri yang sama, hanya ada satu di antaranya!

Perlu juga disebutkan bahwa alasan untuk melakukan ini adalah bahwa perangkat lunak penambangan perlu diberi tahu daftar perangkat untuk diselidiki dan ditemukan. Saya bisa saja melakukan semuanya (pada dasarnya hanya menemukan semua penambang yang valid dalam ttyUSB*kisaran), tetapi itu mengganggu perangkat non-penambang. Jadi saya perlu nama-nama penambang yang sudah diketahui sebelumnya sehingga saya bisa mengkonfigurasinya untuk hanya menggunakan itu saja. Sayangnya itu tidak akan menerima wildcard (jadi hanya mengatakannya untuk menggunakan /dev/miner*tampaknya tidak mungkin), maka masalah ini.

Tandai Embling
sumber
2
(berkomentar dari telepon, jadi saya tidak bisa melihat): Lihatlah kode distro Anda yang menangani / dev / cdrom tautan, dll. Anda harus dapat menggesek pendekatan itu. Ini menggunakan file untuk mempertahankan perubahan, tetapi kemungkinan bisa menghapusnya, atau menggunakan yang dihapus saat boot.
derobert
Terima kasih, itu adalah pemikiran yang baik yang tidak terpikir oleh saya. Saya baru saja melihat ke dalamnya dan tampaknya sangat rumit. Saya pikir itu mungkin terlalu banyak upaya mengingat masalah saat ini, tapi mungkin sesuatu yang akan saya lihat jika saya berurusan dengan puluhan perangkat daripada angka tunggal.
Mark Embling
Beristirahat dan melihat lagi dan itu membingungkan. Saya melihat file ini masih ada dan Anda benar bahwa saya tidak menginginkannya. Saya tidak bisa mencari tahu logika bagaimana mencari tahu yang tersedia berikutnya, karena tampaknya membaca file sebelum ditulis dan kemudian menulis kepadanya setelah menggunakan output. Benar-benar membingungkan. Dan skrip bash bukan yang termudah untuk diikuti pada saat terbaik.
Mark Embling
Sebagian besar perangkat lunak Unix tidak mengambil kartu liar, shell digunakan untuk mengembangkannya. Bisakah Anda menggunakan alat lain untuk memperluas wildcard.
ctrl-alt-delor
@ Richard, saya tidak yakin. Mengingat apa yang saya dapatkan dari jawaban di bawah ini, itu tidak penting karena saya punya urutan yang masuk akal yang secara manual saya tambahkan tanda pada skrip yang meluncurkan perangkat lunak. Namun idealnya untuk menyelesaikan bagian ini juga, saya harus mendapatkan dari wildcard (yang akan terlihat seperti /dev/btcminer/*) ke daftar seperti ini: -S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>yang merupakan parameter yang diambil oleh perangkat lunak.
Mark Embling

Jawaban:

4

Ini belum teruji dalam kombinasi:

Tambahkan aturan udev IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"untuk penambang Anda.

Maka Anda bisa menggunakan skrip shell sederhana, sesuatu seperti program yang agak teruji ini:

#!/bin/sh

if [ $# -ne 3 ]; then
    echo "Usage: $0 data-file initial var-name" >&2
    exit 1
fi

datfile="$1"
lockfile="$1.lck"
initial=$2
key="$3"

(
    flock -x 9
    num=$initial
    if [ -e "$datfile" ]; then
        read -r num < "$datfile"
    fi

    next=`expr $num + 1`;
    echo $next > "$datfile"

    echo "$key=$num"
) 9> "$lockfile"

Kemudian Anda dapat menggunakan variabel lingkungan udev untuk memberi nama penambang Anda.

derobert
sumber
Ini sangat membantu, terima kasih. Saya mengubahnya sedikit sehingga program mengembalikan hanya nomor (dan hanya mengambil dua argumen pertama) dan kemudian menggunakannya dari dalam opsi PROGRAM dalam aturan udev saya, yang hasilnya digunakan untuk membuat nama symlink. Saya sekarang memiliki /dev/btcminer/0dan /dev/btcminer/1yang merupakan (versi yang sedikit tweak) apa yang saya cari. Terima kasih untuk ini! :-)
Mark Embling
Saya juga harus menyebutkan bahwa saya juga harus mengubah shebang #!/bin/bash. Untuk beberapa alasan, shdiklaim ada kesalahan sintaksis ("kata yang tidak terduga"). Entah mengapa atau apa yang shada di bawah Ubuntu, tetapi itu menyelesaikannya.
Mark Embling
1
@ MarkEmbling Ternyata SUS hanya membutuhkan angka hingga 9 untuk didukung. Jadi, jika Anda mengubah kedua 16s ke 9s, maka itu akan berhasil /bin/sh. Setidaknya dengan tanda hubung. (/ bin / sh pada sistem ini adalah bash untuk beberapa alasan)
derobert
Itu sempurna, sekarang berfungsi sempurna dengan / bin / sh. Terima kasih sekali lagi untuk ini, saya telah belajar banyak dalam beberapa hari terakhir. Tidak pernah menyentuh udev sama sekali sebelum kemarin :-)
Mark Embling
2

Pertanyaannya sudah memiliki jawaban yang diterima, tetapi saya memutuskan untuk membagikan variasi solusi yang disediakan oleh derobert .

Persyaratan saya sedikit berbeda - selain memberikan nomor indeks "tambahan" ke perangkat baru - saya ingin mendapatkan kembali nomor indeks yang diberikan oleh perangkat yang telah dihapus dari sistem.

Aturan udev untuk mengatur variabel lingkungan akan terlihat seperti ini:

IMPORT{program}="/usr/local/sbin/unique-num /dev miner MINER_NUM"

Dalam solusi saya, saya tidak menggunakan file untuk melacak indeks, saya hanya mengulangi yang sudah ada dan temukan indeks pertama yang tersedia:

/usr/local/sbin/unique-num naskah:

#!/bin/bash

if [ $# -ne 3 ]; then
    echo "Usage: $0 location prefix var-name" >&2
    exit 1
fi

location="$1"
prefix="$2"
key="$3"

needindex=1
index=0

while [ $needindex -eq 1 ]
do
        if [ ! -e $location/$prefix$index ]; then
                needindex=0
                echo "$key=$index"
        else
                (( index++ ))
        fi
done

Ini tentu saja akan mencetak var-name dengan indeks pertama yang tersedia, misalnya jika ini sudah ada:

miner0
miner1
miner2

dan kemudian miner1terlepas dari sistem - kita dibiarkan dengan:

miner0
miner2

Menjalankan skrip akan kembali:

MINER_NUM=1

... karena sekarang ini adalah indeks pertama yang tersedia .

dtmland
sumber