系统相关
首页 > 系统相关> > linux – 从udev规则和shell脚本自动挂载usb驱动器

linux – 从udev规则和shell脚本自动挂载usb驱动器

作者:互联网

我正在尝试自动安装连接到我的电脑的任何USB驱动器.
我的目标是使用标签安装usb设备(如果有的话),如果没有,则使用uuid.

为此,我在/etc/udev/rules.d/10-usb-detect.rules中写了一个udev规则:

ACTION=="add", KERNEL=="sd?[0-9]", SUBSYSTEM=="block", RUN+="/usr/local/bin/add.sh"

每次在块子系统上追加添加事件时,都会调用该脚本.

udev规则工作正常但是当我尝试从脚本安装文件系统时它不起作用.
奇怪的是脚本中的mount命令总是返回$?= 0,所以逻辑上应该挂载文件系统,但事实并非如此.

这是我的脚本:

#!/bin/bash

LOG_FILE=<path_to_file>

echo "New usb device detected at $DEVNAME" >> $LOG_FILE

echo "mount $DEVNAME /media/usb/test" >> $LOG_FILE

mount $DEVNAME /media/usb/test &>> $LOG_FILE

ret=$?
echo "$ret" >> $LOG_FILE

if [ $ret == "0" ]; then
    echo "$DEVNAME mounted at /media/usb/test"  >> $LOG_FILE
else
    echo "Failed to mount $DEVNAME at /media/usb/test"  >> $LOG_FILE
fi

echo "" >> $LOG_FILE

我试过/ media / usb / test不存在,我从mount命令得到了预期的错误.
但是当文件夹存在时,即使未安装文件系统,mount命令也会返回0.

这是日志文件的输出:

New usb device detected at /dev/sdc1
mount /dev/sdc1 /media/usb/test
mount: mount point /media/usb/test does not exist
32
Failed to mount /dev/sdc1 at /media/usb/test

New usb device detected at /dev/sdc1
mount /dev/sdc1 /media/usb/test
0
/dev/sdc1 mounted at /media/usb/test

即使mount返回0,也不会挂载/ dev / sdc1.

我确切地说,当我从命令行挂载文件系统时,绝对没有问题,文件系统按原样安装.

有人知道如何调试这个吗?

我认为问题是因为脚本是从udev调用的,因为如果我从命令行调用它也可以.

解决方法:

我想我发现了这个问题.
显然,udev使用特定的命名空间,实际上我可以通过打印/ proc /< daemon_pid> / mountinfo的内容来查看挂载点,其中是systemd-udevd服务的pid.

$cat /proc/240/mountinfo
[...]
228 43 8:17 / /media/usb/test rw,relatime - vfat /dev/sdb1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro

$df
Sys. de fichiers blocs de 1K  Utilisé Disponible Uti% Monté sur
udev                 1975740        0    1975740   0% /dev
tmpfs                 397376     5916     391460   2% /run
/dev/sda2           75733088 69473400    2389532  97% /
tmpfs                1986868   111860    1875008   6% /dev/shm
tmpfs                   5120        4       5116   1% /run/lock
tmpfs                1986868        0    1986868   0% /sys/fs/cgroup
tmpfs                 397372       28     397344   1% /run/user/112
tmpfs                 397372       24     397348   1% /run/user/1001

所以解决方案应该是强制udev在root用户空间中执行脚本.
我尝试了我在这里找到的解决方案https://unix.stackexchange.com/questions/330094/udev-rule-to-mount-disk-does-not-work

但是,我的系统没有/usr/lib/systemd/system/systemd-udevd.service文件.我创建了一个包含内容的文件/etc/systemd/system/systemd-udevd.service

MountFlags=shared 

但是使用这个解决方案,我的系统无法再启动了.

有人知道如何在root用户空间中执行脚本或与用户共享挂载点吗?

PS:我确切地说我正在运行64位Debian 9

解决编辑:最后文件位于/lib/systemd/system/systemd-udevd.service.我在/etc/systemd/system/systemd-udevd.service中复制了它
并将MountFlags = slave更改为MountFlags = shared,现在它完美运行:)

标签:usb-drive,linux,shell,mount,udev
来源: https://codeday.me/bug/20190823/1699664.html