同一のUSBシリアルデバイスに既知のシンボリックリンクを割り当てるためのudevルール


8

私は2つの(そして将来的にはもっと多くの)USBシリアルデバイスを持っています(残念ながらシリアル番号まで)-それらは実際にはBTCマイナーです。現在、それらttyUSBXはXが0、1、または2となるようになっています。無関係なUSBシリアルデバイスも他にあるためです(ここで心配する必要はありません)。

ゼロが増分する整数の/devよう/dev/miner0に、内で予測可能な名前を割り当てるudevルールを書きたいと思います。どちらが最終的にどちらになるかは気にしませんが、変化しない予測可能な範囲内にある必要があります。

現在私はこれを持っています:

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

私が望むような名前になってしまうので、これはかなり近いです。唯一の問題は、鉱山労働者と3番目のデバイスがランダムな順序で表示されることがあるのでminer0miner1miner2、の2つになる可能性がありますが、(手動で見ることなく)どちらがどちらなのかわかりません。マイナー以外のUSBシリアルデバイスを追加すると(可能性があります)、問題が悪化します。

私が%e望んでいたとおりの参照を見つけましたが、もう存在しいないようです

これらのデバイスに予測可能な名前を付けるにはどうすればよいですか?できれば、USBバス上の場所にも接続しないようにしたいと思います。


詳細情報/背景

名前が何であるかを気にしているわけではありません。デバイスが別のUSBソケットに接続された場合でも、名前がわかっていて変わらないことだけに言及しておきましょう。私は単にudev全体を忘れてのエントリを使用します/dev/serial/by-idが、それらは同じシリアル番号を持っているため、そこには1つしかありません!

また、これを行う理由は、マイニングソフトウェアに、プローブおよび検出するデバイスのリストを通知する必要があることです。私はそれをすべて行うことができます(基本的にはttyUSB*範囲内のすべての有効なマイナーを見つけるだけです)が、それは非マイナーデバイスを困らせます。それで、それらだけを使用するように構成できるように、事前にわかっているマイナーの名前が必要です。悲しいことに、それはワイルドカードを受け入れません(そのため、使用する/dev/miner*ように指示するだけでは問題外と思われます)。したがって、この問題です。


2
(電話からコメントしているので、見ることができません):/ dev / cdromリンクなどを処理するディストリビューションのコードを見てください。そのアプローチをスワイプできるはずです。変更を永続化するためにファイルを使用しますが、おそらくそれを取り除いたり、起動時にクリアされたファイルを使用したりできます。
derobert

ありがとう、それは私には起こらなかった良い考えでした。私はそれを調べたばかりですが、それは本当にかなり複雑に見えます。現在の問題を考えると、それは大変な労力であると思いますが、おそらく、1桁ではなく数十台のデバイスを扱っているのであれば、私は注目したいと思います。
Mark Embling

休憩して、もう一度見てみると、それは不可解です。私はそれがファイルに永続化しているのを見ます、そしてあなたは私がそれを望まないということで正しいです。しかし、ファイルが書き込まれる前にファイルを読み取り、出力を使用した後にファイルに書き込んでいるように見えるため、どのようにして次に利用できるかを理解するロジックを理解できません。完全に不可解。そして、bashスクリプトは、最良の状態でフォローするのが最も簡単ではありません。
Mark Embling

ほとんどのUnixソフトウェアはワイルドカードを使用せず、シェルを使用してそれらを展開します。別のツールを使用してワイルドカードを展開できますか?
ctrl-alt-delor 2013

@richardわかりません。以下の答えから得たものを考えると、ソフトウェアを起動するスクリプトに手動でフラグを追加する賢明なシーケンスがあるので、それは必須ではありません。ただし、この部分も理想的に解決するには、ワイルドカード(のように見える/dev/btcminer/*)から次のようなリストに移動する必要-S /dev/btcminer/0 -S /dev/btcminer/1 <and so on if present>があります。これは、ソフトウェアが取るパラメーターです。
Mark Embling

回答:


4

これは組み合わせでテストされていません:

IMPORT{program}="/usr/local/sbin/unique-num /run/miner-counter 0 MINER_NUM"鉱夫のためにudevルールを追加します。

次に、次のようなある程度テストされたプログラムのような単純なシェルスクリプトを使用できます。

#!/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環境変数を使用してマイナーに名前を付けることができます。


これは非常に役に立ちました、ありがとう。私はそれを少し微調整して、プログラムが数値だけを返し(そして最初の2つの引数のみを取る)、udevルールのPROGRAMオプション内からそれを使用しました。その出力は、シンボリックリンク名を作成するために使用されました。私は今持っており/dev/btcminer/0/dev/btcminer/1それは私が求めていたもの(の少し微調整されたバージョン)です。これをありがとう!:-)
Mark Embling

また、シバンをに変更しなければならなかったことにも言及する必要があり#!/bin/bashます。何らかの理由でsh、構文エラー(「予期しない単語」)があったと主張しました。Dunno shは、Ubuntuの下にある理由や理由を説明しましたが、それで解決しました。
Mark Embling

1
@MarkEmbling SUSがサポートする必要があるのは最大9までの数であることがわかります。したがって、これら2つ16のをに変更する9と、で機能し/bin/shます。少なくともダッシュ付き。(このシステムの/ bin / shは何らかの理由でbashです)
derobert

/ bin / shで完全に動作するようになりました。もう一度感謝します。ここ数日で多くのことを学びました。昨日までにudevにまったく触れたことはありません:-)
Mark Embling

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

...これが現在利用可能な最初のインデックスなので

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.