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

ced*_*beu 17 automounting mount

我有一个 Debian sid 系统(Wheezy)(和 arch 相同),没有任何桌面环境(根本没有 Xorg)。

我可以通过标签/media/手动将我的 SD 卡、USB 记忆棒、外部硬盘安装到指定的目录中,使用mount/umount并在/etc/fstab.如果我希望将它们安装在 . 中/media/<LABEL>,则具有不同的每个设备都<LABEL>需要自己的条目,并且还<LABEL>需要手动创建/删除每个子目录/media/)。

那么,什么是安装它们的最好方式自动/media/<LABEL> 在插入(并尽快从文件系统中卸载它们,因为它们已被拔掉,不管它是如何将数据风险)?

理想的解决方案是:

  1. 检测何时插入可移动媒体(即当添加/dev/sdax, sdbx, ... by 时udev
  2. /media/根据它的标签(可移动媒体的标签)创建一个目录
  3. 使用选项(对于 a )/media/<LABEL>RW模式(如果文件系统支持该模式)将其安装在目录中flushvfat
  4. 检测媒体是否已拔下
  5. 如果是这样,请从文件系统中卸载它
  6. 删除对应的目录 /media/

(该设备应安装在同步模式oviously,以避免任何数据丢失时热拔,因为缓存的编辑 sync太多的vfat可移动媒体这样flush 已创建了妥协,不太安全比sync照命,但风险较小- 闪存周期)

我发现的一些信息autofsHALudisksudisks2usbmount等,但目前还不清楚哪一个是过时或首选,反正我还没有想出如何将它们轻松地在我的系统做的配置,到现在为止...

Gil*_*il' 10

我想你正在寻找pmount.

如果您想在插入时自动挂载,请参阅在 Debian 上自动挂载USB 记忆棒

如果您的系统使用udisks2,这是对插入可移动存储设备做出反应的首选方式。有关Udisk 的配置提示,请参阅Arch Wiki

否则,出现新设备时做出反应的程序是udev,因此自动挂载由udev 规则触发。该usbmount包提供udev规则来自动挂载USB存储设备和其他几个人。mount从 udev 规则调用不适用于 FUSE 文件系统(例如 ntfs-3g),因此如果需要,请使用 udisks。

当媒体被移除时,您无法自动卸载它们,因为因果关系不会以这种方式起作用。移除媒体之前,必须先将其卸载。对于只读媒体,您可以在移除后卸载,但如果某些应用程序在突然消失的文件系统上打开了文件,这可能会使它们感到困惑。对于可写媒体,如果您拔下已挂载的文件系统,则数据可能会损坏。


ced*_*beu 2

好吧,已经过去很长时间了,但我仍然会用我目前找到的最佳选择来回答我的问题。总结一下:创建一个udev规则,与一些脚本关联(将创建/删除目录和卸载/安装可移动设备),并附加到udev设备事件 type= partition

1 - 创建添加/删除脚本

将以下脚本保存storage-automount.sh/lib/udev/并使其可执行(sudo chmod a+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 it's 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
Run Code Online (Sandbox Code Playgroud)

将以下脚本保存storage-autounmount.sh/lib/udev/并使其可执行(sudo chmod a+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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

并使其具有与该目录/文件夹中的其他规则相同的权限

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

当设备被删除时,它被卸载并且目录被删除/media

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

$ udevadm monitor --env
Run Code Online (Sandbox Code Playgroud)

这已经在 debian 和 arch 上经过测试并运行良好,但可能适用于所有依赖udev.