Como montar a mídia removível em / media / <LABEL> automaticamente quando inserida, sem nenhum ambiente de área de trabalho?

17

Eu tenho um sistema sid Debian (Wheezy) (e o mesmo para arch), sem nenhum ambiente de desktop (e sem Xorg).

Posso montar meus cartões SD, pen drives, HDD externo por etiqueta em um diretório especificado /media/manualmente com mount/ umounte as entradas adequadas /etc/fstabou automaticamente no momento da inicialização, mas isso é atraente, restritivo e não é dinâmico o suficiente para minhas necessidades: se eu quiser que eles sejam montados /media/<LABEL>, cada dispositivo com uma diferente <LABEL>precisará de sua própria entrada e cada <LABEL>subdiretório também precisará ser criado / removido manualmente /media/).

Então, qual é a melhor maneira de montá-los automaticamente na /media/<LABEL> inserção (e desmontá-los do sistema de arquivos assim que são desconectados, não importa o risco para os dados )?

A solução ideal seria:

  1. detectar quando um suporte de dados amovível está ligado à corrente (isto é, quando adicionado em /dev/quanto sdax, sdbx, ... por udev)
  2. crie um diretório de /media/acordo com seu rótulo (rótulo da mídia removível)
  3. monte-o no diretório /media/<LABEL>no RWmodo (se o sistema de arquivos suportar isso) com a flushopção (para a vfat)
  4. detectar se a mídia foi desconectada
  5. caso contrário, desmonte-o do sistema de arquivos
  6. remova o diretório correspondente de /media/

(os dispositivos devem ser montados no modo síncrono de forma ovalada, para evitar perda de dados quando desconectados a quente devido à edição em cache :sync é demais para vfatmídia removível, por isso flush foi criado como um compromisso , menos seguro que sync, mas menos arriscado de acordo com a vida útil (motocicletas de memórias flash)

Eu encontrei algumas informações sobre autofs, HAL, udisks, udisks2, usbmountetc., mas não está claro qual é obsoleto ou preferencial, e de qualquer maneira, eu ainda não descobri como configurá-los facilmente no meu sistema para fazer isso, até agora ...

cedbeu
fonte
Primeiro, você procurou por perguntas semelhantes? Lembro que já foi perguntado. Segundo, a desmontagem deve ocorrer antes da desconexão.
enzotib 01/08/2012
1
Claro que sim: o] Aqui e no superusuário. O problema é que as ferramentas evoluem (udisks / udev) ou são preteridas (HAL?), Outras "não preferidas" (udisks2?) E assim por diante. De qualquer forma, não consegui encontrar nenhuma solução que funcione nem estivesse clara. A maioria das descobertas que eu descobri depende de um mecanismo de ambiente de desktop (Gnome, KDE ou XFCE); Eu não quero ter que instalar nenhum. Sobre desmotivar, não necessariamente. Se o dispositivo estiver definido como sync, um deamon pode desmontar o dispositivo do fs se detectar que foi desconectado sem perda de dados. Todas as distros da área de trabalho fazem isso. Eu quero isso no terminal.
cedbeu
Veja esta substituição parahalevt . Sobre a desmontagem, geralmente a DE espera que você ejete o dispositivo do gerenciador de arquivos antes de desconectá-lo fisicamente.
enzotib 01/08/2012
Sim, verdade. Mas vi que alguns daemons (usados ​​anteriormente) podiam desmontar dispositivos do fs que não foram desmontados antes de desconectar, e até mesmo excluir automaticamente o diretório correspondente de / media /, e permanecer na maneira normal de fazer as coisas (se dispositivos estão configurados para serem síncronos, é claro). Obrigado pelo seu link. Vou dar uma olhada assim que voltar para casa no udisksevt. Eu já dou uma olhada no devmon e no udiskie, mas eles não estão nos pacotes Debian. Se eu encontrar outra coisa, tentarei isso, mas não acredito que não exista uma solução nativa no Debian para fazer isso.
cedbeu
1
Eu estou no Debian também e eu usar fdisk -le depois mount- que é dois comandos, mas OK, se você quer que ele automatizado, você vai ter que analisar a fdisk -lsaída e, em seguida, colocá-lo no mount- I fazer tais coisas com head, tail, tr, cut, etc., mas os profissionais costumam fazer isso awkou, melhor ainda, procurar os dados no local correto. Sobre a exclusão, pelo menos para mim quando eu monto /mnt, é feito automaticamente. Sobre o gatilho (quando você conecta) Não faço ideia, mas informe-nos quando resolver isso.
Emanuel Berg

