Automounting USB sticks no Debian

10

Eu estou executando o Debian Squeeze em um computador plug (apenas SSH, sem GUI) e o que estou tentando fazer é fazer com que, quando um pen drive USB estiver conectado, ele seja montado automaticamente.

O que fiz foi instalar o autofs , que, pelo que eu sei, lida com a automontagem, desde que saiba onde o dispositivo está em /dev .

O problema é que o pendrive não está sempre no mesmo nome de dispositivo. Às vezes é /dev/sdc1 , às vezes /dev/sdd1 , etc.

Eu entendo que para remediar isso, eu preciso usar udev para garantir que o pendrive receba o mesmo nome.

Eu recebi as seguintes informações de udevadm :

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/block/sdd/sdd1':
    KERNEL=="sdd1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{partition}=="1"
    ATTR{start}=="63"
    ATTR{size}=="129339"
    ATTR{ro}=="0"
    ATTR{alignment_offset}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{stat}=="      31      244      275      190        0        0        0        0        0      190      190"
    ATTR{inflight}=="       0        0"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
    KERNELS=="sdd"
    SUBSYSTEMS=="block"
    DRIVERS==""
    ATTRS{range}=="16"
    ATTRS{ext_range}=="256"
    ATTRS{removable}=="1"
    ATTRS{ro}=="0"
    ATTRS{size}=="129439"
    ATTRS{alignment_offset}=="0"
    ATTRS{discard_alignment}=="0"
    ATTRS{capability}=="51"
    ATTRS{stat}=="      56      727      783      520        0        0        0        0        0      520      520"
    ATTRS{inflight}=="       0        0"
    ATTRS{events}=="media_change"
    ATTRS{events_async}==""
    ATTRS{events_poll_msecs}=="-1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
    KERNELS=="8:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{vendor}=="        "
    ATTRS{model}=="Flash Disk      "
    ATTRS{rev}=="2.00"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x90"
    ATTRS{iodone_cnt}=="0x90"
    ATTRS{ioerr_cnt}=="0x0"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
    KERNELS=="target8:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
    KERNELS=="host8"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
    KERNELS=="1-1.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="383"
    ATTRS{idVendor}=="1976"
    ATTRS{idProduct}=="6025"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="11"
    ATTRS{devpath}=="1.2"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"

  looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="197"
    ATTRS{idVendor}=="1a40"
    ATTRS{idProduct}=="0101"
    ATTRS{bcdDevice}=="0111"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="USB 2.0 Hub"

  looking at parent device '/devices/platform/orion-ehci.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="24"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
    ATTRS{product}=="Marvell Orion EHCI"
    ATTRS{serial}=="orion-ehci.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/platform/orion-ehci.0':
    KERNELS=="orion-ehci.0"
    SUBSYSTEMS=="platform"
    DRIVERS=="orion-ehci"
    ATTRS{modalias}=="platform:orion-ehci"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

Eu tenho tentado escrever as regras udev para forçar o pendrive USB a usar o nome /dev/usbstick , mas até agora não obtive sucesso.

Alguém pode ajudar com a regra que preciso especificar no meu arquivo de regras para que esse pendrive sempre tenha o mesmo nome?

- Ou existe uma maneira muito mais fácil de automontar o pendrive que está faltando completamente?

UPDATE

OK, então fiz algum progresso. Eu adicionei a seguinte regra:

SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"

Eu sei que isso ainda precisa de algum trabalho em termos de manipulação de adicionar / remover, mas é apenas um teste básico por enquanto.

O efeito disso é que agora consigo três novos nós de dispositivos em /dev , ou seja, /dev/usbstick-sdc , /dev/usbstick-sdc1 e usbstick-sg2 .

No entanto, descobri que o código na seção RUN é executado apenas uma vez e apenas cria um diretório mnt/usbstick-sdc . Eu também descobri que o diretório está sempre vazio, então algo ainda está claramente errado! (embora eu esteja fazendo progresso).

    
por jon 16.11.2011 / 15:44

5 respostas

11

