얼마 전에 USB 스틱이 연결되었을 때 실행할 udev 스크립트를 받았습니다.우분투16.04(서버) 머신. (저는 이것을 사용하여 virtualbox 게스트에 설치했습니다.)
이제 이 스크립트에서 다른 작업을 수행하고 싶습니다(호스트 시스템에 설치). udev 규칙이 있습니다.
#/etc/udev/rules.d/10-usbmount.rules
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", RUN+="/bin/su <username> -c /home/<username>/automount"
automount
현재 스크립트를 호출합니다 .
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
mount $DEVNAME /home/<username>/flashes_folder &>> $LOG_FILE
#mount /dev/sdb1 /home/<username>/flashes_folder &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
(에서 가져옴여기) 로그 파일에는 다음 출력이 포함됩니다.
New usb device detected at /dev/sdb doing stuff
mount: only root can do that
1
디스크 경로를 명시적으로 /dev/sdb1
(주석 처리된 줄) 입력하면 동일한 오류가 발생합니다(디스크는 실제로 /dev/sdb1입니다). 분명히 /bin/su <admin_username>
권한이 충분하지 않습니다. 이 문제를 어떻게 해결할 수 있나요?
답변1
일반 사용자가 볼륨을 마운트하려면(장치 파일에 대한 전체 액세스 권한이 있더라도) /etc/fstab
항목이 있어야 합니다. 이는 분명히 동적 장치 이름에서는 작동하지 않습니다.
udev는 심볼릭 링크만 추가할 수 있지만 블록 장치의 이름은 변경할 수 없습니다. 그러나 fstab 항목에는 실제 이름이 필요합니다.
그러나 장치 이름을 사용하는 대신 파일 시스템 UUID를 사용할 수 있습니다. udev는 사용자가 장치를 읽을 수 있도록 하고 사용자 스크립트가 UUID를 결정할 수 있도록 심볼릭 링크를 설정할 수 있습니다.
fstab 항목
UUID=8186709a-ab1f-4d18-80bb-b219cb126398 /mnt/tmp ext4 defaults,noauto,user,nofail 0 0
마운트 스크립트
current_uuid=$(blkid --output export /dev/myusb | grep ^UUID=)
mount "$current_uuid"
장치 매퍼
또 다른 접근 방식은 USB 장치( ) 위에 장치 매퍼 장치를 배치하는 것입니다 man dmsetup
. 장점은 이 방법으로 정적 이름을 얻을 수 있다는 것입니다(예: .) /dev/mapper/myusb
. 하지만 USB 스틱을 제거하면 DM 장치가 어떻게 반응할지 모르겠습니다. 이 문제를 처리하려면 udev 풀아웃 규칙이 필요할 수 있습니다. 이는 훨씬 더 복잡해 보이며 아마도 정적 이름을 사용할 자격이 없을 것입니다.
답변2
나는 /etc/fstab
만지지 않고 문제를 해결했습니다.산프로그램. 이 프로그램은 여러 Linux 배포판의 패키지 저장소에서 사용 가능한 것으로 보입니다.
우분투에서는 폴더가 자동으로 생성되고 /media
디스크가 이 폴더에 마운트됩니다. 디스크를 외부에 마운트할 수 있는 방법은 없는 것 같지만, /media
개인적으로는 그 점에 동의합니다.
프로그램은 파티션 식별자(예 sdb1
: )를 매개변수로 사용합니다. $DEVNAME
디스크 식별자(예: sdb
)는 udev 스크립트에서 제공될 수 있습니다. 플래시 디스크의 경우 sdb1
디스크의 첫 번째 파티션( )만 적합합니다.
따라서 문제의 스크립트의 작업 버전은 다음과 같습니다.
LOG_FILE=/home/<username>/usb_log
echo "New usb device detected at $DEVNAM doing stuff
pmount "{$DEVNAME}1" &>> $LOG_FILE
ret=$?
echo "$ret" >> $LOG_FILE
최종 참고 사항: 스크립트는 루트로 실행되며 스크립트 파일은 루트에 속해야 합니다. (우분투에서)