Uma chave USB terá o mesmo nome toda vez que eu montá-lo?

9

Eu tenho uma chave USB que será usada para salvar dados diariamente por meio de um script bash. Eu consegui montá-lo para um usuário específico para poder gravar pastas nele usando o comando:

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

O script pode executar e criar diretórios como quiser e é perfeito. Em algum momento, a chave USB será desconectada e substituída por uma nova (mesmo modelo). A nova chave USB ainda terá o nome /dev/sdc1 ou será diferente?

Se for diferente, como posso incluir a parte de montagem no meu script para que ela seja feita automaticamente?

    
por Gudrun 03.08.2015 / 08:56

3 respostas

6

Embora o acesso por /dev/sdXy seja arriscado, uma identificação mais precisa pode ser feita por UUID .

Como você menciona (em algum momento) a troca do pendrive, para manter a compatibilidade, convém identificar seu pendrive por um marcador. Para fazer isso, você pode: /dev/disk/by-label/YourLabelHere .

Note que você precisa definir o rótulo para um novo pendrive antes de executar o script, e também /dev/disk/by-label estará disponível somente se (pelo menos) um pendrive estiver conectado (caso contrário, ele será removido).

Detalhes sobre como configurar o rótulo usb podem ser encontrados aqui: link

    
por 03.08.2015 / 10:32
3

É assim que eu resolvo esse problema, mas geralmente como o Sato Katsura te disse, você precisa escrever uma regra do udev.

  1. Conecte seu dispositivo, verifique qual dispositivo ele tem (por exemplo, assistindo dmesg).
  2. Como superusuário, chame udevadm info --query all /dev/sdc (ou qualquer outro).
  3. Configure uma regra do udev, aqui está um exemplo para o meu bolso. Os campos ID_SERIAL_SHORT e ID_FS_UUID leiam as informações na etapa 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"
    

    Eu defino OWNER aqui, que posso montá-lo com minha conta de usuário principal. Também com meu bolso eu não tenho partições, mas monte os discos simples. Se você tem partições mudam:

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

    para a partição número 1, nas linhas de regras do udev.

As regras do udev são encontradas em /etc/udev/rules.d , se você tiver um sistema sensato.

  1. Agora você pode

    udevadm control --reload
    

    para recarregar as regras e

    udevadm monitor
    

    para monitorar o que acontece durante a etapa 5.

  2. Plug-ins e Plugin do seu dispositivo usb (claro que depois de desmontar antes se você montou isso). O monitor deve informá-lo sobre o novo dispositivo quando ele for inicializado.

  3. Verifique se /dev/ contém os links simbólicos certos. No meu exemplo eu tenho isso:

    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
    

Agora você pode definir regras persistentes com os links simbólicos /dev/pocketbook e /dev/pocketbook-sd , ou quaisquer que sejam seus nomes no campo SYMLINK do arquivo de regras do udev.

    
por 03.08.2015 / 10:30
0

Apenas para adicionar à resposta do @ alextartan.

Eu rolei meu próprio sistema de backup que usa unidades USB para destinos. Eu preciso ter certeza do que está indo onde. Como os UUIDs não são particularmente fáceis de usar, confio em rótulos de disco.

Os UUIDs também são um pouco problemáticos, porque sempre que você reformata uma partição, ela recebe um novo UUID exclusivo, portanto, qualquer script que use esse UUID precisa ser modificado. Eu posso atribuir o mesmo rótulo como antes para a partição reformatada (ou mesmo para uma partição em uma unidade nova / substituta) e deixar meus scripts sozinho.

Eu criei minha própria convenção de rotulagem única (amigável para humanos) e usei o gparted para rotular as várias partições quando as criei.

Quando meus scripts precisam acessar uma partição específica, eu procuro o nome do dispositivo usando o rótulo.

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
}
    
por 07.08.2015 / 23:23