mount não é executado quando chamado pelo udev

13

Eu tentei criar algumas regras do udev para montar e desmontar minhas unidades flash USB; as regras para o momento são muito simples:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh também é muito simples:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

Eu fiz alguns testes para verificar se:

  • Quando conectado, meu pen drive é detectado; um arquivo é criado em / dev
  • plug_flash_drive.sh é chamado pelo udev
  • a parte do mkdir do script funciona
  • no entanto, parece que a parte "mount" do script não é executada, então minha unidade não está montada
  • quando eu chamo meus scripts na linha de comando, eles funcionam perfeitamente

Alguém sabe por que o mount não é executado quando chamado pelo udev?

EDITAR 28/08/14: Eu adicionei "grep -q / proc / mounts & & echo success || echo failure" no final do meu script para verificar meu log de depuração se o dispositivo estiver realmente montado antes do script terminar. Parece que o dispositivo é montado nesse ponto, mesmo quando o script é chamado pelo udev. Portanto, o verdadeiro problema agora é "meu dispositivo de bloco é aparentemente desmontado depois que o script de montagem termina quando chamado pelo udev": s

    
por magva 27.08.2014 / 22:05

2 respostas

20

O systemd-udevd é executado em seu próprio namespace do sistema de arquivos e, por padrão, as montagens feitas dentro do udev .rules não se propagam para o host. Para que seus scripts antigos funcionem, você pode definir MountFlags=shared em /usr/lib/systemd/system/systemd-udevd.service ou (melhor) criar e editar sua cópia em /etc/systemd/system/

Veja man 5 systemd.exec para mais informações, MountFlags option.

    
por 08.09.2014 / 08:06
0

Você pode tentar usar := em vez de += nas atribuições de execução de regras.

O operador := define o valor da lista e não permite mais alterações.

    
por 27.08.2014 / 22:30