Por algum tempo eu tinha uma regra udev funcionando para automontar dispositivos de mídia.
/etc/udev/rules.d/61-mount_media_by_label.rules
#
# To propagate udev's mountpoint to the user space, MountFlags must have a value "shared" in the /usr/lib/systemd/system/systemd-udevd.service.
#
# Ignore devices that aren't storage block-devices and block-devices that are already listed in /etc/fstab.
KERNEL!="sd[a-z][1-9]*", GOTO="mount_media_by_label_end"
PROGRAM="/bin/grep -e '^UUID=%E{ID_FS_UUID}' /etc/fstab", RESULT!="", GOTO="mount_media_by_label_end"
# Decide the name for device's mountpoint directory, based on device's label.
ENV{ID_FS_LABEL}!="", ENV{mountpoint}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{mountpoint}="usb-%k"
# If device is being plugged in, set options for mount command.
ACTION=="add", ENV{mount_options}="relatime"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002"
# If device is being plugged in, create mountpoint directory in /media and mount device node to it.
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{mountpoint}", RUN+="/bin/mount -o %E{mount_options} /dev/%k /media/%E{mountpoint}"
# If device is being plugged out, unmount it and delete its mountpoint directory.
ACTION=="remove", ENV{mountpoint}!="", RUN+="/bin/umount -l /media/%E{mountpoint}", RUN+="/bin/rmdir /media/%E{mountpoint}"
# Label for early exit.
LABEL="mount_media_by_label_end"
Para fazer esta regra funcionar, eu só tive que alterar o valor da MountFlags
opção para shared
em
/usr/lib/systemd/system/systemd-udevd.service
Depois de atualizar systemd
para version 239
, este arquivo parece diferente.
Percebi 2 mudanças que podem ser problemáticas:
- A
MountFlags
opção não é especificada nas configurações padrão. - Há uma nova opção
PrivateMounts
definida comoyes
.
Da documentaçãosystemd
do 's eu percebi que agora eu só preciso definir e a propagação do mountpoint chegaria ao espaço do usuário. PrivateMounts=no
No entanto, este não é o caso.
eu tentei
- Mudando
PrivateMounts=no
- Alterando
PrivateMounts=no
e adicionandoMountFlags=shared
mas também não funciona.
Qual é a maneira correta de montar dispositivos de mídia a partir de regras do udev em systemd v239
e posteriormente?
Esta abordagem pode ser sub-ótima. Por exemplo, se você suportar a montagem de NTFS gravável usando
ntfs-3g
, ontfs-3g
processo será encerrado sempre que você reiniciar o udev.Observe que a doutrina de segurança moderna sugere que os desktops devem começar a usar o FUSE para montar todos os sistemas de arquivos removíveis. https://lwn.net/Articles/755593/
Seria preferível se você pudesse descobrir como iniciar (e parar?) uma unidade systemd separada ... e escrever isso como a abordagem preferida, em quaisquer documentos peculiares que continuem sugerindo que os usuários do Arch usem esse padrão :-). Usar uma unidade systemd separada evitará as restrições aplicadas ao serviço udev.
Por exemplo, inicie um comando em uma unidade de escopo systemd usando
systemd-run --no-block --scope -- my mount command here
.Infelizmente, se você deseja que a unidade que contém
ntfs-3g
tenha um nome identificável , não é imediatamente óbvio qual é a maneira 100% correta. Se uma unidade antiga com esse nome ainda for rastreada como "ativa", mas o processo acabou de sair, simplesmente pedir ao serviço para iniciar não fará nada. Você pode ignorar o problema, gerar um sufixo aleatório para o nome ou tentar descartar essa sequência de eventos... mas talvez haja uma maneira melhor.Eu não testei isso com o FUSE, mas acho que a maneira de fazer isso seria osystemd-mount
comando.Uma resposta de superusuário sugere que o usosystemd-mount
em um dispositivo enquanto a regra do udev ainda está em execução pode não funcionar corretamente. Isso exigiria soluções alternativas bastante barrocas. (RUN+="/path/to/my/script %k"
que corresystemd-run --no-block --scope --unit=mount-$1 sh -c "systemctl start /dev/$1; systemd-mount ..."
).Eu acho que a maneira de fazer isso seria algo como
ENV{SYSTEMD_WANTS}=my-mounter@%k.service
Os padrões para
systemd-mount
fazem com que o sistema de arquivos seja desmontado automaticamente na remoção, mas eles não limpam o diretório do ponto de montagem criado automaticamente posteriormente (!).Houve duas mudanças separadas na v239 - duas diretivas separadas que você deve reverter para obter o comportamento antigo.
PrivateMounts=yes
. Substitua isso porPrivateMounts=no
.SystemCallFilter=@system-service @module @raw-io
O uso desta diretiva é novo na v239. Portanto, a maneira mais simples de recuperar o comportamento anterior é removê-lo completamente.