Montando e Desmontando USB automaticamente no Ubuntu

Iniciado por GuiEdington, 25 de Abril de 2014, 06:46

tópico anterior - próximo tópico

GuiEdington

Olá Pessoal,

Essa dica solucionou um grande problema que eu estava tendo com dispositivos usb, agora estou passando para o fórum.

É o seguinte, primeiro você irá precisar de dois pacotes chamados udev e pmount. Você pode acha-los no gerenciador de pacotes do Synaptic (No meu caso estou usando Ubuntu 12.04).
Agora precisamos criar um documento que sirva como um procedimento que o seu sistema deverá executar quando você plugar algum dispositivo USB. Use o comando:

sudo gedit /etc/udev/rules.d./automount.rules

Agora nesse novo arquivo criado cole este código:
# We wrap commands into calls to /bin/sh because PROGRAM and RUN
# accept only single commands, not command lists.
# PROGRAM figures out the label of the disk. Caching only gets in a
# way, returning old labels instead of querying for new ones, so we
# disable it. We use sed to replace non-alphanumeric symbols with
# underscore to facilitate readability and "typeability".
# RUN mounts the disk with specified label.
ACTION=="add",    KERNEL=="sd[b-z]*", PROGRAM="/bin/sh -c '/bin/sleep 2; /sbin/blkid -c /dev/null -s LABEL -o value /dev/%k | /bin/sed -r s#[^a-zA-Z0-9-]#_#g'", RUN+="/bin/sh -c '/bin/sleep 3 ; /usr/bin/pmount --umask 000 --noatime --charset utf8 %k %c'"
ACTION=="remove", KERNEL=="sd[b-z]*", RUN+="/usr/bin/pumount %k"

# the same as above, but for memory cards
ACTION=="add",    KERNEL=="mmcblk*", PROGRAM="/bin/sh -c '/bin/sleep 3; /sbin/blkid -c /dev/null -s LABEL -o value /dev/%k | /bin/sed -r s#[^a-zA-Z0-9-]#_#g'", RUN+="/bin/sh -c '/bin/sleep 4 ; /usr/bin/pmount --umask 000 --noatime --charset utf8 %k %c'"
ACTION=="remove", KERNEL=="mmcblk*", RUN+="/usr/bin/pumount %k"


Pronto, seus pendrives ou cartões SD serão reconhecidos automaticamente quando você pluga-los. Pórem eu enfrentei outro problema pois eles ainda não desmontavam sozinhos, então eu tinha que desmontar manualmente sempre antes de retirar. Mas procurando novamente pela internet achei este outro código que solucionou o problema.

Primeiro vamos criar outro documento:

sudo gedit /etc/udev/rules.d/80-usb-autounmount.rules

Agora vamos colar esse código no documento:
# Auto-unmount USB storage (on remove):
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/usr/bin/logger  auto umounting  %k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/bin/umount /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/bin/umount -lf /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/usr/bin/logger  auto umounting  %k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/bin/umount /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/bin/umount -lf /dev/%k"*


Salve e pronto. Tudo beleza, depois de ter criado esse novo documento meus pendrives se desmontavam sozinhos, mas minha entrada de cartão SD continuava montada. Então eu adicionei uma nova linha ao código acima. Primeiro fui ao terminal para saber qual era o nome da minha entrada de cartão SD:

sudo blkid
/dev/sda1: UUID="f4e3a629-fc22-4a2f-a9d6-5becdf3cca73" TYPE="ext4"
/dev/sda3: LABEL="Arquivos" UUID="D628441C2843F9CF" TYPE="ntfs"
/dev/sda5: UUID="591a8599-583a-4aad-8f37-310e77438e80" TYPE="swap"
/dev/sda6: UUID="20A45785A4575C7A" TYPE="ntfs"
/dev/mmcblk0p1: UUID="3230-3664" TYPE="vfat"


Descobrindo o nome na ultima linha "mmcblk0p1" adicionei essa nova linha no meu codigo de desmontar automaticamente:
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/mmcblk0p1", RUN+="/bin/umount /dev/%k"

Agora sim, tudo funcionando perfeitamente! O codigo ficou dessa forma:
# Auto-unmount USB storage (on remove):
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/usr/bin/logger  auto umounting  %k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/bin/umount /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd??", RUN+="/bin/umount -lf /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/usr/bin/logger  auto umounting  %k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/bin/umount /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/mmcblk0p1", RUN+="/bin/umount /dev/%k"
ACTION=="remove", SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sd???", RUN+="/bin/umount -lf /dev/%k"*


Bom, depois disso tudo passou a funcionar como eu queria. Devo muito a minhas fontes: Martin Monperrus, Minoru e Radu Rădeanu.

Qualquer melhoria ou opinião é bem vinda.

galactus

Hum mm esse tópico não estaria melhor no Dicas e truques?

Nunca passei por este problema, mas é uma ótima dica.
BigLinux no Notebook  / Várias Distros Virtualizadas no PC.