代码之家  ›  专栏  ›  技术社区  ›  Arkaik zx81

从udev规则和shell脚本自动安装usb驱动器

  •  4
  • Arkaik zx81  · 技术社区  · 7 年前

    我目前正在尝试安装任何连接到我的电脑自动usb驱动器。 我的目标是安装带有标签的usb设备(如果有),或者安装没有uuid的usb设备。

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

    奇怪的是,脚本中的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
    

    但当文件夹存在时,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。

    我精确地说,当我从命令行装载文件系统时,绝对没有问题,文件系统按其应该的方式装载。

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   Arkaik zx81    7 年前

    我想我发现了问题所在。 /proc/<daemon_pid>/mountinfo

    $ 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在根用户空间中执行脚本。 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 .我复制了它 并且改变了 MountFlags=slave MountFlags=shared 现在它工作得很好:)

        2
  •  1
  •   user7345878    7 年前

    mount -t FILESYSTEMTYPE /device_name /mount_point .

    exec > $LOG_FILE 2>&1

    也可以更换

    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
    

    具有

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

        3
  •  1
  •   louigi600    3 年前

    我希望我的Raspberrypi Pico微控制器板能够自动安装和卸载,这与最初的问题类似,因为当您插入引导按钮时,按下引导按钮时,RPi Pico被识别为usb存储。

    root@darkstar:/lib/udev/rules.d# cat 10-usb-storage.rules
    ACTION=="add", KERNEL=="sd?[0-9]", SUBSYSTEM=="block", RUN+="usb_automount"
    ACTION=="remove", KERNEL=="sd?[0-9]", SUBSYSTEM=="block", RUN+="usb_automount"
    root@darkstar:/lib/udev/rules.d#
    

    这是一个助手脚本,名为:

    root@darkstar:/lib/udev/rules.d# cat /lib/udev/usb_automount
    #!/bin/bash 
    #this will automatically mount and umount th RPi Pico on /mnt/pico
    Name=$(basename $0)
    Logger="/usr/bin/logger -p local3.info -t $Name "
    #logger -p local3.info -t aoutomount -- testing
    Message="$* $DEVNAME $ACTION $ID_FS_LABEL"
    $Logger <<< $Message
    
    pico_add ()
    { Message="automounting  $DEVNAME $ID_FS_LABEL"
      $Logger <<< $Message
      /sbin/mount $DEVNAME /mnt/pico && $Logger <<< "mounted" || $Logger <<< "failed"
    }
    
    pico_remove ()
    { Message="umounting  $DEVNAME $ID_FS_LABEL"
      $Logger <<< $Message
      /sbin/umount -f /mnt/pico && $Logger <<< "umounted" || $LOGGER "failed"
    }
    
    case $ID_FS_LABEL in
      RPI-RP2) pico_$ACTION ;;
      *) $Logger <<< "$ID_FS_LABEL is not configured for any automatic action"
    esac
    root@darkstar:/lib/udev/rules.d#
    

    要重新加载udev规则: https://unix.stackexchange.com/questions/39370/how-to-reload-udev-rules-without-reboot/39371

    udevadm control --reload-rules && udevadm trigger