편집하다:

편집하다:

이상하게 들리겠지만 다음을 통해 실행되는 쉘 스크립트가 있습니다.udev 규칙, 연결된 USB 장치를 시스템 파일 트리에 마운트합니다. USB 장치가 시스템에 연결되면 스크립트가 실행되므로 규칙이 양호한 것으로 보입니다. syslog를 통해 스크립트의 진행 상황을 모니터링하며 원활하게 진행됩니다.마운트 명령0을 반환하면 다음과 같이 표시됩니다.

 root[1023]: mount: /dev/sda1 mounted on /media/partitionlabel.

하지만 결국 장치가 설치되지 않고 나열되지 않습니다./etc/mtab - /proc/mounts - findmnt - 마운트. 내가 달리면제거장치에는 장치가 설치되지 않았다는 메시지도 표시됩니다.

그러나 터미널에서 루트로 스크립트를 수동으로 실행하면 완벽하게 실행되고 장치가 마운트되지만 실행될 때 그렇지 않습니다.우데브.

이것이 타이밍 문제가 아닌지 확인하기 위해 스크립트 시작 부분에 8초의 절전 시간을 추가했으며 규칙 파일 이름에서 숫자를 제거하여 이를 보장했습니다.Udevd규칙 대기열의 맨 아래에 새 규칙을 배치하고 스크립트는 성공하지 못한 채 다른 시스템 규칙 이후에 실행됩니다.

시스템 로그:

(기기 연결 후)

kernel: usb 1-1.2: new high-speed USB device number 12 using dwc_otg
kernel: usb 1-1.2: New USB device found, idVendor=058f, idProduct=6387
kernel: usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-1.2: Product: Mass Storage
kernel: usb 1-1.2: Manufacturer: Generic
kernel: usb 1-1.2: SerialNumber: 24DCF568
kernel: usb-storage 1-1.2:1.0: USB Mass Storage device detected
kernel: scsi host6: usb-storage 1-1.2:1.0
kernel: scsi 6:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
kernel: sd 6:0:0:0: [sda] 1968128 512-byte logical blocks: (1.00 GB/961 MiB)
kernel: sd 6:0:0:0: [sda] Write Protect is off
kernel: sd 6:0:0:0: [sda] Mode Sense: 23 00 00 00
kernel: sd 6:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
kernel:  sda: sda1
kernel: sda: p1 size 1968126 extends beyond EOD, enabling native capacity
kernel:  sda: sda1
kernel: sda: p1 size 1968126 extends beyond EOD, truncated
kernel: sd 6:0:0:0: [sda] Attached SCSI removable disk
root[1004]: /usr/local/sbin/udev-auto-mount.sh - status: started to automount sda1
root[1019]: /usr/local/sbin/udev-auto-mount.sh - status: Device Label is partitionlabel and Filesystem is vfat.
root[1021]: /usr/local/sbin/udev-auto-mount.sh - status: mounting the device sda1 by filesystem vfat to /media/partitionlabel.
root[1023]: mount: /dev/sda1 mounted on /media/partitionlabel.
root[1024]: /usr/local/sbin/udev-auto-mount.sh status: mount command proceed for vfat, retval is 0
root[1025]: /usr/local/sbin/udev-auto-mount.sh - status: succeed!

구성:

/etc/udev/rules.d/local-rules:

다음에 정의된 규칙우데브예:

# /etc/udev/rules.d/local-rules
ENV{ID_BUS}=="usb",     ACTION=="add",  ENV{DEVTYPE}=="partition",      \
          RUN+="/usr/local/sbin/udev-automounter.sh %k $ENV{ID_FS_LABEL_ENC}"

udev-automount.sh

이 스크립트는 udev 규칙에 정의된 다른 스크립트에 의해 시작됩니다. 너무 직설적이어서마운트 포인트파일 시스템 유형과 일부 일반 옵션을 사용하여 USB 장치를 마운트 지점에 마운트합니다. 마운트 명령에 "-v" 옵션을 추가하여 더 장황하게 만들고 모든 출력을 syslog로 리디렉션하여 실행 방법을 확인할 수 있었지만 많은 내용은 아닙니다.

#!/bin/sh
## /usr/local/sbin/udec-auto-mount.sh
##

