Я работаю над встроенной системой Linux на основе busybox. Иногда USB-устройство, которое физически удалено из поста, все еще отображается в mount
, df
или /proc/mounts
. Если я снова подключаю устройство, оно определяется как например, /dev/sdb1
пока /dev/sda1
устройство все еще смонтировано.
Я знаю, что причиной этого могут быть открытые дескрипторы файлов на удаленных устройствах, но есть ли другие условия, которые могут вызвать такое поведение?
решение1
Вы можете написать правило udev, например:
ACTION=="remove", KERNEL=="sd[b-z][0-9]", SUBSYSTEM=="block", RUN+="umount-removed.sh"
Что вызовет событие отключения и затем отмонтирует файловую систему из этого скрипта.
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
Журнал можно просмотреть в /var/daemon.log.
Редактировать :Забыл уточнить, что udev использует определенное пространство имен, поэтому вам придется настроить его для совместного использования точки монтирования с пространством пользователя.
Для этого найдите файл systemd-udevd.service
в вашей системе, скопируйте его /etc/systemd/system/systemd-udevd.service
и замените содержимое наMountFlags=shared