Respostas:

10

Eu acho que você está procurando pmount.

Se você deseja montar automaticamente após a inserção, consulte Montagem automática de pen drives no Debian .

Se o seu sistema usa udisks2 , essa é a maneira preferida de reagir à inserção de um dispositivo de armazenamento removível. Veja o Arch Wiki para obter dicas de configuração para Udisks.

Caso contrário, o programa que reage quando um novo dispositivo aparece é o udev ; portanto, a montagem automática é acionada por uma regra do udev . O pacote usbmount fornece regras do udev para montar automaticamente dispositivos de armazenamento USB e alguns outros. Chamar mountde regras do udev não funciona para sistemas de arquivos FUSE (como o ntfs-3g), portanto, use os udisks, se necessário.

Você não pode desmontar automaticamente as mídias quando elas são removidas porque a causalidade não funciona dessa maneira. A mídia deve ser desmontada antes de ser removida. Para mídia somente leitura, você pode desmontar após a remoção, embora isso possa confundir alguns aplicativos se eles tiverem arquivos abertos no sistema de arquivos desaparecido repentinamente. Para mídia gravável, se você desconectar um sistema de arquivos montado, é provável a corrupção de dados.

Gilles 'SO- parar de ser mau'
fonte
Um milhão de agradecimentos pela resposta. Vou tentar isso o mais rápido possível e avisarei as pessoas daqui. Sobre desmotivar. Gente, por favor, parem de me dizer que é uma questão de causalidade onde não é: o] A desmontagem após o dispositivo ser desconectado perfeitamente faz sentido (e é possível) assim que o dispositivo estiver configurado para ser síncrono. Então, é apenas uma questão de sistema de arquivos. Se os dados foram transferidos sem armazenamento em cache (síncrona), não há problema em desconectar sem desmontar. Em seguida, a desmontagem pode ser realizada e é útil apenas para informar ao sistema que o dispositivo não está mais lá.
cedbeu
1
@cblab Você é simplista demais. Se um arquivo estiver aberto para gravação e você puxar o dispositivo, é provável que ele esteja danificado; a desmontagem garante que nenhum arquivo esteja aberto. Em muitos sistemas de arquivos (embora não seja o FAT), desmontar é mais do que definir o bit sujo como 0, eles precisam, por exemplo, liberar um log. Para dispositivos flash, uma grande preocupação com montagens de sincronização é que o desgaste do dispositivo é muito mais rápido, porque impede o agrupamento de gravações. Veja superuser.com/questions/180722/… e readlist.com/lists/vger.kernel.org/linux-kernel/22/111748.html
Gilles 'SO- deixa de ser mau'
Olá @Gilles. Obrigado por suas respostas. Mas não acho que seja simplista demais. Você está certo em alguns pontos. Mas, o usuário decide se ele quer viver arriscado. Você concorda que sua postagem tem 7 anos; agora, uma flushopção de montagem projetada especialmente para vfatevitar esses problemas: a gravação não é executada após cada bloco, mas assim que o dispositivo parece estar inativo. E as memórias flash também aumentaram muito seus ciclos de vida sem saída. Agora, obviamente, o usuário deve estar ciente de não desconectar os dispositivos enquanto os arquivos são abertos ou durante uma cópia (ou logo após). Mas é o bom compromisso.
cedbeu
de qualquer maneira, o usbmount poderia ter sido a melhor opção para mim, mas infelizmente não monta os dispositivos em uma pasta, dependendo dos nomes dos rótulos, mas sim /media/usb-*, o que não se encaixa nas minhas necessidades. Quero poder montar automaticamente os dispositivos /media/<DEV_LABEL>com o flushparâmetro quando eles forem detectados (se possível com a criação dinâmica do diretório), desmontá-los e remover os diretórios /media/automaticamente se eles não forem mais detectados. O risco que assumo depende de mim.
cedbeu
1
Preste atenção que usbmountnão é mais compatível com NTFS jessie: bugs.debian.org/774149
malat 19/05/2015
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] 
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
    RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    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", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"

# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    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 / <...>". Ele usará o rótulo da partição de armazenamento USB ou o nome do kernel, se não houver um rótulo. O segundo link simbólico será vinculado de "/ media / usb / <...>" para "/ media / autousb / <...>", para suporte ao montador automático (consulte a etapa 2).

Nota: originalmente eu não usei as regras com as variáveis ​​ID_FS_LABEL_ENC, pois isso é perigoso na minha opinião. O que acontece se você conectar dois pendrives que usam a mesma etiqueta?

Mas o pôster queria especificamente usar o rótulo do disco USB, então modifiquei as regras de acordo.

Para garantir que o udev leia essas regras, use

sudo udevadm control --reload-rules

Com esse arquivo de regras do udev, tudo é 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 informa 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 "xfs". 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
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.
Ingo Blackman
fonte
2

Ok, já faz muito tempo, mas ainda vou responder minha pergunta com a melhor opção que encontrei a partir de agora. Para resumir: crie uma udevregra associada a alguns scripts (que criarão / removerão diretórios e desmontarão dispositivos removíveis) e anexados ao udevtipo de evento do dispositivo = partition.

1 - Criando adicionar / remover scripts

Salve o script storage-automount.sha seguir /lib/udev/e torne-o executável ( sudo chmod a+x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

Salve o script storage-autounmount.sha seguir /lib/udev/e torne-o executável ( sudo chmod a+x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - Criando a udevregra para anexar esses scripts aos eventos

E, finalmente, adicione uma udevregra /etc/udev/rules.d/, por exemplo 85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

e torná-lo com as mesmas permissões que as outras regras nessa pasta / diretório

Agora, quando você conectar um dispositivo de armazenamento, um diretório será criado de /media/acordo com o nome da partição (não me lembro, mas acho que está funcionando com a partição NTFS) e sua partição será montada nele. É R / W para usuários se você tiver um plugdevgrupo em seu sistema. Além disso, os dispositivos são montados no modo síncrono para limitar os riscos de perda de dados em caso de desconexão a quente.

Quando o dispositivo é removido, ele é desmontado e o diretório é removido de /media

Além disso, a ferramenta para monitorar os udeveventos é udevadm monitor, com opções como --envou --property:

$ udevadm monitor --env

Isso foi testado e está funcionando bem no debian e no arch, mas provavelmente funciona em todas as distribuições em que se baseia udev.

cedbeu
fonte
Eu acho que + r deve ser substituído por + x em "configure-o como executável (sudo chmod + r /lib/udev/storage-autounmount.sh)"
Jeremy
Eu tenho uma nova instalação de jessie na qual segui suas instruções de perto, mas não consigo fazer o automount acontecer a partir de tty1, mesmo após a reinicialização (o que não está nas suas instruções, mas também não tenho pré-reinício no automount). A inserção da unidade USB é detectada (recebo mensagens do console), mas nada é visível em / media / (exceto cdrom). Posso montar manualmente a unidade USB, então sei que também funciona. [continua no seguinte comentário]
TomRoche
[continuação do comentário anterior] Eu tenho o pacote = udev instalado, tenho dirs = {/ etc / udev / rules.d /, / lib / udev /} pré-preenchidos e tenho executável = udevadm em $ PATH. Eu gostaria de saber (1) em qual versão do Debian você fez isso funcionar? (Estou assumindo wheezy) (2) quais pacotes Debian você instalou além udev?
TomRoche
O @TomRoche era Wheezy, na verdade, e eu não tinha nenhum pacote especial instalado, estava tentando fazer uma configuração minimalista e tentando evitar, tanto quanto possível, usar pacotes que não eram fornecidos pela instalação mínima. Não precisei reiniciar, por isso não está nas minhas instruções. Já faz muito tempo que eu não mergulhei nisso ... posso tentar novamente em breve.
cedbeu
1

Acho que é muito tarde, mas vou postar isso se alguém precisar: (também minha primeira resposta do StackExchange)

Depois de verificar a solução em muitos lugares, encontrei uma solução simples no Arch Wiki:

Link para o Arch Wiki .

Podemos adicionar uma regra udisks2 para alterar o diretório de montagem padrão de /run/media/$USER/para /media/<Label>.

Adicione a seguinte regra /etc/udev/rules.d/com nome como 99-udisks2.rules:

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

Depois, podemos instalar uma ferramenta simples como o Udiskie for automount.

Abhijeet Bhattacharjee
fonte
Olá e seja bem-vindo aqui. Obrigado pela sua opção. Para o Udiskie, eu realmente queria uma opção de linha de comando completa (sem Xorg nem qualquer interface gráfica disponível no sistema). E… A pergunta tem 6,5 anos (ai, nossa!), Acho que as coisas mudaram agora :) Mas, de qualquer forma, +1 na sua primeira resposta, obrigado.
cedbeu 24/01
1

Por favor, consulte a página do ArchWiki Udev . Você não deve executar a mountpartir das regras do Udev ou de scripts executados pelas regras do Udev.

No entanto, como mostrado no projeto udev-media-automount , é bastante simples invocando uma unidade Systemd da regra Udev, que então chama um script que faz a montagem. Diferentemente do udisks2 e de outras soluções, o udev-media-automount é voltado para o caso simples em que você deseja montar algo como rootusuário sem necessariamente esperar por um ambiente de desktop ou "sessão do usuário". Parece ser exatamente o que o OP está pedindo, e achei funcional e fácil de entender.

Metamórfico
fonte
Bom obrigado. É uma pergunta bastante antiga que eu fiz (quase 7 anos atrás ... não me faz sentir mais jovem ^^). Mas ainda assim, darei uma olhada na sua proposta. Eu acho que o ambiente systemd ficou muito mais maduro desde então. Obrigado, vou verificar isso!
cedbeu 20/03
0

Eu encontrei uma maneira de fazer isso editando o arquivo / etc / fstab. Uma entrada simples se parece com:

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>

Pedro
fonte
As montagens /etc/fstabsão montadas apenas automaticamente na inicialização.
Graeme
@ Graeme, eu tenho um sdcard que monto via / etc / fstab. Como teste, tentei desmontar e remover fisicamente o cartão sd do meu computador. Eu verifiquei que a montagem não era mais exibida via 'df'. Quando reinsirai meu sdcard, a montagem reapareceu, mesmo que eu não o tivesse remontado explicitamente. Isso está no Ubuntu 16.04.
Gino
@Gino, o Ubuntu já faz a montagem automática há algum tempo.
Graeme
@ Graeme, parece que o montador automático do Ubuntu está escolhendo a montagem correta em / etc / fstab, se ela existe. Assim, pelo menos no Ubuntu 16.04, a montagem é montada automaticamente no arranque e após subsequentes re-inserções na porta USB, se houver algum ..
Gino
@ Gino Não uso o Ubuntu há algum tempo, mas tenho certeza de que ele montará automaticamente no seu cartão SD, independentemente do que esteja no fstab. O Fstab é mais sobre a configuração de elementos principais do sistema do que discos adicionais em sistemas modernos.
Graeme