自动挂载U盘(无头电脑)

Bas*_*asj 2 usb udev mount fstab usb-drive

对于SamplerBox项目,到目前为止,我使用的/dev/sda1 /media auto nofail 0 0是在插入无头计算机时自动安装 USB 闪存驱动器,另请参阅使用 /etc/fstab 自动安装和自动重新安装。但这似乎不太可靠,例如,当 USB 闪存驱动器被移除然后重新插入时。

Debian 中有/dev/sd*/media/哪些轻量级且易于配置的解决方案可以自动安装每个设备

  • 如果插入第二个闪存驱动器,请忽略或安装到另一个文件夹/media2/

  • 如果驱动器被移除(即使没有正确的驱动器umount),然后在几分钟后重新插入,则应再次安装它

该用例是一个无头设备,最终用户可以在其上插入 USB 闪存驱动器,并且它应该始终被识别(无论他们是否在未经软件许可的情况下删除了以前的 USB 闪存驱动器)。

Bas*_*asj 5

根据 @FelixJN 的评论,我根据我的需要稍微修改了Andrea Fortuna 的这篇优秀指南,以下是解决方案:

  1. 创建一个/root/usb-mount.sh包含此内容的文件(并添加 +x 权限):

    #!/bin/bash
    ACTION=$1
    DEVBASE=$2
    DEVICE="/dev/${DEVBASE}"
    MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')  # See if this drive is already mounted
    case "${ACTION}" in
        add)
            if [[ -n ${MOUNT_POINT} ]]; then exit 1; fi          # Already mounted, exit
            eval $(/sbin/blkid -o udev ${DEVICE})                # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
            OPTS="rw,relatime"                                   # Global mount options
            if [[ ${ID_FS_TYPE} == "vfat" ]]; then OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"; fi     # File system type specific mount options
            if ! /bin/mount -o ${OPTS} ${DEVICE} /media/; then exit 1; fi          # Error during mount process: cleanup mountpoint
            ;;
        remove)
            if [[ -n ${MOUNT_POINT} ]]; then /bin/umount -l ${DEVICE}; fi
            ;;
    esac
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个/etc/systemd/system/usb-mount@.service包含以下内容的文件:

    [Unit]
    Description=Mount USB Drive on %i
    
    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/root/usb-mount.sh add %i
    ExecStop=/root/usb-mount.sh remove %i
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个/etc/udev/rules.d/99-local.rules包含以下内容的文件:

    KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
    KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重新启动规则:

     udevadm control --reload-rules
     systemctl daemon-reload
    
    Run Code Online (Sandbox Code Playgroud)
  5. 插入 USB 闪存驱动器。它应该安装到/media/.