udev规则,用于为相同的USB串行设备分配已知的符号链接


8

我有两个(可能将来会更多)相同的USB串行设备(不幸的是,序列号很低)-它们实际上是BTC矿机。当前,它们最终以ttyUSBXX为0、1或2结束,因为还有另一个不相关的USB串行设备(这里不必担心)。

我想编写一个udev规则,它将在内为它们分配可预测的名称/dev,例如/dev/miner0零是递增的整数。我不在乎其中的哪个会最终结束,但是我确实需要它们处于可预测的范围内,并且不会改变。

目前我有这个:

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

这很接近,因为我最终得到的名字像我想要的。唯一的问题是,因为矿工和第三装置有时会出现在一个随机的顺序,我可能最终有两个的miner0miner1miner2,但我从来不知道其中两个(无需手动寻找)。如果我添加更多非矿工USB串行设备(可能),则会加剧该问题。

我发现%e对它的引用似乎确实符合我的要求,但是似乎不再存在

如何给这些设备起可预测的名称?如果可能的话,我也不想将它们绑定到USB总线上的位置。


进一步的信息/背景

值得一提的是,我并没有为它们的名字而烦恼,只是即使它们被插入另一个USB插座,它们的名称也不会改变。我会简单地忘记整个udev并在中使用条目/dev/serial/by-id,但是由于它们具有相同的序列号,所以其中只有一个!

还值得一提的是,这样做的原因是需要告知挖掘软件一系列要探测和查找的设备。我可以让它完成所有工作(它基本上只是找到ttyUSB*范围内的所有有效矿工),但是这会惹恼非矿工设备。因此,我需要提前知道的矿工的名称,以便可以将其配置为仅使用那些名称。可悲的是它不会接受通配符(因此,仅告诉它使用/dev/miner*似乎是不可能的),因此就出现了这个问题。


2
(从电话中进行评论,所以我看不到):看一下处理/ dev / cdrom链接等的发行版代码。您应该可以使用这种方法。它使用一个文件来保留更改,但是可能会将其删除,或使用引导时清除的文件。
derobert 2013年

谢谢,这是我没有想到的好主意。我只是研究了它,而且看起来确实很复杂。我认为鉴于当前的问题,这可能需要太多的精力,但是如果我处理的是数十种设备而不是单幅数字设备,也许我会考虑一下。
Mark Embling 2013年

休息了一下,换了个眼神,这令人困惑。我看到它正在保存到文件中,而您是对的,因为我不想那样做。我无法弄清楚它如何找出下一个可用的逻辑,因为它似乎在写入文件之前先读取文件,然后在使用输出后再写入文件。莫名其妙。而且,bash脚本在最佳情况下也不是最容易遵循的脚本。
马克·艾姆伯恩

大多数Unix软件不带通配符,外壳用于扩展通配符。您可以使用其他工具来扩展通配符吗?
ctrl-alt-delor 2013年

@richard我不确定。鉴于我从下面的答案中得到了什么,所以这不是必需的,因为我有一个明智的序列,可以在启动软件的脚本中手动添加标志。无论如何,理想情况下也要解决这一部分,我需要从通配符(看起来像/dev/btcminer/*)到这样的列表:-S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>这是软件需要的参数。
Mark Embling 2013年

Answers:


4

这是未经测试的组合:

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环境变量来命名您的矿工。


谢谢,这极大地帮助了。我对其进行了一些调整,以便程序仅返回数字(并仅获取前两个参数),然后从udev规则的PROGRAM选项中使用它,其输出用于创建符号链接名称。我现在有/dev/btcminer/0/dev/btcminer/1这是我追求的(略微调整的版本)。谢谢你!:-)
Mark Embling 2013年

我还应该提到,我也不得不将shebang更改#!/bin/bash为。由于某种原因,sh声称存在语法错误(“意外的单词”)。Dunno为什么或sh在Ubuntu下是什么,但这解决了。
马克·艾姆伯恩

1
@MarkEmbling证明SUS只需要支持不超过9的数字。因此,如果将这两个16s 更改为9s,则它将在中起作用/bin/sh。至少用破折号。(由于某种原因,该系统上的/ bin / sh受到
打击

太好了,它现在可以与/ bin / sh完美配合。再次感谢您,最近几天我学到了很多东西。昨天之前从未接触过udev :-)
Mark Embling 2013年

2

这个问题已经有了一个可以接受的答案,但是我决定分享我对derobert提供的解决方案的各种选择。

我的要求略有不同-除了为新设备提供“递增”的索引号外,我还希望重新获取由已从系统中删除的设备放弃的索引号。

用于设置环境变量的udev规则如下所示:

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

在我的解决方案中,我不使用文件来跟踪索引,而是简单地遍历现有文件 并找到第一个可用的索引:

/usr/local/sbin/unique-num 脚本:

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

当然,这将打印出具有第一个可用索引的var-name,例如,如果这些 已经存在:

miner0
miner1
miner2

然后miner1与系统分离-我们剩下:

miner0
miner2

运行脚本将返回:

MINER_NUM=1

...因为这是第一个可用的索引

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.