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

7

Eu tenho um sistema sid Debian (Wheezy) (e a mesma pergunta para arch também), sem qualquer ambiente desktop (e nenhum Xorg).

Eu posso montar meus cartões SD, pen drives, HDD externo manualmente com o mount / umount com as entradas adequadas em /etc/fstab , mas isso é atraente e restritivo: se eu quiser que eles sejam montados em /media/<LABEL> each dispositivo com um <LABEL> diferente precisa de sua própria entrada, e cada diretório <LABEL> precisa 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)?

A solução ideal seria:

  1. detecta quando uma mídia removível é conectada (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> no modo RW (se o sistema de arquivos for suportado)
  4. detecte se a mídia foi desconectada
  5. se então, desmarque-o do sistema de arquivos
  6. remova o diretório correspondente de /media/

(os dispositivos devem ser montados em modo síncrono com cuidado, para evitar qualquer perda de dados quando desconectados a quente devido ao armazenamento em cache)

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

Minimalismo, elegância, KISS, * nix-minded, nenhum arquivo de política XML insuportável e altamente atualizado.

edit: tentando deixar minha pergunta mais clara

    
por cedbeu 31.07.2012 / 02:18

3 respostas

3

Ok, faz muito tempo, mas ainda responderei a minha pergunta com a melhor opção que encontrei a partir de agora.

A melhor maneira é criar uma regra udev , associada a alguns scripts (que criarão / removerão diretórios e montar / desmontar dispositivos removíveis) e anexados ao tipo de evento partition udev device.

1 - Criando scripts para adicionar / remover

Adicione este script storage-automount.sh em /lib/udev/ e defina-o como executável ( sudo chmod +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 its 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

Adicione este script storage-autounmount.sh em /lib/udev/ e defina-o como executável ( sudo chmod +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 é isso.

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 partições 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:21
1

Você pode querer verificar seu diretório /dev/disk/by-uuid enquanto essas unidades específicas estão conectadas. Usando ls -l , ele mostrará os dispositivos (por exemplo, /dev/sdb1 ) junto com seus uuids. Tendo encontrado as correspondências, atualize seu /etc/fstab de acordo, substituindo /dev/sd* pela entrada correspondente /dev/disk/by-uuid/* .

Para detalhes, veja minha resposta a Como evito que a unidade flash USB receba um novo nome de dispositivo Linux após o despertar? .

    
por 31.07.2012 / 10:47
0

Obrigado por suas dicas. Eu simplifiquei sua montagem e desmontei scripts como este:

mount:

#!/bin/sh

udisks --mount $DEVNAME

desmontar:

#!/bin/sh

udisks --unmount $DEVNAME

Meu arquivo /etc/udev/rules.d/ tem esta aparência:

# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto",       ENV{UDISKS_FILESYSTEM_SHARED}="1"
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh",     ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

É simples e deve ser um caso de uso típico.

    
por 20.08.2015 / 19:40