mount não é executado quando chamado pelo udev

16

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"

O 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"

Fiz alguns testes para garantir que:

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

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

EDIT 28/08/14: Adicionei "grep -q / proc / mounts && echo success || falha de eco" no final do meu script para verificar no meu log de depuração se o dispositivo está realmente montado antes do final do script. Parece que o dispositivo está montado nesse ponto, mesmo quando o script é chamado pelo udev. Portanto, o verdadeiro problema agora é "meu dispositivo de bloco parece desmontado após o término do script de montagem quando chamado pelo udev": s

magva
fonte
Isso pode ser ao lado do ponto, mas por que você mkdir "$mount_dir", mas rmdir "/media/$device_name"? Onde está $mount_dirdefinido?
G-Man diz 'Restabelecer Monica'
Desculpe, isso é um erro de digitação, eu usei algumas variáveis completamente inútil aliasing nos códigos originais e eu removi-los aqui por uma questão de clareza
magva
Você já tentou a depuração da velha escola; por exemplo, colocando set -xve exec >> "$HOME"/mount.log 2>&1inserindo os .sharquivos?
G-Man diz 'Reinstate Monica'
1
Eu fiz isso, mas de acordo com o log que recebo, mount é executado quando o script é chamado pelo udev. Não há diferença no log entre uma chamada de udev e de linha de comando ... isso é realmente bastante desconcertante
magva
1
nesse caso, o script também iria falhar quando executado a partir de linha de comando
magva

Respostas:

22

O systemd-udevd é executado em seu próprio espaço para nome do sistema de arquivos e, por padrão, as montagens feitas no udev .rules não são propagadas para o host. Para fazer seus scripts antigos trabalhar você pode definir MountFlags=sharedem /usr/lib/systemd/system/systemd-udevd.serviceou (melhor) criar e editar sua cópia em/etc/systemd/system/

Veja man 5 systemd.execpara mais informações, MountFlagsopção.

user83388
fonte
O que você quer dizer com "não se propaga para o host"?
sebelk
2
@sebelk Acredito user83388 significa que eles não propagam ao namespace "root"
Mark
2

Até o momento em que este artigo foi escrito, as outras respostas estavam incorretas (ou desatualizadas).

Você não deve executar a mountpartir de um serviço Systemd. Mesmo depois de comentar as linhas MountFlagse , sua regra não funcionará para sistemas de arquivos do FUSE como NTFS ou exFAT, porque o processo do FUSE será útil para o Systemd.PrivateMountssystemd-udevd.service

Veja esta página do ArchWiki que lista várias opções melhores. Minha preferência é um pequeno projeto no GitHub chamado udev-media-automount , que simplesmente reinicia um serviço Systemd a partir da regra Udev. Essa é uma maneira conveniente de contornar as várias restrições complicadas do Udev em espaços para nome e processos filho.

Consulte também este analisador , que mostra como usar a SYSTEMD_WANTSvariável Udev para iniciar uma unidade Systemd.

Metamórfico
fonte
-1

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.

xae
fonte
obrigado, mas montar ainda não funciona :(
magva
1
Talvez não seja o seu caso, mas no meu sistema o mount está localizado em / bin / mount. Tente "comando -v mount".
Xae
1
No meu sistema, o caminho retornado pelo "comando -v mount" é / usr / bin / mount. Percebi que eu também tinha um / bin / mount executável, mas ele não funciona ou quando chamado por udev
magva