USBポートとハブがたくさんあります。 USBサムドライブを接続すると、Linuxはそれらを先着順で仮想ブロックデバイスに割り当てます。ドライブを接続するポートに関係なく、sdd、sde、sdfなどが作成されます。これらのドライブにファイルをコピーしますが、エラーが発生した場合、どのドライブでエラーが発生したかを知ることはできません。
私がやりたいのは、物理ハードウェアデバイス/ポートを特定の仮想デバイスにマップするようにudevを構成することです。つまり、ポート1 => sdd、ポート2 => sde、ポート3 => sdfなどです。これにより、エラーが発生したサムドライブを特定できます。
いくつかのリソース(例: http://reactivate.net/writing_udev_rules.html )を見つけました。そこから、これを実行できることがわかります。ただし、このような低レベルの構成の経験はありません。彼らは私を混乱させています。
物事をより明確にするかもしれない別の参照はありますか?それとも私のためにそれを行ういくつかのソフトウェア?それともそれを簡単にするライブラリ?
/dev/disk/by-path
には、特定のUSBポートにマップされる一貫した名前が含まれます(少なくとも私のボックスではマップされます)。
また、特定のデバイスへのアクセスに使用されているパスに関係なく、特定のデバイスにアクセスする方法については、/dev/disk/by-id
および/dev/disk/by-uuid
を確認してください。
これらのドライブは自動マウントされていますか?自動マウントにはどのツールを使用していますか?マウントするたびにファイルシステムを再作成していますか、それともパーティション/ファイルシステムはかなり安定していますか?
通常、ファイルシステムに一意のラベルを付ける場合は、デバイス名の代わりにラベルでファイルシステムをマウントできます。
ファイルシステムを作成すると、UUIDがファイルシステムに割り当てられます。 UUIDに対応するUSBデバイスに何らかのラベルを付けることができます。
最も一般的な使用例は、ファイルシステムuuidで照合することですが、ディスク全体が同一のデバイスを作成している場合は、そうではありません。代わりに、モデルとシリアル番号で照合できます。このための(テストされていない)udev
ルールの例は次のとおりです。
KERNEL=="sd*", ATTR{removable}=="1", ATTR{vendor}=="Yoyodine", ENV{ID_SERIAL}=="123-456-789", NAME=="disk/by-serial/scsi-$attr{vendor}-$env{ID_SERIAL}"
現在/dev/sdz
として知られている特定のデバイスに存在するATTR
値を確認するには、udevinfo -n /dev/sdz -a
を実行します。存在するENV
値を確認するには、udevinfo -n /dev/sdz --query=env
を実行します。
シリアル番号ではなくポートで照合する場合は、引用するドキュメントで親デバイスを検索してください。 KERNELS=="usb42"
のようなものが機能すると思いますが、試していません。
私はこのハックを2つのPythonスクリプトで同様の目的で使用しています:
ophis@tlatoani:~$ more /usr/bin/drive.py
# !/usr/bin/env python
import os, sys
if len(sys.argv) == 2:
label = sys.argv[1]
os.system("drivelabels.py >/tmp/drv.txt")
drvmap = map(lambda x:map(lambda y:y.strip(), x.split("\t")), file("/tmp/drv.txt").readlines())
for d in drvmap:
if d[0] == label:
print d[1]
sys.exit()
print "/srv"
ophis@tlatoani:~$ more /usr/bin/drivelabels.py
#!/usr/bin/env python
import os
os.system("ls -lh /dev/disk/by-label >/tmp/bylabels.txt ; df -ha >/tmp/drivemap.txt")
bylabel_text=map(lambda x:x.split(" "), file("/tmp/bylabels.txt").readlines())
l, ll = {}, {}
for byl_t in bylabel_text:
label, dev = byl_t[len(byl_t)-3], byl_t[len(byl_t)-1]
dev = dev[-dev.rfind("/"):].strip()
if dev != "": l[ label ] = dev
drivemap_txt=map(lambda x:x.split(" "), file("/tmp/drivemap.txt").readlines())
for k in l.keys():
for d in drivemap_txt:
if d[0].strip() == "/dev/%s" % l[k]: ll[ k ] = d[-1].strip()
for assign in ll.keys(): print "%s\t%s" % (assign, ll[assign])
したがって、これにより、ラベルを介してドライブにアクセスできます。
target=`drive.py STICKY`
cp -v *.tex $target
誰もがこれが役立つことを願っています!