这是我最近的操作方式,现在我对这种方法感到非常满意。这是针对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变量一起使用,因为我认为这很危险。如果插入两个使用相同标签的USB记忆棒会怎样?
但是发帖人特别想使用USB磁盘的标签,因此我相应地修改了规则。
为了确保udev读取这些规则,请使用
sudo udevadm control --reload-rules
使用此udev规则文件,所有内容均已设置为自动挂载USB存储设备分区。请注意,虽然现在不会自动安装设备(有意)。一旦与
第2步)
设置autofs以自动挂载/ media / autousb / <...>:我在“ /etc/auto.master”文件中添加了以下行(对于Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
这意味着60秒钟不活动后,AutoFS将卸载设备。您可能要根据自己的口味少用或多用。
对于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记忆棒。