如何在插入可移动媒体时自动将其挂载在 /media/ 中,而无需任何桌面环境?

如何在插入可移动媒体时自动将其挂载在 /media/ 中,而无需任何桌面环境?

我有一个 Debian sid 系统(Wheezy)(对于 arch 也有同样的问题),没有任何桌面环境(并且根本没有 Xorg)。

我可以使用 mount/umount 手动安装我的 SD 卡、USB 记忆棒、外部硬盘,并输入合适的条目,/etc/fstab但这是强制性的,而且有限制:如果我想将它们安装在/media/<LABEL>每个设备上,则<LABEL>需要不同的条目,并且每个<LABEL>目录也需要手动创建/删除/media/

那么,在插入时自动安装它们的最佳方法是什么/media/<LABEL>(并且在拔出它们时立即从文件系统中卸载它们)?

理想的解决方案是:

  1. 检测何时插入可移动媒体(/dev/作为 sdax、、sdbx... 由添加udev
  2. /media/根据其标签(可移动媒体的标签)创建目录
  3. 以 RW 模式将其挂载到目录中/media/<LABEL>(如果它的文件系统受支持)
  4. 检测媒体是否已被拔出
  5. 如果是的话,将其从文件系统中卸载
  6. 从中删除相应的目录/media/

(显然,设备应该以同步模式安装,以避免由于缓存而导致热拔插时的数据丢失)

我找到了有关autofs、、、等HAL的一些信息,但不清楚哪一个是弃用或首选,而且无论如何,到目前为止,我还没有弄清楚如何在我的系统上轻松地配置它们来做到这一点......udisksudisks2

简约、优雅、KISS、*nix 思维、没有疯狂难以忍受的 XML 策略文件,并且最新且受到高度赞赏。

编辑:试图让我的问题更清楚

答案1

好的,已经过去很长时间了,但我仍然会用我目前找到的最佳选择来回答我的问题。

最好的方法是创建一个udev规则,与一些脚本(将创建/删除目录和挂载/卸载可移动设备)关联,并附加到partition udev设备事件类型。

1 - 创建添加/删除脚本

storage-automount.sh添加此脚本/lib/udev/并将其设置为可执行文件(sudo chmod +x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve its gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

storage-autounmount.sh添加此脚本/lib/udev/并将其设置为可执行文件(sudo chmod +x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - 创建udev规则以将这些脚本附加到事件

最后,udev在中添加一条规则/etc/udev/rules.d,例如85-storage-automount.rules

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

就是这样。

现在,当您插入存储设备时,将根据分区名称创建一个目录/media/(我不记得了,但我认为它也适用于 NTFS 分区),并将您的分区安装到该目录中。如果您plugdev的系统上有组,则它对用户是可读/可写的。此外,设备以同步模式安装,以限制热拔出时数据丢失的风险。

当设备被移除时,它将被卸载并且目录也将从中删除/media

此外,监控事件的工具udevudevadm monitor,带有以下--env选项--property

$ udevadm monitor --env

这在 Debian 和 Arch 上都经过测试并且运行良好,但可能适用于依赖于的所有发行版udev

答案2

您可能希望/dev/disk/by-uuid在插入这些特定驱动器时检查您的目录。使用ls -l它将显示设备(例如/dev/sdb1)及其 uuid。找到匹配项后,/etc/fstab相应地更新您的,/dev/sd*用相应的/dev/disk/by-uuid/*条目替换。

有关详细信息,请参阅我的回答如何防止 USB 闪存驱动器从睡眠状态唤醒后获取新的 Linux 设备名称?

答案3

谢谢你的提示。我简化了你的挂载和卸载脚本,如下所示:

山:

#!/bin/sh

udisks --mount $DEVNAME

卸载:

#!/bin/sh

udisks --unmount $DEVNAME

我的 /etc/udev/rules.d/ 文件如下所示:

# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto",       ENV{UDISKS_FILESYSTEM_SHARED}="1"
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh",     ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

它很简单并且应该是一个典型的用例。

相关内容