Como montar mídia removível em / media / LABEL automaticamente quando inserida, sem nenhum ambiente de desktop?

15

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

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

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

A solução ideal seria:

  1. detecta quando uma mídia removível é conectada (isto é, quando adicionada em /dev/ como sdax , sdbx , ... por udev )
  2. crie um diretório em /media/ de acordo com seu rótulo (rótulo da mídia removível)
  3. monte-o no diretório /media/<LABEL> in RW mode (se o sistema de arquivos suportar isso) com a opção flush (para vfat )
  4. detecte se a mídia foi desconectada
  5. se, então, desmontá-lo do sistema de arquivos
  6. remova o diretório correspondente de /media/

(os dispositivos devem ser montados no modo síncrono com cuidado, para evitar qualquer perda de dados quando desconectados a quente devido ao armazenamento em cache edit: sync is caminho demais para vfat mídia removível , então flush foi criado como um compromisso , menos seguro que sync , mas menos arriscado de acordo para os ciclos de vida das memórias flash)

Encontrei algumas informações sobre autofs , HAL , udisks , udisks2 , usbmount etc., mas não está claro qual delas está obsoleta ou preferida e, de qualquer forma, não entendi como para configurá-los facilmente no meu sistema para fazer isso, até agora ...

    
por cedbeu 01.08.2012 / 10:40

4 respostas

2

Ok, faz muito tempo, mas ainda responderei a minha pergunta com a melhor opção que encontrei a partir de agora. Para resumir: crie uma regra udev , associada a alguns scripts (que criarão / removerão diretórios e desmontar dispositivos removíveis) e anexados a udev device event type = partition .

1 - Criando scripts para adicionar / remover

Salve o script a seguir storage-automount.sh to /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 a seguir storage-autounmount.sh to /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 regra udev para anexar esses scripts a eventos

Por fim, adicione uma regra udev em /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 / dir

Agora, quando você conecta um dispositivo de armazenamento, um diretório será criado em /media/ de acordo com o nome da partição (não lembro, mas acho que também funciona com a partição NTFS) e sua partição será montada afim disso. É R / W para usuários se você tiver um grupo plugdev em seu sistema. Além disso, os dispositivos são montados em 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 eventos udev é udevadm monitor , com opções como --env ou --property :

$ udevadm monitor --env

Isso é testado e funciona bem no debian e no arch, mas provavelmente funciona em todas as distribuições que dependem do udev .

    
por 12.08.2013 / 15:35
9

Acho que você está procurando por pmount .

Se você quiser montagem automática após a inserção, consulte A montagem automática de dispositivos USB no Debian .

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

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

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

    
por 02.08.2012 / 02:37
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] 
# 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 rótulo. O segundo link simbólico irá linkar de "/media/usb/<...>" para "/media/autousb/<...>" isso é feito para o suporte do automounter (consulte a etapa 2).

Nota: eu originalmente 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 pen drives USB que usam o mesmo rótulo?

Mas o cartaz 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 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 "xfs". É 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
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:24
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>

    
por 02.10.2014 / 14:04