ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-08-23 18:01:27  阅读:261  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有