Estou trabalhando em um sistema Linux embarcado baseado no busybox. Às vezes, um dispositivo USB removido fisicamente da postagem ainda é exibido mount
em df
ou /proc/mounts
. Se eu reconectar o dispositivo, ele será detectado, por exemplo, /dev/sdb1
enquanto o /dev/sda1
dispositivo ainda estiver montado.
Eu sei que identificadores de arquivos abertos em dispositivos removidos podem causar isso, mas há alguma outra condição que possa desencadear esse comportamento?
Responder1
Você poderia escrever uma regra do udev como
ACTION=="remove", KERNEL=="sd[b-z][0-9]", SUBSYSTEM=="block", RUN+="umount-removed.sh"
O que irá acionar o evento unplug e então desmontar o sistema de arquivos desse script
MNT_POINT=`df | grep "$DEVNAME" | awk '{print $6}'`
#If still mounted
if [ ! -z "$MNT_POINT" ];then
logger -i -t usbrm -p daemon.notice "The device $DEVNAME is still mounted"
#Umount fs
umount $DEVNAME
if [ $? -eq 0 ];then
logger -i -t usbrm -p daemon.notice "$DEVNAME successfully unmounted from $MNT_POINT"
else
logger -i -t usbrm -p daemon.err "Impossible to umount $DEVNAME from $MNT_POINT. Aborting..."
fi
fi
Você pode ver o login em /var/daemon.log.
Editar:Esqueci de especificar que o udev usa um espaço de nome específico, então você precisa configurá-lo para compartilhar o ponto de montagem com o espaço do usuário.
Para fazer isso, localize o arquivo systemd-udevd.service
em seu sistema, duplique-o /etc/systemd/system/systemd-udevd.service
e substitua o conteúdo porMountFlags=shared