quy tắc udev để gán các liên kết tượng trưng đã biết cho các thiết bị nối tiếp usb giống hệt nhau


8

Tôi có hai (và có thể trong tương lai, nhiều hơn nữa) các thiết bị nối tiếp USB giống hệt nhau (không may là số sê-ri) - thực sự chúng là các công cụ khai thác BTC. Hiện tại, chúng kết thúc với ttyUSBXvị trí X là 0, 1 hoặc 2, vì cũng có một thiết bị nối tiếp USB không liên quan khác (không cần phải lo lắng ở đây).

Tôi muốn viết một quy tắc udev sẽ gán cho chúng các tên có thể dự đoán được bên trong /dev, giống như /dev/miner0trong đó số 0 là số nguyên tăng dần. Tôi không quan tâm cái nào trong số chúng kết thúc như cái nào, nhưng tôi cần chúng nằm trong một phạm vi có thể dự đoán sẽ không thay đổi.

Hiện tại tôi có cái này:

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

Điều này khá gần, vì tôi kết thúc với những cái tên như tôi muốn. Vấn đề duy nhất là, vì các công cụ khai thác và thiết bị thứ ba đôi khi có thể xuất hiện theo thứ tự ngẫu nhiên, tôi có thể kết thúc với hai miner0, miner1miner2, nhưng tôi không bao giờ biết hai cái nào (mà không cần tìm thủ công). Nếu tôi thêm bất kỳ thiết bị nối tiếp usb không khai thác nào nữa (đó là một khả năng), nó sẽ làm trầm trọng thêm vấn đề.

Tôi đã tìm thấy tài liệu tham khảo %etrông giống như nó đã làm chính xác những gì tôi muốn, nhưng nó dường như không còn tồn tại nữa .

Làm thế nào tôi có thể cung cấp cho các thiết bị này tên dự đoán? Tôi không muốn buộc chúng vào vị trí của chúng trên xe buýt USB nếu có thể.


Thông tin thêm / lý lịch

Điều đáng nói là tôi không bận tâm tên đó là gì, chỉ là chúng được biết và không thay đổi ngay cả khi / khi thiết bị được cắm vào ổ cắm USB khác. Tôi chỉ đơn giản là quên toàn bộ điều udev và sử dụng các mục trong đó /dev/serial/by-id, nhưng vì chúng có cùng số sê-ri, nên chỉ có một trong số chúng trong đó!

Điều đáng nói là lý do để làm điều này là phần mềm khai thác cần được cho biết một danh sách các thiết bị cần thăm dò và tìm kiếm. Tôi chỉ có thể làm cho nó làm tất cả (về cơ bản nó chỉ tìm thấy tất cả các công cụ khai thác hợp lệ trong ttyUSB*phạm vi), nhưng điều đó gây khó chịu cho thiết bị không khai thác. Vì vậy, tôi cần tên của các thợ mỏ được biết trước để tôi có thể định cấu hình nó để sử dụng chỉ những cái đó. Đáng buồn thay, nó sẽ không chấp nhận một ký tự đại diện (vì vậy chỉ cần nói với nó để sử dụng /dev/miner*dường như là không cần thiết), do đó vấn đề này.


2
(nhận xét từ điện thoại, vì vậy tôi không thể nhìn): Hãy xem mã của distro của bạn xử lý các liên kết / dev / cdrom, v.v. Bạn sẽ có thể vuốt cách tiếp cận đó. Nó sử dụng một tệp để duy trì các thay đổi, nhưng có thể loại bỏ nó hoặc sử dụng một tệp bị xóa khi khởi động.
derobert

Cảm ơn, đó là một suy nghĩ tốt đã không xảy ra với tôi. Tôi vừa mới nhìn vào nó và nó có vẻ khá phức tạp. Tôi nghĩ rằng có thể có quá nhiều nỗ lực cho vấn đề hiện tại, nhưng có lẽ điều gì đó tôi sẽ xem xét nếu tôi đang xử lý hàng chục thiết bị thay vì một con số.
Đánh dấu

Đã nghỉ ngơi và có một cái nhìn khác và nó gây trở ngại. Tôi thấy nó vẫn tồn tại với một tập tin và bạn nói đúng rằng tôi không muốn điều đó. Tôi không thể tìm ra logic của cách nó tìm ra cái tiếp theo có sẵn, vì dường như nó đang đọc tệp trước khi nó được viết và sau đó viết cho nó sau khi nó sử dụng đầu ra. Hoàn toàn khó hiểu. Và bash script không phải là dễ nhất để theo dõi vào thời điểm tốt nhất.
Đánh dấu

