编辑:

编辑:

听起来很奇怪,我有一个 shell 脚本,它是通过它触发的udev规则,将连接的 USB 设备挂载到系统文件树。该脚本在 USB 设备连接到系统时运行,因此规则似乎没有问题。我通过系统日志监控脚本的进度,它也进展顺利,甚至挂载命令返回零,它说:

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

但最后设备没有安装,它没有列出来/etc/mtab - /proc/mounts - findmnt - 挂载。如果我跑卸载在设备上,它还说该设备未安装。

但是,如果我从终端以 root 身份手动运行脚本,那么它会完美运行并且设备会挂载,但当它运行时则不会乌德夫

我在脚本开头添加了 8 秒睡眠时间,以确保这不是计时问题,并且还从规则文件名中删除了数字以确保乌德夫德会将新规则放在规则队列的底部,脚本将在其他系统规则之后运行,但没有成功。

系统日志:

(在连接设备之后)

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-自动挂载.sh

该脚本由 udev 规则中定义的另一个脚本开始。它如此直,使得挂载点目录并使用其文件系统类型和一些常规选项将 USB 设备安装到安装点。我在 mount 命令中添加了“-v”选项以使其更加详细,并将所有输出重定向到系统日志,这样我就可以看到它是如何运行的,但它并没有说太多。

#!/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 的系统上,当您重新格式化分区并尝试重新安装它时,可能会遇到此问题。

我将磁盘从加密移至未加密,导致 systemd 生成的mnt-disk.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 的手册页中有详细信息。其他 shell 可能有类似的东西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并替换MountFlags=slaveMountFlags=shared.[3] 请记住,但这udev并不是为了调用长时间运行的进程。

解决方案:

我复制/usr/lib/systemd/system/systemd-udevd.service到该/etc/systemd/sytem/目录并替换MountFlags=slaveMountFlags=shared.然后重新启动系统,现在一切正常。

相关内容