Descobriu que deveria haver uma maneira muito mais fácil de resolver um problema tão comum, e existe. Aqui está o que eu tentei no meu servidor wheezy / sid:

sudo apt-get install usbmount

Conecte o stick USB, pronto! Meu bastão agora está acessível por meio de /media/usb .

Btw, o usbmount não tem uma página man, por favor leia /usr/share/doc/usbmount/README.gz . Parece usbmount monta seu stick com a opção de sincronização por padrão. Pode ser muito melhor para o seu bastão montá-lo como assíncrono e executar sync ou umount antes de desconectá-lo. Isso é configurável.

    
por 18.11.2011 / 03:41
2

Observe que você não pode ter apenas um único nó de dispositivo para representar qualquer possível pendrive anexado. E se você ligar dois deles? Ou quando o pendrive tem mais de uma partição?

Geralmente, o que você usa para criar um nó de dispositivo com nome personalizado é SYMLINK+= . grep para ele nas regras para ver como ele é usado: grep SYMLINK /etc/udev/rules.d/* . Como em todos os comandos disparados pelo udev, você pode usar algumas variáveis significativas descritas em man udev . Você pode perceber que realmente não precisa fornecer um nome personalizado ao dispositivo, pois você pode inserir seu nome em um script (por meio da variável %k ).

Quanto à solução de montagem automática, dê uma olhada em UAM , que descrevi um pouco em < href="https://unix.stackexchange.com/questions/13455/suggestions-needed-for-udev-udisks-autofs-notification-setup-for-a-complete-a/23674#23674"> a resposta para esta questão .

    
por 16.11.2011 / 15:55
1

Desculpe responder minha própria pergunta, e muitos agradecimentos são devidos a rozcietrzewiacz por contribuir, mas eu finalmente consegui fazer algum progresso importante usando a seguinte regra depois de horas lendo online:

SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"

Isto irá montar a primeira partição de qualquer dispositivo SCSI. Eu acho que a próxima pergunta será como montar várias partições, mas isso é outro problema para outro dia.

    
por 16.11.2011 / 18:51
1

Aqui está como eu fiz recentemente, e estou muito feliz com essa abordagem agora. Isso é para o Ubuntu 12.04 + Gentoo, mas acho que qualquer distro, que permita instalar o udev e o autofs, deve funcionar.

Pré-requisitos: Você precisa ter instalado o udev + autofs.

Etapa 1)

Crie o seguinte arquivo "/etc/udev/rules.d/90-usbsd-auto.rules" (é claro que você pode usar qualquer nome contanto que ele termine com ".rules"). :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# for automounter support

ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<...>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", \
    RUN+="/bin/rm /media/usb/%k"

O que isso faz: Ele cria dois links simbólicos, um para a partição do dispositivo de armazenamento USB em "/ dev / usbdisks / < ... >".

O segundo link simbólico será vinculado a partir de "/media/usb/<...>" para "/media/autousb/<...>" isso é feito para o suporte do automounter (consulte a etapa 2).

Para garantir que o udev leia essas regras, use

sudo udevadm control --reload-rules

Nota: Mesmo nome para o mesmo pendrive: Possível, mas talvez perigoso: você pode usar, por exemplo, "$ env {ID_FS_LABEL_ENC}", em vez de "% k" nas regras UDEV acima. Isso usará o rótulo de volume para criar /media/usb/<...gg ;, mas o que acontece se você conectar dois pen drives e ambos usarem o mesmo rótulo de volume ...

Com este arquivo de regras do udev, tudo é configurado para automontar a partição do dispositivo de armazenamento USB. Note que, neste momento, o dispositivo NÃO será montado automaticamente (intencionalmente). Ela será montada automaticamente assim que você a usar com

Etapa 2)

Configure o autofs para automount /media/autousb/<...> : Eu adicionei a seguinte linha ao meu arquivo "/etc/auto.master" (para o Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

Isso significa que o AutoFS desmontará o dispositivo após 60 segundos de inatividade. Você pode querer usar menos ou mais, dependendo do seu gosto.

Para o Gentoo você tem que modificar o "/etc/autofs/auto.master" então faz sentido usar

/media/autousb /etc/autofs/auto.usb --timeout=60

Agora criei "auto.usb" com o seguinte conteúdo:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

Este auto.usb precisa ser executável, para que o autofs use isso como um script (bash). Então, por exemplo

sudo chmod 0755 /etc/auto.usb

O que isso faz: Esse script dirá ao AutoFS (/ usr / sbin / automount) como montar a partição do dispositivo de armazenamento usb.

O script primeiro usará "/ sbin / blkid" para descobrir que tipo de sistema de arquivos está na partição.

O script fornecerá as opções corretas de montagem, dependendo da partição do dispositivo.

Nota: incluí código de amostra para sistemas de arquivos "vfat" (provavelmente mais comuns para sticks USB), "ntfs" e "ext4". É claro que é muito fácil estender isso para suportar mais sistemas de arquivos.

Etapa 3)

Opcional ... Para "ejetar" == desmontar seu stick (s) USB (ou partições no seu pendrive), crie um script em / sbin / usbeject:

#!/bin/bash
# make sure everything is written to USB disk(s)
sync
# sending SIUGSR1 to automount will unmount the media
killall -s SIGUSR1 /usr/sbin/automount

Com esse script, você pode usar "sudo usbeject" para desmontar todas as partições de dispositivos USB montados (informando o automount para desmontá-las).

É claro que você pode simplesmente ter certeza de que a partição não é usada em nenhum lugar; O automounter desmontará a partição após o tempo limite de 60 segundos ...

O verdadeiro truque aqui é usar links simbólicos de "/ media / usb" para "/ media / autousb":

  • Os links simbólicos "/ media / usb" serão criados pelo udev, oferecendo ao usuário uma visão geral simples de quais partições de dispositivos de armazenamento usb estão lá
  • O AutoFS, em seguida, monta automaticamente a partição sob demanda, se você a usar via / media / usb
  • Com o arquivo "auto.usb" com script, você pode suportar qualquer tipo de sistema de arquivos e, além disso, também é capaz de suportar qualquer tipo de esquema de nomenclatura.
  • Essa abordagem suporta pen drives USB com várias partições, mesmo se essas partições usarem diferentes tipos de sistemas de arquivos.
por 24.02.2015 / 00:21
1

Descobri que a melhor resposta na verdade se tornou obsoleta, já que não é mantida e não funciona de / para Jessie (veja o comentário de malat)

Para mim (em Jessie), a solução em este blog funcionou como um encanto.

Créditos para "ddumont", mas postando uma visão geral de seu blog / resposta aqui, para lidar com a possível perda de link no futuro.

Adicione a seguinte linha a /etc/fstab

/dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2

Você pode fazer isso usando o nano:

sudo nano /etc/fstab

Explicação:

/dev/sr0 é o arquivo do dispositivo. Você também pode usar um dos links simbólicos configurados pelo udev em / dev / disk / by-id. Você terá que mudar isso de acordo com o seu arquivo de dispositivo ( sudo fdisk -l para listar dispositivos)

/media/bluray é o ponto de montagem. Você pode escolher outro ponto de montagem

nofail é necessário para evitar o relatório de falha ao inicializar sem um disco na unidade ótica

x-systemd.automount é a opção para configurar o systemd para montar automaticamente o disco inserido

Não especifique noauto: isto evitaria que o systemd montasse automaticamente um disco, o que anula a finalidade.

Teste

Execute o comando journalctl -x -f em um terminal para verificar o que está acontecendo com o systemd

Recarregue a configuração do sistema com sudo systemctl daemon-reload .

carregue um disco na sua unidade óptica

Em seguida, o journalctl deve mostrar algo como:

Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray.

Mais

Para montar as unidades NTFS com êxito, tive que instalar o ntfs-3g (antigo ntfsprogs)

sudo apt-get install ntfs-3g

Eu não precisei instalar o hfsprogs para que um usb com formato OSX funcionasse, mas você mesmo deve verificar.

    
por 22.02.2017 / 14:51