¿Una llave USB tendrá el mismo nombre cada vez que la monte?

9

Tengo una llave USB que se usará para guardar datos diariamente a través de un script bash. Logré montarlo para que un usuario específico pueda escribir carpetas en él usando el comando:

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

El script puede ejecutarse y crear directorios como quiera y es perfecto. En algún momento, la llave USB se desconectará y se reemplazará por una nueva (mismo modelo). ¿La nueva memoria USB seguirá teniendo el nombre /dev/sdc1o será diferente?

Si es diferente, ¿cómo puedo incluir la parte de montaje en mi script para que se realice automáticamente?

Gudrun
fuente
2
La respuesta es no, pero puede solucionarlo con las reglas de udev . Vea aquí para una explicación mejor pero un poco desactualizada.
Satō Katsura el
@AlexTartan Si conecta cualquier otro disco usb en cualquier otro puerto usb antes de que pueda obtener sdc. Por lo tanto, su restricción "y nada más se asigna a sdc1" es verdadera. En general, esta es una suposición muy peligrosa que nunca se puede hacer. Nunca es una buena idea usar sd [az] como nombres de dispositivo persistentes. Este es un legado de los tiempos en que teníamos controladores IDE con cuatro puertos estáticos que se podían configurar configurando puentes de hardware y seleccionando el enchufe de cable correcto.
ikrabbe
1
@ikrabbe, lo sé, es por eso que publiqué una respuesta basada en la identificación de la etiqueta (esto se puede administrar un poco más fácil).
Alex Tartan

Respuestas:

6

Si bien acceder a él /dev/sdXyes arriesgado, se puede realizar una identificación más precisa UUID.

Como menciona (en algún momento) cambiar el dispositivo USB, para mantener la compatibilidad, es posible que desee identificar su dispositivo USB con una etiqueta. Para ello, se puede: /dev/disk/by-label/YourLabelHere.

Tenga en cuenta que debe establecer la etiqueta en un nuevo dispositivo USB antes de ejecutar el script, y además, /dev/disk/by-labelsolo está disponible si (al menos) está conectado un dispositivo USB (de lo contrario, se eliminará).

Los detalles sobre cómo configurar la etiqueta usb se pueden encontrar aquí: /ubuntu/194510/how-to-edit-label-of-usb-drive

Alex Tartan
fuente
1
Si sus sistemas de archivos no tienen etiquetas, entonces /dev/disk/by-id/pueden ser útiles (es lo que uso para mis sistemas de archivos).
Toby Speight
3

Así es como abordo este problema, pero en general, como te dijo Sato Katsura, debes escribir una regla de udev.

  1. Conecte su dispositivo, verifique qué dispositivo obtuvo (por ejemplo, mirando dmesg).
  2. Como llamada de superusuario udevadm info --query all /dev/sdc(o lo que sea).
  3. Configure una regla de udev, aquí hay un ejemplo para mi billetera. Los campos ID_SERIAL_SHORTy ID_FS_UUIDyo leímos la información en el paso 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"
    

    Configuré PROPIETARIO aquí, para poder montarlo con mi cuenta de usuario principal. También con mi billetera no tengo particiones, pero monte los discos simples. Si tiene particiones, cambie:

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

    para la partición número 1, en las líneas de reglas de udev.

Las reglas de udev se encuentran en /etc/udev/rules.d, si tiene un sistema sano.

  1. Ahora usted puede

    udevadm control --reload
    

    para recargar las reglas y

    udevadm monitor
    

    para monitorear lo que sucede durante el paso 5.

  2. Conecte y conecte su dispositivo usb (por supuesto, después de desmontarlo antes si lo montó). El monitor debe informarle sobre el nuevo dispositivo cuando se inicializa.

  3. Compruebe si /dev/contiene los enlaces simbólicos correctos. En mi ejemplo, obtuve esto:

    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
    

Ahora puede definir reglas persistentes con los enlaces simbólicos /dev/pocketbooky /dev/pocketbook-sd, o cualesquiera que sean sus nombres, en el campo SYMLINK del archivo de reglas udev.

ikrabbe
fuente
1
Gracias por su respuesta. Sin embargo, no podré usarlo. El dispositivo en el que estoy trabajando está instalado en un volcán y el dispositivo USB se usa para almacenar los datos adquiridos allí. Solo iremos allí una vez cada tres meses para cambiar la memoria USB. Solo tengo acceso remoto, sin ninguna interfaz de "pantalla". Como el usb será diferente todo el tiempo, pero conectado a los mismos puertos usb, creo que la forma más fácil es mantener la ruta sdc1. Veré con las reglas de udev lo que puedo hacer.
Gudrun
0

Solo para agregar a la respuesta de @ alextartan.

Hice rodar mi propio sistema de respaldo que usa unidades USB para objetivos. Necesito estar seguro de qué va a dónde. Como los UUID no son particularmente fáciles de usar, confío en las etiquetas de disco.

Los UUID también son un poco problemáticos porque cada vez que reformatea una partición, obtiene un nuevo UUID único, por lo que cualquier script que use ese UUID debe modificarse. Puedo asignar la misma etiqueta que antes a la partición reformateada (o incluso a una partición en una unidad nueva / de reemplazo) y dejar mis scripts solos.

Se me ocurrió mi propia convención de etiquetado única (amigable para los humanos) y uso gparted para etiquetar las diversas particiones cuando las creo.

Cuando mis scripts necesitan acceder a una partición en particular, busco el nombre del dispositivo usando la etiqueta.

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
fuente