Hầu hết các phần mềm Unix không lấy thẻ hoang dã, vỏ được sử dụng để mở rộng chúng. Bạn có thể sử dụng một công cụ khác để mở rộng các ký tự đại diện.
ctrl-alt-delor

@richard Tôi không chắc. Dựa vào những gì tôi đã nhận được từ câu trả lời dưới đây, điều đó không cần thiết vì tôi đã có một chuỗi hợp lý mà tôi tự thêm các cờ cho trong tập lệnh khởi chạy phần mềm. Tuy nhiên, lý tưởng để giải quyết phần này, tôi cần phải lấy từ ký tự đại diện (trông giống như vậy /dev/btcminer/*) đến một danh sách như thế này: -S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>đó là các tham số mà phần mềm lấy.
Đánh dấu

Câu trả lời:


4

Điều này chưa được kiểm tra trong sự kết hợp:

Thêm một quy tắc udev IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"cho các thợ mỏ của bạn.

Sau đó, bạn có thể sử dụng một tập lệnh shell đơn giản, giống như chương trình đã được thử nghiệm này:

#!/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"

Sau đó, bạn có thể sử dụng biến môi trường udev đó để đặt tên cho các công cụ khai thác của bạn.


Điều này đã giúp rất nhiều, cảm ơn. Tôi đã tinh chỉnh nó một chút để chương trình chỉ trả về số (và chỉ lấy hai đối số đầu tiên) và sau đó sử dụng nó từ trong tùy chọn PROGRAM trong quy tắc udev của tôi, đầu ra của chúng được sử dụng để tạo tên liên kết tượng trưng. Bây giờ tôi có /dev/btcminer/0/dev/btcminer/1đó là (một phiên bản hơi tinh chỉnh) những gì tôi đã theo sau. Cám ơn vì cái này! :-)
Đánh dấu

Tôi cũng nên đề cập rằng tôi cũng phải thay đổi shebang #!/bin/bash. Vì một số lý do, shtuyên bố đã có lỗi cú pháp ("từ không mong muốn"). Không biết tại sao hoặc những gì shthuộc Ubuntu, nhưng điều đó đã giải quyết nó.
Đánh dấu

1
@MarkEmbled Hóa ra rằng SUS chỉ yêu cầu số tối đa 9 để được hỗ trợ. Vì vậy, nếu bạn thay đổi hai 16s thành 9s, thì nó sẽ hoạt động /bin/sh. Ít nhất là với dấu gạch ngang. (/ bin / sh trên hệ thống này là bash vì một số lý do)
derobert

Thật hoàn hảo, giờ đây nó hoạt động hoàn hảo với / bin / sh. Cảm ơn một lần nữa vì điều này, tôi đã học được rất nhiều trong vài ngày qua. Chưa bao giờ chạm vào udev trước ngày hôm qua :-)
Đánh dấu

2

Câu hỏi đã có câu trả lời được chấp nhận, nhưng tôi quyết định chia sẻ biến thể của mình về giải pháp được cung cấp bởi derobert .

Yêu cầu của tôi hơi khác một chút - ngoài việc cung cấp số chỉ mục "tăng dần" cho các thiết bị mới - tôi muốn hỏi lại các số chỉ mục được cung cấp bởi các thiết bị đã bị xóa khỏi hệ thống.

Quy tắc udev để thiết lập biến môi trường sẽ trông giống như thế này:

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

Trong giải pháp của tôi, tôi không sử dụng một tệp để theo dõi chỉ mục, tôi chỉ đơn giản lặp lại trên hiện tại và tìm chỉ mục có sẵn đầu tiên:

/usr/local/sbin/unique-num kịch bản:

#!/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

Tất nhiên, điều này sẽ in ra tên var với chỉ mục có sẵn đầu tiên, ví dụ nếu những đã tồn tại:

miner0
miner1
miner2

và sau đó miner1được tách ra khỏi hệ thống - chúng tôi chỉ còn lại:

miner0
miner2

Chạy script sẽ trở lại:

MINER_NUM=1

... vì đây là chỉ số có sẵn đầu tiên .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.