Sugestões necessárias para o udev, udisks, autofs, configuração de notificação para uma solução de automontagem completa no Linux

7

Continuando Montando dispositivos conectados no linux , o que deixou as coisas um pouco básico. Rodando o Gentoo, estou montando automaticamente uma combinação de dispositivos locais e de rede no meu laptop com o autofs-5.0.4-r5. Fazendo autofs sozinho me dá um par de queixas:

  • Preciso predefinir nomes para pontos de montagem por dispositivo, mas, ocasionalmente, depois de reinicializar meu leitor de cartões MMC, mudo de posição com meu dispositivo USB inicializável
  • Gostaria que pontos de montagem automáticos com base em LABEL aparecessem, apenas autofs AFAIK não pode fazer isso

Qual é o que o udev e os udisks são certamente capazes de fazer. Mas:

  • Eu não quero que o sistema de arquivos seja montado automaticamente ao conectar o dispositivo, apenas me dê o ponto de montagem fantasma chamado LABEL

A montagem real do sistema de arquivos só deve ocorrer no primeiro acesso ao ponto de montagem, assim como o ghosting do autofs funciona. Isso deve reduzir o risco de sujar os sistemas de arquivos desconectando acidentalmente os dispositivos e, ao mesmo tempo, proporcionando excelente acessibilidade.

Além disso, eu poderia usar sabendo o tempo todo o que está acontecendo na minha DE.

  • Existe um aplicativo da bandeja do sistema que é capaz de indicar o status de todos os montados automáticos, ou seja, verde = nada está montado, vermelho = algo está montado?
  • Existe uma maneira independente de distribuição de fornecer notificações de operação do sistema de arquivos (un), por exemplo, usando o comando notify-send? E quanto ao específico do Gentoo, isso funciona para mim também. Scripting udev não ajuda com NFS e CIFS, certo?

Esta combinação deve ser a configuração final automática, ou estou faltando alguma coisa?

    
por lkraav 19.05.2011 / 18:37

2 respostas

3

Isso tudo é possível com udev . Dê uma olhada no UAM , que parece abordar a maioria dos problemas mencionados, mas na verdade, faz montar automaticamente. Se desejar, você poderá utilizar os excelentes recursos que ele fornece, mas modificá-lo para que a mídia não seja montada automaticamente. Você também pode entrar em contato com o autor e sugerir sua abordagem de montagem não automática como um novo recurso. Enquanto isso, dê uma breve olhada nas suas capacidades:

  • Ele funciona em cima de udev , tornando-o independente de DE e baseado em eventos. (Também sugere uma solução alternativa para mídia ótica que pode não ser identificada por udev .)
  • Permite definir MOUNTPOINT_TEMPLATES que pode resolver o problema de nomenclatura mencionado em várias formas personalizadas (consulte uam.conf ), potencialmente também usando LABEL (como você deseja)
  • Os mecanismos de notificação são suportados, você só precisará ajustá-los às suas necessidades específicas de DE.
  • Parece ter um design claro, permitindo localizar facilmente onde, quando e como cada ação é acionada.
por 31.10.2011 / 14:22
0

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:08