logger -s "$0 - status: started to automount ${1}"
DEVICE=$1
sleep 8 

#...
#...
# Checking inputs, getting filesystem type (ID_FS_TYPE), partition label
# (ID_FS_LABEL) and ...

mkdir "/media/${ID_FS_LABEL}"


logger -s "$0 - status: mounting the device ${DEVICE} by filesystem ${ID_FS_TYPE} to /media/${ID_FS_LABEL}."
case $ID_FS_TYPE in
    vfat)   mount -v -t vfat -o sync,noatime,nosuid,nodev /dev/${DEVICE} "/media/${ID_FS_LABEL}" 2>&1 | logger
        let retVal=$?
        logger -s "$0 status: mount command proceed for vfat, retval is ${retVal}"
        ;;

    *)  mount -v -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
        ;;
esac
if [ ${retVal} -eq 0 ]; then
    logger -s "$0 - status: succeed!"
    exit 0
else
    logger -s "$0 Error: unable to mount the device ${DEVICE}, retval is ${retVal}"
    rmdir "/media/${ID_FS_LABEL}"
fi

exit 0

아마도 도움이 될 것입니다:

때때로 스크립트가 USB 장치를 마운트하지 못한 후 장치를 분리하면 시스템 로그에 다음과 같은 오류가 표시됩니다.

kernel: usb 1-1.2: USB disconnect, device number 11
systemd-udevd[143]: error: /dev/sda: No such file or directory
systemd-udevd[977]: inotify_add_watch(7, /dev/sda, 10) failed: No such file or directory

편집하다:

이것은 "설치된" 버전입니다:

$ mount -V:
mount from util-linux 2.27.1 (libmount 2.27.0: assert, debug)

답변1

systemd가 설치된 시스템에서 파티션을 다시 포맷하고 다시 설치하려고 하면 이 문제가 발생할 수 있습니다.

디스크를 암호화된 상태에서 암호화되지 않은 상태로 이동하여 mnt-disksystemd에서 생성된 .mount(mnt-disk는 /etc/fstab에 대한 마운트 경로임)가 더 이상 존재하지 않는 이전 경로를 참조하게 하여 mount혼란을 야기했습니다.

그냥 하시고 systemctl daemon-reload설치하시면 됩니다.

답변2

순서

mount ... | logger
rc=$?

예상대로 작동하지 않습니다. 파이프의 반환 값은 해당 파이프의 마지막 요소의 반환 값입니다.

$> false | true; echo $?
0

Bash를 사용하는 경우 다음을 시도하십시오 PIPESTATUS.

$> false | true; echo $? ${PIPESTATUS[0]}
0 1
$> true | false; echo $? {PIPESTATUS[0]}
1 0

PIPESTATUS배열 변수입니다. 자세한 내용은 bash 매뉴얼 페이지에 있습니다. 다른 껍질에도 비슷한 것이 있을 수 있습니다.PIPESTATUS

답변3

드디어 답을 찾았다여기.

사실 문제는 systemd-udevd원래의 성공 에 있다 udev. systemd-udevd자체 루트 파일 시스템 이미지를 생성하고 "udev" 규칙이 장치를 마운트하면 다음에서 마운트되고 액세스할 수 있습니다.

/proc/{PID of systemd-udevd service}/root/{path to mount point}

그러나 기본 루트 파일 시스템에서는 표시되지 않습니다 /.

archlinux위키(여기)제안:

udev경고: 이동식 드라이브를 탑재하려면 규칙에서 탑재를 호출 하지 마세요 . FUSE 파일 시스템의 경우 전송 끝점이 연결되지 않음 오류가 발생합니다. 대신 udisks이를 사용하여 자동 마운트를 적절하게 처리하거나 udev 규칙 내에서 마운트 작업을 수행 /usr/lib/systemd/system/systemd-udevd.service하고 로 복사 하여 /etc/systemd/system/systemd-udevd.service바꿀 수 있습니다 .[3] 이는 장기 실행 프로세스를 호출하기 위한 것이 아니라는 점을 명심하십시오 .MountFlags=slaveMountFlags=sharedudev

해결책:

/usr/lib/systemd/system/systemd-udevd.service해당 디렉토리 에 복사 /etc/systemd/sytem/하고 .MountFlags=slaveMountFlags=shared

관련 정보