继续在Linux中自动挂载插入的设备,这让事情变得有些简单。运行 Gentoo 时,我使用 autofs-5.0.4-r5 在笔记本电脑上自动挂载本地设备和网络设备的组合。单独执行 autofs 会给我带来一些困扰:
- 我必须为每个设备的安装点预定义名称,但有时在重新启动我的 MMC 读卡器后,我的可启动 USB 记忆棒会切换位置
- 我希望出现基于 LABEL 的自动挂载点,仅 autofs AFAIK 无法做到这一点
这正是 udev 和 udisks 确实能够做到的。但:
- 我不希望在插入设备时自动挂载文件系统,只需给我名为 LABEL 的幽灵挂载点
实际的文件系统挂载应该仅在第一次访问挂载点时发生,就像 autofs 重影工作一样。这应该可以降低因意外拔出设备而弄脏文件系统的风险,同时仍然提供良好的可访问性。
除此之外,我可以随时了解我的 DE 中正在发生的事情。
- 是否有一个系统托盘应用程序能够指示所有自动挂载的状态,即绿色=未安装任何内容,红色=已安装某些内容?
- 是否有一种与发行版无关的方法来提供文件系统(卸载)挂载操作通知,例如使用通知发送? Gentoo 特定的怎么样,这对我也有用。编写 udev 脚本对 NFS 和 CIFS 没有帮助,对吗?
这个组合应该是最终的自动安装设置,或者我错过了什么?
答案1
这都是可行的udev
。看一下城市空中交通管理局,这似乎解决了您提到的大部分问题,但实际上做自动挂载。如果您愿意,您可以利用它提供的强大功能,但对其进行修改以使媒体不会自动安装。您还可以联系作者并建议您的非自动安装方法作为新功能。同时,简要介绍一下它的功能:
- 它在 之上工作
udev
,使其独立于 DE 且基于事件。 (它还建议了一种可能无法被 发现的光学介质的解决方法udev
。) - 允许您定义
MOUNTPOINT_TEMPLATES
可以通过多种自定义方式解决您提到的命名问题(请参阅uam配置文件),也可能使用LABEL
(如您所愿) - 支持通知机制,您只需根据您的 DE 特定需求进行调整即可。
- 它似乎有一个清晰的设计,让你轻松定位每个动作的触发地点、时间和方式。
答案2
这是我最近的做法,我现在对这种方法非常满意。这是针对 Ubuntu 12.04 + gentoo 的,但我想任何允许安装 udev 和 autofs 的发行版都应该可以工作。
先决条件:您必须安装 udev + autofs。
步骤1)
创建以下“/etc/udev/rules.d/90-usbsd-auto.rules”文件(当然,您可以使用任何名称,只要它以“.rules”结尾即可)。 :
# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9]
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660", \
RUN+="/bin/rm /media/usb/%k", \
RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"
# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"
# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
RUN+="/bin/rm /media/usb/%k"
这是做什么的:它创建两个符号链接,一个用于“/dev/usbdisks/<...>”下的 USB 存储设备分区。如果没有标签,它将使用 USB 存储分区的标签或内核名称。第二个符号链接将从“/media/usb/<...>”链接到“/media/autousb/<...>”,这是为了自动安装程序支持(请参阅步骤 2)。
注意:我最初没有将规则与 ID_FS_LABEL_ENC 变量一起使用,因为我认为这很危险。如果插入两个使用相同标签的 U 盘会发生什么情况?
但发帖者特意想使用U盘的标签,所以我相应修改了规则。
为了确保 udev 读取这些规则,请使用
sudo udevadm control --reload-rules
使用此 udev 规则文件,一切都已设置为自动挂载 USB 存储设备分区。但请注意,现在该设备不会(故意)自动安装。一旦您使用它,它将自动安装
第2步)
将 autofs 设置为 automount /media/autousb/<...> :我将以下行添加到我的“/etc/auto.master”文件中(对于 Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
这意味着 AutoFS 将在 60 秒不活动后卸载设备。您可能需要少用或多用,具体取决于您的口味。
对于 Gentoo,你必须修改“/etc/autofs/auto.master”,这样使用才有意义
/media/autousb /etc/autofs/auto.usb --timeout=60
现在我创建了“auto.usb”,内容如下:
#!/bin/bash
key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
exit 0
fi
exit 1
此 auto.usb 需要可执行,以便 autofs 将其用作(bash)脚本。例如
sudo chmod 0755 /etc/auto.usb
这是做什么的:这个脚本将告诉 AutoFS (/usr/sbin/automount) 如何挂载 USB 存储设备分区。
该脚本将首先使用“/sbin/blkid”来查找分区上的文件系统类型。
然后,该脚本将根据设备分区提供正确的安装选项。
注意:我包含了“vfat”(可能最常见的 USB 记忆棒)、“ntfs”和“xfs”文件系统的示例代码。当然,扩展它以支持更多文件系统是很容易的。
步骤 3) 可选...要“弹出”==卸载您的 USB 记忆棒(或 USB 记忆棒上的分区),请在 /sbin/usbeject 下创建一个脚本:
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
通过此脚本,您可以使用“sudo usbeject”卸载所有已安装的 USB 设备分区(通过告诉 automount 卸载它们)。
当然,您可以简单地确保该分区没有在任何地方使用;自动挂载程序将在 60 秒超时后卸载分区...
这里真正的技巧是使用从“/media/usb”到“/media/autousb”的符号链接:
- “/media/usb”符号链接将由 udev 创建,为用户提供简单的概述,其中有哪些 USB 存储设备分区
- 如果您通过 /media/usb 使用分区,AutoFS 将按需自动挂载该分区
- 使用脚本化的“auto.usb”文件,您可以支持任何类型的文件系统,此外您还可以支持任何类型的命名方案。
- 此方法支持具有多个分区的 USB 记忆棒,即使这些分区使用不同的文件系统类型。