web-dev-qa-db-ja.com

リムーバブルUSBドライブの静的マウントポイントをどのように指定しますか?

USBポートとハブがたくさんあります。 USBサムドライブを接続すると、Linuxはそれらを先着順で仮想ブロックデバイスに割り当てます。ドライブを接続するポートに関係なく、sdd、sde、sdfなどが作成されます。これらのドライブにファイルをコピーしますが、エラーが発生した場合、どのドライブでエラーが発生したかを知ることはできません。

私がやりたいのは、物理ハードウェアデバイス/ポートを特定の仮想デバイスにマップするようにudevを構成することです。つまり、ポート1 => sdd、ポート2 => sde、ポート3 => sdfなどです。これにより、エラーが発生したサムドライブを特定できます。

いくつかのリソース(例: http://reactivate.net/writing_udev_rules.html )を見つけました。そこから、これを実行できることがわかります。ただし、このような低レベルの構成の経験はありません。彼らは私を混乱させています。

物事をより明確にするかもしれない別の参照はありますか?それとも私のためにそれを行ういくつかのソフトウェア?それともそれを簡単にするライブラリ?

6
Nick

/dev/disk/by-pathには、特定のUSBポートにマップされる一貫した名前が含まれます(少なくとも私のボックスではマップされます)。

また、特定のデバイスへのアクセスに使用されているパスに関係なく、特定のデバイスにアクセスする方法については、/dev/disk/by-idおよび/dev/disk/by-uuidを確認してください。

6
Heath

これらのドライブは自動マウントされていますか?自動マウントにはどのツールを使用していますか?マウントするたびにファイルシステムを再作成していますか、それともパーティション/ファイルシステムはかなり安定していますか?

通常、ファイルシステムに一意のラベルを付ける場合は、デバイス名の代わりにラベルでファイルシステムをマウントできます。

ファイルシステムを作成すると、UUIDがファイルシステムに割り当てられます。 UUIDに対応するUSB​​デバイスに何らかのラベルを付けることができます。

0
Zoredache

最も一般的な使用例は、ファイルシステム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

誰もがこれが役立つことを願っています!