CentOS 7을 실행하는 컴퓨터가 있습니다. USB 드라이브("sdb1")가 연결될 때 /mnt/flash에 자동으로 마운트되도록 udev 규칙을 설정하려고 합니다.
udev 스크립트가 작동하지 않았기 때문에(아래 참조) 명령을 bash 스크립트에 넣고 udev가 bash 스크립트를 실행하게 하여 무슨 일이 일어나고 있는지 확인할 수 있었습니다.
질문 1: bash 스크립트에서 직접 /mnt/flash를 생성하려고 하면 루트 파일 시스템이 읽기 전용이므로 실패합니다. 루트 파일 시스템이 읽기 전용이 아닌 것을 확인할 수 있습니다. 내 시스템이 시작되었습니다. 그러나 USB 드라이브를 연결하고 udev에서 스크립트를 실행하게 하면 "mount | "를 실행하는 것으로 충분합니다. 내 스크립트의 로거'는 루트가 읽기 전용임을 보여줍니다.
스크립트 상단에서 "mount -o remount,rw /"를 실행하여 이 문제를 해결했습니다.
질문 #2: /mnt/flash를 성공적으로 생성하고 /dev/sdb1을 /mnt/flash에 마운트할 수 있었습니다. 'install | do this'를 실행한 후 /var/log/messages에 설치된 것을 확인했습니다. 그러나 결론은 /dev/sdb1이 마운트되지 않았다는 것입니다. 심지어 스크립트에 5초의 지연을 설정하고 "mount |"를 실행하여 두 번째 로그를 기록했습니다. 두 번 모두 /dev/sdb1이 /mnt/flash에 마운트되어 있음을 보여줍니다. 그러나 이 모든 일이 일어나는 동안 다른 터미널에서 "mount"를 실행하면 /dev/sdb1이 어디에도 마운트된 것을 볼 수 없습니다.
내가 미친 걸까요, 아니면 udev가 실행 중에 파일 시스템에 이상한 일을 하고 있는 걸까요?
udev 스크립트: /etc/udev/rules.d/99-usb-automount.rules
#Only operate on sdb1
KERNEL!="sdb1", GOTO="usb-automount-end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="usb-automount-end"
#import useful variables from blkid program
IMPORT{program}="/sbin/blkid -o udev -p %N"
#ignore anything other than vfat filesystems
ACTION=="add", ENV{ID_FS_TYPE}!="vfat", GOTO="usb-automount-end"
#remount root as read-write. Not sure why we have to do this!
#ACTION=="add", RUN+="/bin/mount -o remount,rw /"
#mount to /mnt/flash
#ACTION=="add", RUN+="/bin/mkdir -p /mnt/flash"
#ACTION=="add", RUN+="/bin/mount -t vfat -o dmask=000,fmask=111 /dev/%k /mnt/flash"
ACTION=="add", RUN+="/root/test_run.sh", OPTIONS="last_rule"
#clean up after removal
#ACTION=="remove", RUN+="/bin/umount -l /mnt/flash"
#label for goto end
LABEL="usb-automount-end"
이것은 /root/test_run.sh입니다:
#!/bin/bash -x
logger "running mount"
mount | logger
logger "remounting root"
mount -o remount,rw / 2>&1 | logger
logger "remount done"
mount | logger
logger "Running script. Adding dir"
mkdir -p /mnt/flash2 2>&1 | logger
logger "Directory added... mounting."
mount -t vfat -o dmask=000,fmask=111 /dev/sdb1 /mnt/flash2 2>&1 | logger
logger "Mounted"
mount | logger
logger "Sleeping 5 then re-checking"
sleep 5
mount | logger
편집 1:SELinux를 비활성화하면 문제 #1이 해결됩니다. 그러나 여전히 udev 이후에 /dev/sdb1을 마운트된 상태로 유지할 수 없습니다. udev 컨텍스트에서 유지 관리되는 거의 두 번째 마운트 테이블이 있는 것 같습니다.
답변1
질문 1SELinux로 인해 발생합니다. 내 시스템에서는 이 기능이 필요하지 않으므로 비활성화하기만 하면 됩니다.
질문 #2이는 udev 네임스페이스가 설치 플래그의 "슬레이브" 복사본을 유지하도록 하는 udev 설정(systemd 스크립트에 지정됨)으로 인해 발생합니다. "공유"로 변경하면 문제가 해결되었습니다. 여기에서 더 자세한 답변을 확인하세요.https://unix.stackexchange.com/a/154318/41988