Montando unidades USB automaticamente no Debian


10

Estou executando o Debian Squeeze em um computador com plug-in (apenas SSH, sem GUI) e o que estou tentando fazer é obtê-lo para que, quando um pendrive USB for conectado, ele seja montado automaticamente.

O que eu fiz foi instalar autofse, pelo que eu coleciono, lida com a montagem automática, desde que ele saiba onde o dispositivo está /dev.

O problema é que o pen drive nem sempre tem o mesmo nome de dispositivo. Às vezes é /dev/sdc1, às vezes /dev/sdd1, etc.

Entendo que, para remediar isso, preciso usar udevpara garantir que o pendrive sempre tenha o mesmo nome.

Obtive 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 udevregras para forçar o pendrive a usar o nome, /dev/usbstickmas até agora não obtive sucesso.

Alguém pode ajudar com qual regra eu preciso especificar no meu arquivo de regras para obter esse pendrive sempre com o mesmo nome?

- Ou existe uma maneira muito mais fácil de montar automaticamente o pendrive que estou perdendo por completo?

ATUALIZAR

OK, então eu fiz alguns progressos. 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 obter três novos nós de dispositivo /dev, a saber /dev/usbstick-sdc, /dev/usbstick-sdc1e usbstick-sg2.

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


Esse segundo /dev/sdc1deveria ser sdd1? E você pode usar blkidpara identificar exclusivamente a unidade (bem, na verdade a partição; ela mudará se você reformatar).
Kevin

Correto, apenas consertei isso. Tudo o que quero é que, quando um pendrive USB for conectado, ele seja montado em algum diretório. Tenho certeza de que devo usar uma udevregra para criar nós de dispositivo para cada partição, mas não sei em que nível de udevadmsaída estar criando regras!
jon

Sua regra parece muito complicada. Tente fazer um simples, com apenas um ACTION==, um KERNEL==e um ATTRS{something}==(é completamente factível - é isso que eu uso). Além disso, considere executar um único script instaurado da cadeia de comandos no RUN+=.
rozcietrzewiacz

Obrigado pelo conselho, mas a pergunta permanece: qual nível da árvore de dispositivos devo direcionar com minha regra? Tudo isso parece terrivelmente confuso e realmente não há muita informação online para explicar isso. Eu realmente aprecio o tempo que você levou para me explicar até agora, sinto que estou quase lá, mas perdendo o nível de segmentação.
jon

Agora eu tentei esta regra muito básica: KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"- mas não, é claro que isso também não funciona. Agora estou ficando cada vez mais frustrado depois de passar quase o dia inteiro simplesmente tentando descobrir como obter um pendrive USB conectado para se montar. As coisas realmente deveriam ser tão difíceis? A saída de udevadm test /sys/block/sddé - é claro - praticamente ilegível, então não tenho como saber onde estou errado. Alguém pode me apontar a direção certa sobre isso?
jon

Respostas:


13

Imaginei 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 pendrive, pronto! Agora, meu stick está acessível /media/usb.

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


Veja tambémpumount
Alex

Preste atenção que usbmountnão é mais compatível com NTFS desde o debian jessie: bugs.debian.org/774149
malat

Executando isso no Debian Jessie, o usbmount nunca parece montá-lo. A página do pacote diz que agora está sem manutenção e estou executando o systemd. Gostaria de saber se este pacote não funciona mais com alterações systemd?
Travis Griggs

Na verdade, não funcionou para mim no Jessie, veja a minha resposta (isto: ddumont.wordpress.com/2015/09/27/... fez trabalho)
Paul

2

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

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

Quanto à solução de montagem automática, dê uma olhada no UAM , que descrevi um pouco na resposta a esta pergunta .


Eu entendo essas restrições. Por acaso, eu só preciso oferecer suporte a um único pendrive conectado a qualquer momento a esse sistema em particular. No entanto, eu precisaria suportar várias partições no pen drive (seria bom se elas pudessem ser montadas em subpastas a partir do ponto de montagem). Dado esses requisitos, você tem algum conselho para uma solução em potencial? Devido à natureza do projeto, preciso evitar o uso de software adicional de terceiros, se possível.
jon

Então dê uma olhada na edição que acabei de fazer (a parte do meio). Isso seria suficiente?
rozcietrzewiacz

