如何为可移动 USB 驱动器指定静态挂载点?

如何为可移动 USB 驱动器指定静态挂载点?

我有一堆 USB 端口和集线器。当您连接 USB 拇指驱动器时,Linux 会按照先到先得的原则将它们分配给虚拟块设备。无论我将驱动器插入哪个端口,它都会创建 sdd、sde、sdf 等。我们将文件复制到这些驱动器上,当出现错误时,我无法分辨错误发生在哪个驱动器上。

我想要做的是配置 udev,以便它将物理硬件设备/端口映射到特定的虚拟设备。即,端口 1 => sdd、端口 2 => sde、端口 3 => sdf 等。这样我就能知道错误发生在哪个 U 盘上。

我找到了一些资源(例如http://reactivated.net/writing_udev_rules.html),从中我可以看出这是可以做到的。但是我没有处理过这种低级配置。它们让我感到困惑。

有没有其他参考资料可以让事情更清楚?或者也许有软件可以帮我做这件事?或者有库可以让事情变得更容易?

答案1

/dev/disk/by-path将包含映射到特定 USB 端口的一致名称(至少在我的盒子上是这样)。

还请检查/dev/disk/by-id/dev/disk/by-uuid找到访问特定设备的方法,无论使用哪条路径访问它们。

答案2

这些驱动器是否自动挂载?您使用什么工具进行自动挂载?每次挂载时您是否都会重新创建文件系统,还是分区/文件系统非常稳定?

如果您唯一地标记文件系统,通常您可以通过标签而不是设备名称来挂载文件系统。

创建文件系统时,会为文件系统分配一个 UUID。您可以在 USB 设备上贴上与 UUID 对应的某种标签。

答案3

最典型的用例是按文件系统 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}"

要查看ATTR给定设备(现称为 )的现有值/dev/sdz,请运行udevinfo -n /dev/sdz -a。要查看现有ENV值,请运行udevinfo -n /dev/sdz --query=env

如果您想按端口而不是序列号进行匹配,请在您引用的文档中查找父设备。我怀疑类似的方法KERNELS=="usb42"会起作用,但我还没有尝试过。

答案4

我将这个技巧与两个 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

希望任何人都会发现这有帮助!

相关内容