我有一个 Debian sid 系统(Wheezy)(对于 arch 也有同样的问题),没有任何桌面环境(并且根本没有 Xorg)。
我可以使用 mount/umount 手动安装我的 SD 卡、USB 记忆棒、外部硬盘,并输入合适的条目,/etc/fstab
但这是强制性的,而且有限制:如果我想将它们安装在/media/<LABEL>
每个设备上,则<LABEL>
需要不同的条目,并且每个<LABEL>
目录也需要手动创建/删除/media/
。
那么,在插入时自动安装它们的最佳方法是什么/media/<LABEL>
(并且在拔出它们时立即从文件系统中卸载它们)?
理想的解决方案是:
- 检测何时插入可移动媒体(
/dev/
作为sdax
、、sdbx
... 由添加udev
) /media/
根据其标签(可移动媒体的标签)创建目录- 以 RW 模式将其挂载到目录中
/media/<LABEL>
(如果它的文件系统受支持) - 检测媒体是否已被拔出
- 如果是的话,将其从文件系统中卸载
- 从中删除相应的目录
/media/
(显然,设备应该以同步模式安装,以避免由于缓存而导致热拔插时的数据丢失)
我找到了有关autofs
、、、等HAL
的一些信息,但不清楚哪一个是弃用或首选,而且无论如何,到目前为止,我还没有弄清楚如何在我的系统上轻松地配置它们来做到这一点......udisks
udisks2
简约、优雅、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
。
此外,监控事件的工具udev
是udevadm 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"
它很简单并且应该是一个典型的用例。