用於為相同的 USB 串列設備分配已知符號連結的 udev 規則
我有兩個(將來可能還會更多)相同的 USB 串列設備(不幸的是,直到序列號)——它們實際上是 BTC 礦工。目前它們最終以
ttyUSBX
X 為 0、1 或 2 的位置結束,因為還有另一個不相關的 USB 串列設備(這裡不必擔心)。我想編寫一個 udev 規則,它將在 中為它們分配可預測的名稱
/dev
,例如/dev/miner0
零是遞增整數。我不在乎它們中的哪一個最終是哪個,但我確實需要它們在一個不會改變的可預測範圍內。目前我有這個:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="miner%n"
這非常接近,因為我最終得到了我想要的名字。唯一的問題是,由於礦工和第三台設備有時會以隨機順序出現,我最終可能會得到兩個
miner0
,miner1
和miner2
,但我永遠不知道哪兩個(無需手動查看)。如果我添加更多非礦工 USB 串列設備(這是可能的),它會加劇問題。我找到了對
%e
which 的引用看起來就像我想要的那樣,但它似乎不再存在了。我如何給這些設備起可預測的名稱?如果可能的話,我也不希望將它們綁定到它們在 USB 匯流排上的位置。
更多資訊/背景
值得一提的是,我並不在意這些名稱是什麼,只是它們是已知的並且即使/當設備插入不同的 USB 插座時也不會改變。我會簡單地忘記整個 udev 的事情並使用 中的條目
/dev/serial/by-id
,但是由於它們具有相同的序列號,因此那裡只有一個!還值得一提的是,這樣做的原因是需要告訴挖礦軟體一個要探測和查找的設備列表。我可以讓它做所有事情(它基本上只是找到
ttyUSB*
範圍內的所有有效礦工),但這會惹惱非礦工設備。所以我需要提前知道礦工的名字,這樣我就可以將其配置為只使用這些。可悲的是,它不接受萬用字元(所以只是告訴它使用/dev/miner*
似乎是不可能的),因此出現了這個問題。
這是未經測試的組合:
IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"
為您的礦工添加 udev 規則。然後你可以使用一個簡單的 shell 腳本,類似於這個經過測試的程序:
#!/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"
然後,您可以使用該 udev 環境變數來命名您的礦工。