내 시스템에 여러 개의 USB가 연결되어 있습니다. 특정 .ini 파일이 포함되어 있거나 비어 있는 USB(이 경우 .ini 파일을 생성하려는 경우)를 찾아서 /media/mount_point에 마운트하고 싶습니다. 해당 USB가 없으면 아무것도 설치하면 안 됩니다.
각 USB에 대해 다음 스크립트를 실행하는 udev 규칙을 만들어 보았습니다.
#!/bin/sh
LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"
if [ -z "$DEVNAME" ]; then
exit
fi
echo "USB device detected at $DEVNAME" >> $LOGFILE
if grep '$MOUNTDIRECTORY ' /proc/mounts; then
# Already mounted
echo "Mount directory already in use" >> $LOGFILE
exit
fi
mount $DEVNAME $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 &>> $LOGFILE
if [ $? -eq 0 ]; then
echo "$DEVNAME mounted at $MOUNTDIRECTORY" >> $LOGFILE
if [ -f $MOUNTDIRECTORY/log.ini ]; then
echo "Log.ini found. Ready to log" >> $LOGFILE
break
elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
echo "USB device empty. Creating log.ini" >> $LOGFILE
touch $MOUNTDIRECTORY/log.ini
break
else
umount $MOUNTDIRECTORY
fi
else
echo "Failed to mount $DEVNAME at $MOUNTDIRECTORY" >> $LOGFILE
fi
echo "" >> $LOGFILE
.ini가 존재하는 경우 작동합니다(systemd-udevd.service 편집 후).이 문제), 그러나 빈 USB가 발견된 경우에는 그렇지 않습니다. $LOGFILE 출력에서는 .ini가 생성되었다고 보고하지만, 확인해 보면 마운트된 장치에 .ini 파일이 없습니다. 제거하면 마운트 지점에 .ini 파일이 생성된 것을 볼 수 있습니다.
.ini 파일이 마운트된 USB 대신 마운트 지점에 있는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있나요?
아니면 이 문제에 대해 udev보다 더 나은 접근 방식이 있습니까?
답변1
만족스러운 해결책을 찾을 수 있었습니다.
udev에서 직접 마운트하는 대신에 제안된 대로 새 서비스를 생성했습니다.이 문제. 마침내 나는 이 udev 규칙을 얻었습니다:
ACTION=="add",<Your device specifiers here>,ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"
다음 서비스가 추가되었습니다 /etc/systemd/system
.
[Service]
Type=oneshot
TimeoutStartSec=300
GuessMainPID=false
RemainAfterExit=yes
ExecStart=/bin/bash -c "/home/user/mount.sh %I"
내 스크립트를 다음과 같이 수정했습니다.
#!/bin/sh
LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"
DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
if [ -z "$BASENAME" ]; then
exit
fi
echo "" >> $LOGFILE
echo "New USB device detected at $DEVICE" >> $LOGFILE
if grep '$MOUNTDIRECTORY ' /proc/mounts; then
# Already mounted
echo "Mount directory already in use" >> $LOGFILE
exit
fi
mount $DEVICE $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 >> $LOGFILE
if [ $? -eq 0 ]; then
echo "$DEVICE mounted at $MOUNTDIRECTORY" >> $LOGFILE
if [ -f $MOUNTDIRECTORY/log.ini ]; then
echo "Log.ini found. Ready to log" >> $LOGFILE
break
elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
echo "USB device empty. Creating log.ini" >> $LOGFILE
touch $MOUNTDIRECTORY/log.ini
break
else
echo "Log.ini not found. Unmounting" >> $LOGFILE
umount $MOUNTDIRECTORY
fi
else
echo "Failed to mount $DEVICE at $MOUNTDIRECTORY" >> $LOGFILE
fi
echo "" >> $LOGFILE
원래 문제의 원인을 아직도 이해하지 못합니다(log.ini 파일이 마운트된 장치 중 하나가 아닌 마운트 지점에 나타남). 누구든지 설명이 있으면 관심이 있을 것입니다.