Mar*_*ing 10 ubuntu usb udev serial-port
我有两个(将来可能还会有更多)USB 串行设备,它们是相同的(不幸的是,直到序列号)——它们实际上是 BTC 矿工。目前,它们最终以ttyUSBX
X 为 0、1 或 2 的位置结束,因为还有另一个不相关的 USB 串行设备(此处无需担心)。
我想编写一个 udev 规则,它将在 内为它们分配可预测的名称/dev
,例如/dev/miner0
零是递增的整数。我不在乎它们中的哪一个最终变成了哪一个,但我确实需要它们在一个不会改变的可预测范围内。
目前我有这个:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="miner%n"
Run Code Online (Sandbox Code Playgroud)
这非常接近,因为我最终得到了我想要的名字。唯一的问题是,由于矿工和第三个设备有时会以随机顺序出现,我最终可能会得到两个miner0
,miner1
和miner2
,但我永远不知道是哪两个(无需手动查看)。如果我添加更多非矿工 USB 串行设备(这是可能的),它会加剧问题。
我找到了参考%e
,看起来它完全符合我的要求,但它似乎不再存在。
我如何为这些设备提供可预测的名称?如果可能的话,我也不想将它们与它们在 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"
Run Code Online (Sandbox Code Playgroud)
然后您可以使用该 udev 环境变量来命名您的矿工。