6 votes

Comment spécifiez-vous des points de montage statiques pour les lecteurs USB amovibles?

J'ai une série de ports et de concentrateurs USB. Lorsque vous attachez des lecteurs USB, Linux les attribue à des périphériques de blocs virtuels sur la base du premier arrivé, premier servi. Il crée sdd, sde, sdf, et ainsi de suite, peu importe le port dans lequel je branche les lecteurs. Nous copions des fichiers sur ces lecteurs et lorsqu'il y a une erreur, il m'est impossible de dire sur quel lecteur l'erreur s'est produite.

Ce que j'aimerais faire, c'est configurer udev pour mapper des périphériques/matériels physiques/ports à des périphériques virtuels spécifiques. C'est-à-dire, port 1 => sdd, port 2 => sde, port 3 => sdf, etc. Cela me permettrait de savoir sur quel lecteur USB l'erreur s'est produite.

J'ai trouvé quelques ressources (par exemple, http://reactivated.net/writing_udev_rules.html), à partir desquelles je peux dire que cela peut être fait. Cependant, je n'ai aucune expérience avec de telles configurations de bas niveau. Elles me semblent confuses.

Y a-t-il une autre référence qui pourrait rendre les choses plus claires? Ou peut-être un logiciel qui le fait pour moi? Ou une bibliothèque qui facilite les choses?

6voto

Heath Points 1230

/dev/disk/by-path contiendra des noms cohérents qui seront associés à des ports USB spécifiques (du moins c'est le cas sur ma machine).

Veuillez également consulter /dev/disk/by-id et /dev/disk/by-uuid comme moyens d'accéder à des périphériques spécifiques, quel que soit le chemin utilisé pour y accéder.

0voto

jammus Points 1796

Les lecteurs sont-ils montés automatiquement? Quel outil utilisez-vous pour le montage automatique? Recréez-vous le système de fichiers à chaque fois qu'ils sont montés, ou les partitions/le système de fichiers sont-ils assez stables?

Si vous étiquetez de manière unique les systèmes de fichiers, vous pouvez généralement monter le système de fichiers par l'étiquette au lieu du nom du périphérique.

Lorsque vous créez un système de fichiers, un UUID est attribué au système de fichiers. Vous pourriez apposer une étiquette de quelque sorte sur le périphérique USB qui correspond à l'UUID.

0voto

Le cas d'utilisation le plus typique serait de correspondre par UUID du système de fichiers, mais si vous écrivez des appareils identiques sur disque entier, cela ne fonctionnera pas. Au lieu de cela, vous pouvez correspondre par modèle et numéro de série. Un exemple (non testé) de règle udev pour cela est :

KERNEL=="sd*", ATTR{removable}=="1", ATTR{vendor}=="Yoyodine", ENV{ID_SERIAL}=="123-456-789", NAME=="disk/by-serial/scsi-$attr{vendor}-$env{ID_SERIAL}"

Pour voir quelles valeurs ATTR existent pour un appareil donné maintenant connu sous le nom de /dev/sdz, exécutez udevinfo -n /dev/sdz -a. Pour voir quelles valeurs ENV existent, exécutez udevinfo -n /dev/sdz --query=env.

Si vous souhaitez correspondre par port plutôt que par numéro de série, recherchez les appareils parents dans le document que vous citez. Je suppose que quelque chose comme KERNELS=="usb42" fonctionnerait, mais je n'ai pas essayé.

0voto

Je utilise ce hack avec deux scripts Python à des fins similaires :

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])

Cela me permet d'accéder aux lecteurs via l'étiquette :

target=`drive.py STICKY`
cp -v *.tex $target

J'espère que cela sera utile à quelqu'un !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X