Uma chave USB terá o mesmo nome toda vez que eu a montar?


9

Eu tenho uma chave USB que será usada para salvar dados nela diariamente através de um script bash. Eu consegui montá-lo para que um usuário específico pudesse escrever pastas nele usando o comando:

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

O script pode executar e criar diretórios conforme desejado 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/sdc1ou será diferente?

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


2
A resposta é não, mas você pode contornar isso com as regras do udev . Veja aqui uma explicação melhor, mas um pouco desatualizada.
Satō Katsura

@AlexTartan Se você conectar qualquer outro disco USB em qualquer outra porta USB antes que possa obter sdc. Portanto, sua restrição "e nada mais é atribuída ao sdc1" é verdadeira. Em geral, essa é uma suposição muito perigosa que nunca pode ser feita. Nunca é uma boa ideia usar sd [az] como nomes de dispositivos persistentes. Esse é um legado dos tempos em que tínhamos controladores IDE com quatro portas estáticas que podiam ser definidas configurando jumpers de hardware e selecionando o plugue de cabo correto.
precisa saber é o seguinte

1
@ikrabbe, eu sei, é por isso que postei uma resposta com base na identificação do rótulo (elas podem ser gerenciadas um pouco mais fácil).
Alex Tartan #

Respostas:


6

Embora o acesso /dev/sdXyseja perigoso, uma identificação mais precisa pode ser feita UUID.

Como você menciona (em algum momento) a alteração do pendrive, para manter a compatibilidade, você pode identificar seu pendrive por uma etiqueta. Para fazer isso, você pode: /dev/disk/by-label/YourLabelHere.

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

Detalhes sobre como configurar a etiqueta usb podem ser encontrados aqui: /ubuntu/194510/how-to-edit-label-of-usb-drive


1
Se os seus sistemas de arquivos não tiverem rótulos, /dev/disk/by-id/poderá ser útil (é o que eu uso nos meus sistemas de arquivos).
perfil completo de Toby Speight

3

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

  1. Conecte seu dispositivo, verifique qual dispositivo ele possui (por exemplo, assistindo dmesg).
  2. Como chamada de superusuário udevadm info --query all /dev/sdc(ou o que seja).
  3. Configurar uma regra do udev, aqui está um exemplo para o meu bolso. Os campos ID_SERIAL_SHORTe ID_FS_UUIDeu lemos 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"
    

    Defino OWNER aqui, para montá-lo com minha conta de usuário principal. Também com o meu bolso não tenho partições, mas monte os discos simples. Se você tiver partições alteradas:

    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 são.

  1. Agora você pode

    udevadm control --reload
    

    recarregar as regras e

    udevadm monitor
    

    para monitorar o que acontece durante a etapa 5.

  2. Conecte e conecte seu dispositivo USB (é claro, depois de desmontar antes, se você o montou). O monitor deve informá-lo sobre o novo dispositivo quando ele é inicializado.

  3. Verifique se /dev/contém os links simbólicos corretos. No meu exemplo, eu entendi 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/pocketbooke /dev/pocketbook-sd, ou quaisquer que sejam seus nomes, no campo SYMLINK do arquivo de regras do udev.


1
Obrigado pela sua resposta. No entanto, não poderei usá-lo. O dispositivo em que estou trabalhando está instalado em um vulcão e o pendrive é usado para armazenar os dados adquiridos lá. Só vamos lá uma vez a cada três meses para trocar o pendrive. Eu só tenho um acesso remoto, sem nenhuma interface de "tela". Como o usb será diferente o tempo todo, mas conectado às mesmas portas usb, acho que a maneira mais fácil é manter o caminho sdc1. Vou ver com as regras do udev o que posso fazer.
Gudrun

0

Apenas para adicionar à resposta do @ alextartan.

Eu rolei meu próprio sistema de backup, que usa drives USB para destinos. Eu preciso ter certeza do que está indo para onde. Como os UUIDs não são particularmente amigáveis, confio nas etiquetas de disco.

Os UUIDs também são um pouco problemáticos, porque sempre que você reformata uma partição, ele recebe um novo UUID exclusivo; portanto, todos os scripts que usam esse UUID precisam ser modificados. Posso atribuir o mesmo rótulo de antes à partição reformatada (ou mesmo a uma partição em uma unidade nova / de substituição) e deixar meus scripts em paz.

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

Quando meus scripts precisam acessar uma partição específica, 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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.