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
mkdir "$mount_dir"
, masrmdir "/media/$device_name"
? Onde está$mount_dir
definido?set -xv
eexec >> "$HOME"/mount.log 2>&1
inserindo os.sh
arquivos?Respostas:
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=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
opção.fonte
Até o momento em que este artigo foi escrito, as outras respostas estavam incorretas (ou desatualizadas).
Você não deve executar a
mount
partir de um serviço Systemd. Mesmo depois de comentar as linhasMountFlags
e , 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.PrivateMounts
systemd-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_WANTS
variável Udev para iniciar uma unidade Systemd.fonte
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.fonte