Observe também que o UAM não é realmente um programa - é um monte de boas udevregras com os scripts que o acompanham. Você pode dar uma olhada nas regras e adaptá-las facilmente às suas necessidades.
rozcietrzewiacz

Obrigado pelo conselho. Outra coisa: você acha que poderia olhar para a minha saída udevadme me dizer qual dispositivo é o dispositivo que eu realmente deveria ter como alvo com a minha regra? Os vários exemplos que eu vi on-line parecem envolver árvores muito mais curtas e cada exemplo parece direcionar para um nível diferente de dispositivo, sem explicação de qual deles deve ser direcionado e por quê.
jon

Acabei de adicionar uma atualização acima, alguma idéia? Obrigado!
jon

2

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

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

Passo 1)

Crie o seguinte arquivo "/etc/udev/rules.d/90-usbsd-auto.rules" (é claro que você pode usar qualquer nome desde que 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 de "/ media / usb / <...>" para "/ media / autousb / <...>", isto é feito para suporte ao montador automático (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 / <...>, mas o que acontece se você conectar dois pen drives e os dois usarem o mesmo rótulo de volume ...

Com esse arquivo de regras do udev, tudo está configurado para montar automaticamente a partição do dispositivo de armazenamento USB. Observe que, no momento, o dispositivo NÃO será montado automaticamente (intencionalmente). Ele será montado automaticamente quando você o usar com

Passo 2)

Configurar autofs para automount / media / autousb / <...>: Adicionei a seguinte linha ao meu arquivo "/etc/auto.master" (para 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ê precisa modificar "/etc/autofs/auto.master" para que faça sentido usar

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

Agora eu 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

Esse 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: Este script informará 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 os sistemas de arquivos "vfat" (provavelmente o mais comum para pendrives), "ntfs" e "ext4". Obviamente, é muito fácil estender isso para suportar mais sistemas de arquivos.

Etapa 3)

Opcional ... Para "ejetar" == desmontar seu (s) pendrive (s) (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 montadas (dizendo ao automount para desmontá-las).

Claro que você pode simplesmente garantir que a partição não seja usada em nenhum lugar; o montador automático 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, fornecendo ao usuário uma visão geral simples de quais partições de dispositivos de armazenamento USB existem
  • O AutoFS monta automaticamente a partição sob demanda se você a usar via / media / usb
  • Com o arquivo "auto.usb" com script, você pode oferecer suporte a qualquer tipo de sistema de arquivos e, além disso, também pode suportar qualquer tipo de esquema de nomeação.
  • Essa abordagem oferece suporte a pen drives com várias partições, mesmo que essas partições usem tipos diferentes de sistemas de arquivos.

Posso mostrar como a dica autofs destrói meu diretório / home / frank? Obrigado.
26416 Frank

1

Desculpe responder à minha própria pergunta, e muito obrigado a rozcietrzewiacz por contribuir, mas finalmente consegui fazer alguns progressos importantes usando a seguinte regra após horas lendo online:

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

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


1
Não é uma boa regra. Isso também corresponderá às partições dos discos rígidos . existe um removableatributo que você deve testar e, em blockvez de scsi.
rozcietrzewiacz

1

Descobri que a melhor resposta ficou obsoleta, pois não é mantida e não funciona de / para Jessie (veja o comentário de malat)

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

Créditos para "ddumont", mas postando uma visão geral de seu blog / resposta aqui, para lidar com possíveis rot pods no futuro.

Adicione a seguinte linha ao /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ê precisará alterar isso de acordo com o arquivo do seu dispositivo ( sudo fdisk -lpara 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 óptica

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

Não especifique noauto: isso impediria que o systemd monte automaticamente um disco, o que anula o objetivo.

Teste

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

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

coloque 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 longe

Para montar com sucesso unidades NTFS, tive que instalar o ntfs-3g (ntfsprogs antigos)

sudo apt-get install ntfs-3g

Não precisei instalar o hfsprogs para que um usb formatado em OSX funcionasse, mas você deve verificar isso sozinho.


Ele não é montado automaticamente no meu Debian jessie com um USB-HDD.
precisa saber é

@buhtz mas montar manualmente funciona? As etapas acima realmente funcionaram para mim apenas para unidades que estavam no sistema na inicialização, e não para "inserir e remover dinamicamente" USBs enquanto o sistema estiver em execução.
Paulo
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.