2017-07-19 79 views
2

我目前正试图挂载任何连接到我的电脑的usb驱动automaticaly。 我的目标是安装usb设备,如果他们有一个或uuid,如果他们没有。从udev规则和shell脚本自动挂载usb驱动器

要做到这一点我写/etc/udev/rules.d/10-usb-detect.rules udev规则:

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

该脚本每次呼吁块子系统add事件追加。

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 

我试着用/媒体/ USB /测试不存在的,我有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 

的/ dev/SDC1没有被安装,即使安装返回0

我精确,当我从命令行挂载文件系统,绝对没有问题,并且文件系统按照它应该安装。

有人对我如何调试这件事有线索吗?

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

回答

2

我想我发现了这个问题。 显然,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 

但是这个解决方案,我的系统是无法再启动。

有人知道我该如何执行根用户空间中的脚本或与用户共享安装点?

PS:我精确我运行一个64位的Debian 9

解决编辑:最后文件被位于/lib/systemd/system/systemd-udevd.service。我复制它在/etc/systemd/system/systemd-udevd.service 和改变MountFlags=slaveMountFlags=shared,现在,它的作品完美:)

0

如果通过将-t FILESYSTEMTYPE参数添加到命令来指定文件系统类型,那么可能会更好地解决系统类型问题。 mount -t FILESYSTEMTYPE /device_name /mount_point

还尝试更改记录事件的方式,使用exec命令记录信息,无需每次都重定向输出命令。 exec > $LOG_FILE 2>&1

也可以用你

mount -t vfat $DEVNAME /media/usb/test 
if [ $? -eq 0 ]; then 
echo " $DEVNAME Mounted" 
else 
echo " $DEVNAME not Mounted" 
fi 

更换

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 

我不知道为什么设备没有被安装,即使你是成功的退出状态。只是试图优化代码来解决实际问题。

+0

嗨, 它没有使用-t类型选项改变任何东西。 无论如何,感谢您的推荐,我不知道这个技巧来记录脚本输出;) – Arkaik

+0

我做到了,但没有任何改变。 “-eq”比“==”好吗? 我还添加了-v选项来挂载命令,它说:mount:/ dev/sdj1挂载在/ media/usb/test上。 此外,每当usb密钥再次插入时,/ dev/sdx字母会递增,我认为它不应该是因为它们没有以前面的字母装入 – Arkaik

+0

-eq用于数字比较。看起来很奇怪。我也在同样的几个月前,并没有面临任何问题。最令人惊讶的部分是为什么你的设备没有被安装 - 尽管mount命令返回0. 你能重新启动系统并再次尝试它并在这里发布日志。否则看起来你需要在这方面的专家建议。 – user7345878