标签:usb-drive linux shell mount udev
我正在尝试自动安装连接到我的电脑的任何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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。