Une clé USB aura-t-elle le même nom chaque fois que je la monterai?

9

J'ai une clé USB qui sera utilisée pour enregistrer des données quotidiennement via un script bash. J'ai réussi à le monter pour qu'un utilisateur spécifique puisse y écrire des dossiers en utilisant la commande:

mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop

Le script peut s'exécuter et créer des répertoires à sa guise et c'est parfait. À un moment donné, la clé USB sera débranchée et remplacée par une nouvelle (même modèle). La nouvelle clé USB /dev/sdc1aura-t-elle toujours le nom ou sera-t-elle différente?

Si c'est différent, comment puis-je inclure la pièce de montage dans mon script pour qu'elle soit faite automatiquement?

Gudrun
la source
2
La réponse est non, mais vous pouvez contourner cela avec les règles udev . Voir ici pour une explication meilleure mais légèrement dépassée.
Satō Katsura
@AlexTartan Si vous branchez n'importe quel autre disque USB dans un autre port USB avant qu'il ne devienne sdc. Votre contrainte "et rien d'autre n'est assigné à sdc1" est donc vraie. En général, c'est une hypothèse très dangereuse qui ne peut jamais être faite. Ce n'est jamais une bonne idée d'utiliser sd [az] comme noms de périphériques persistants. C'est un héritage de l'époque où nous avions des contrôleurs IDE avec quatre ports statiques qui pouvaient être définis en définissant des cavaliers matériels et en sélectionnant la bonne fiche de câble.
ikrabbe
1
@ikrabbe, je sais, c'est pourquoi j'ai posté une réponse basée sur l'identification des étiquettes (celles-ci peuvent être gérées un peu plus facilement).
Alex Tartan

Réponses:

6

Bien qu'il /dev/sdXysoit risqué d'y accéder , une identification plus précise peut être effectuée par UUID.

Étant donné que vous mentionnez (à un moment donné) le changement de la clé USB, pour maintenir la compatibilité, vous souhaiterez peut-être identifier votre clé USB par une étiquette. Pour ce faire, vous pouvez: /dev/disk/by-label/YourLabelHere.

Notez que vous devez définir le libellé sur une nouvelle clé USB avant d'exécuter le script, et /dev/disk/by-labeln'est également disponible que si (au moins) une clé USB est connectée (sinon elle est supprimée).

Des détails sur la configuration de l'étiquette USB peuvent être trouvés ici: /ubuntu/194510/how-to-edit-label-of-usb-drive

Alex Tartan
la source
1
Si vos systèmes de fichiers n'ont pas d'étiquettes, cela /dev/disk/by-id/peut être utile à la place (c'est ce que j'utilise pour mes systèmes de fichiers).
Toby Speight
3

C'est ainsi que je règle ce problème, mais généralement, comme Sato Katsura vous l'a dit, vous devez écrire une règle udev.

  1. Branchez votre appareil, vérifiez quel appareil il a obtenu (par exemple en regardant dmesg).
  2. En tant qu'appel de superutilisateur udevadm info --query all /dev/sdc(ou autre).
  3. Configurez une règle udev, voici un exemple pour mon portefeuille. Les champs ID_SERIAL_SHORTet ID_FS_UUIDj'ai lu les informations de l'étape 2:

    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="3878-D432", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook", OWNER="ingo"
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="9016-4EF8", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook-sd", OWNER="ingo"
    

    J'ai défini OWNER ici, que je peux le monter avec mon compte utilisateur principal. De plus, avec mon portefeuille, je n'ai pas de partitions mais je monte les disques ordinaires. Si vous avez des changements de partitions:

    ENV{ID_PART_ENTRY_NUMBER}=="1", ENV{DEVTYPE}=="partition",
    

    pour la partition numéro 1, sur les lignes de règles udev.

Les règles udev se trouvent dans /etc/udev/rules.d, si vous avez un système sain.

  1. Maintenant vous pouvez

    udevadm control --reload
    

    pour recharger les règles et

    udevadm monitor
    

    pour surveiller ce qui se passe à l'étape 5.

  2. Branchez et branchez votre périphérique USB (bien sûr, après le démontage avant si vous l'avez monté). Le moniteur devrait vous informer sur le nouveau périphérique lors de son initialisation.

  3. Vérifiez si /dev/contient les bons liens symboliques. Dans mon exemple, j'ai obtenu ceci:

    brw-rw---- 1 ingo disk    8,  48 Aug  3 10:32 sdd
    brw-rw---- 1 ingo disk    8,  32 Aug  3 10:32 sdc
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook-sd -> sdd
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook -> sdc
    

Vous pouvez maintenant définir des règles persistantes avec les liens symboliques /dev/pocketbooket /dev/pocketbook-sd, ou quels que soient vos noms dans le champ SYMLINK du fichier de règles udev.

ikrabbe
la source
1
Merci pour votre réponse. Mais je ne pourrai pas l'utiliser. L'appareil sur lequel je travaille est installé sur un volcan et la clé USB est utilisée pour stocker les données acquises là-bas. Nous ne nous y rendrons qu'une fois tous les trois mois pour changer la clé USB. Je n'ai accès qu'à distance, sans interface "écran". Comme l'USB sera toujours différent, mais branché sur les mêmes ports USB, je pense que le moyen le plus simple est de garder le chemin sdc1. Je vais voir avec les règles udev ce que je peux faire.
Gudrun
0

Juste pour ajouter à la réponse de @ alextartan.

J'ai lancé mon propre système de sauvegarde qui utilise des clés USB pour les cibles. Je dois être sûr de ce qui se passe où. Étant donné que les UUID ne sont pas particulièrement conviviaux, je me fie aux étiquettes de disque.

Les UUID sont également un peu problématiques car chaque fois que vous reformatez une partition, elle obtient un nouvel UUID unique, donc tous les scripts utilisant cet UUID doivent être modifiés. Je peux attribuer la même étiquette qu'auparavant à la partition reformatée (ou même à une partition sur un lecteur nouveau / de remplacement) et laisser mes scripts seuls.

J'ai créé ma propre convention d'étiquetage (conviviale pour les humains) et j'utilise gparted pour étiqueter les différentes partitions lorsque je les crée.

Lorsque mes scripts doivent accéder à une partition particulière, je recherche le nom du périphérique à l'aide de l'étiquette.

function get_dev {
  ## Return the device name of a partition
  ## In DEV
  ## Given its label
  ## Partition does not need to be mounted
  ## Usage get_dev <partition_label>
  ## Copyleft 04/28/2014 JPmicrosystems
  local LINE
  local VERBOSE=1  ## Verbose version
  local USAGE="ERROR Usage is: get_dev <partition_label>"
  unset DEV

  if [ -z "${1}" ]
  then
    (( VERBOSE )) && echo $USAGE
    return 1
  fi

  LINE=$(ls -l /dev/disk/by-label | grep " ${1} ")
  if (( $? ))
  then
    (( VERBOSE )) && echo "ERROR Partition [${1}] not found"
    return 1
  fi

  DEV="/dev/${LINE##*/}"
  return 0
}
Joe
la source