Una chiave USB avrà lo stesso nome ogni volta che la monto?


9

Ho una chiave USB che verrà utilizzata per salvare i dati su di essa ogni giorno tramite uno script bash. Sono riuscito a montarlo per un utente specifico per poter scrivere cartelle in esso usando il comando:

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

Lo script può essere eseguito e creare directory come vuole ed è perfetto. Ad un certo punto, la chiave USB verrà scollegata e sostituita con una nuova (stesso modello). La nuova chiave USB avrà ancora il nome /dev/sdc1o sarà diversa?

Se è diverso, come posso includere la parte di montaggio nel mio script affinché possa essere creata automaticamente?


2
La risposta è no, ma puoi aggirare il problema con le regole udev . Vedi qui per una spiegazione migliore ma leggermente obsoleta.
Satō Katsura,

@AlexTartan Se si collega qualsiasi altro disco USB in qualsiasi altra porta USB prima che possa ottenere SDC. Quindi il tuo vincolo "e nient'altro è assegnato a sdc1" è vero. In generale questo è un presupposto molto pericoloso che non può mai essere fatto. Non è mai una buona idea usare sd [az] come nomi di dispositivo persistenti. Questo è un retaggio dei tempi in cui avevamo controller IDE con quattro porte statiche che potevano essere impostate impostando i ponticelli hardware e selezionando la spina del cavo giusto.
Ikrabbe,

1
@ikrabbe, lo so, è per questo che ho pubblicato una risposta basata sull'identificazione dell'etichetta (questi possono essere gestiti un po 'più facilmente).
Alex Tartan,

Risposte:


6

Mentre accedervi /dev/sdXyè rischioso, può essere effettuata un'identificazione più accurata UUID.

Dal momento che menzioni (a un certo punto) la modifica della chiavetta USB, per mantenere la compatibilità, potresti voler identificare la chiavetta USB con un'etichetta. Per fare ciò, è possibile: /dev/disk/by-label/YourLabelHere.

Si noti che è necessario impostare l'etichetta su una nuova chiavetta USB prima di eseguire lo script, inoltre /dev/disk/by-labelè disponibile solo se (almeno) una chiavetta USB è collegata (altrimenti viene rimossa).

I dettagli su come impostare l'etichetta USB sono disponibili qui: /ubuntu/194510/how-to-edit-label-of-usb-drive


1
Se i tuoi filesystem non hanno etichette, /dev/disk/by-id/potrebbero essere utili (è quello che uso per i miei filesystem).
Toby Speight,

3

Ecco come affronterò questo problema, ma in generale, come ti ha detto Sato Katsura, devi scrivere una regola udev.

  1. Collega il tuo dispositivo, controlla quale dispositivo ha ricevuto (ad esempio guardando dmesg).
  2. Come chiamata da superutente udevadm info --query all /dev/sdc(o qualsiasi altra cosa).
  3. Imposta una regola udev, ecco un esempio per il mio portafoglio. I campi ID_SERIAL_SHORTe ID_FS_UUIDho letto dalle informazioni nel passaggio 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"
    

    Ho impostato il PROPRIETARIO qui, che posso montarlo con il mio account utente principale. Inoltre con il mio portafoglio non ho partizioni ma monto i dischi semplici. Se hai delle partizioni cambiate:

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

    per la partizione numero 1, nelle righe delle regole udev.

Le regole udev si trovano in /etc/udev/rules.d, se si dispone di un sistema sano.

  1. Ora puoi

    udevadm control --reload
    

    per ricaricare le regole e

    udevadm monitor
    

    per monitorare cosa succede durante il passaggio 5.

  2. Plugout e Plugin il tuo dispositivo USB (ovviamente dopo averlo smontato prima se lo hai montato). Il monitor dovrebbe informarti del nuovo dispositivo quando viene inizializzato.

  3. Controlla se /dev/contiene i collegamenti simbolici giusti. Nel mio esempio ho ottenuto questo:

    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
    

Ora puoi definire regole permanenti con i collegamenti simbolici /dev/pocketbooke /dev/pocketbook-sd, o qualunque sia il tuo nome, nel campo SYMLINK del file delle regole udev.


1
La ringrazio per la risposta. Tuttavia non sarò in grado di usarlo. Il dispositivo su cui sto lavorando è installato su un vulcano e la chiavetta USB viene utilizzata per memorizzare i dati acquisiti lì. Ci andremo solo una volta ogni tre mesi per cambiare la chiavetta USB. Ho solo un accesso remoto ad esso, senza alcuna interfaccia "schermo". Poiché l'USB sarà sempre diverso, ma collegato alle stesse porte USB, penso che il modo più semplice sia mantenere il percorso sdc1. Vedrò con le regole di udev cosa posso fare.
Gudrun,

0

Solo per aggiungere alla risposta di @ alextartan.

Ho lanciato il mio sistema di backup che utilizza unità USB per obiettivi. Devo essere sicuro di cosa sta andando dove. Poiché gli UUID non sono particolarmente intuitivi, mi affido alle etichette del disco.

Gli UUID sono anche un po 'problematici perché ogni volta che riformatta una partizione, ottiene un nuovo UUID univoco, quindi tutti gli script che usano tale UUID devono essere modificati. Posso assegnare la stessa etichetta di prima alla partizione riformattata (o anche a una partizione su un'unità nuova / sostitutiva) e lasciare soli i miei script.

Mi è venuta in mente la mia convenzione di etichettatura unica (umana) e uso gparted per etichettare le varie partizioni quando le creo.

Quando i miei script devono accedere a una partizione specifica, cerco il nome del dispositivo usando l'etichetta.

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.