ced*_*beu 8 linux automount hotplug removable-media
我有一个 Debian sid 系统(Wheezy)(对于 arch 也有同样的问题),没有任何桌面环境(根本没有 Xorg)。
我可以使用 mount / umount 手动挂载我的 SD 卡、USB 记忆棒、外部硬盘驱动器,其中包含合适的条目,/etc/fstab但这很有吸引力,并且具有限制性:如果我希望将它们安装在/media/<LABEL>具有不同<LABEL>需求的每个设备中,则需要自己的条目,并且每个<LABEL>目录也需要手动创建/删除/media/)。
那么,/media/<LABEL>在插入时自动挂载它们的最佳方法是什么(并在拔出它们后立即从文件系统中卸载它们)?
理想的解决方案是:
/dev/为
sdax, sdbx, ... by udev)/media/根据它的标签(可移动媒体的标签)创建一个目录/media/<LABEL>以 RW 模式将其挂载到目录中(如果它的文件系统受支持)/media/(设备应以同步方式挂载,以免热拔时因缓存丢失数据)
我找到了一些关于autofs, HAL, udisks,udisks2等的信息,但不清楚哪个是弃用的或首选的,无论如何,我还没有想出如何在我的系统上轻松配置它们来做到这一点,直到现在......
极简主义、优雅、KISS、*nix 思想、没有疯狂的令人难以忍受的 XML 策略文件,以及最新的高度赞赏。
编辑:试图让我的问题更清楚
好吧,已经过去很长时间了,但我仍然会用我目前找到的最佳选择来回答我的问题。
最好的方法是创建一个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
Run Code Online (Sandbox Code Playgroud)
添加此脚本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
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.
此外,监视事件的工具udev是udevadm monitor,具有以下选项:--env或--property:
$ udevadm monitor --env
Run Code Online (Sandbox Code Playgroud)
这已经在 Debian 和 Arch 上经过测试并运行良好,但可能适用于所有依赖udev.
| 归档时间: |
|
| 查看次数: |
9272 次 |
| 最近记录: |