Linux上完整的自动挂载解决方案所需的udev,udisk,autofs和通知设置的建议


9

继续在Linux中自动挂接已插入的设备,这使事情变得有些基础。运行Gentoo,我正在使用autofs-5.0.4-r5在笔记本电脑上自动挂载本地和网络设备的组合。一个人做autofs会让我有些困惑:

  • 我必须为每个设备的挂载点预定义名称,但是有时在重新启动MMC读卡器后会用可引导的USB棒切换位置
  • 我希望基于自动LABEL的挂载点出现,仅autofs AFAIK无法做到这一点

udev和udisk当然可以做到这一点。但:

  • 我不希望在插入设备时自动挂载文件系统,只是给我一个名为LABEL的幻影挂载点

实际的文件系统挂载仅应在首次访问该挂载点时进行,就像autofs重影一样。通过意外拔出设备,这将降低弄脏文件系统的风险,同时仍提供出色的可访问性。

最重要的是,我可以随时使用DE中的信息进行了解。

  • 是否有一个系统托盘应用程序能够指示所有自动安装的状态,即绿色=未安装任何东西,红色=已安装了某些东西?
  • 是否有一种与分发无关的方法来提供文件系统(卸载)操作通知,例如使用notify-send?那特定于Ge​​ntoo的东西对我也适用。udev脚本对NFS和CIFS没有帮助,对吗?

该组合应该是最终的自动安装设置,还是我错过了什么?


我过去几年来一直在Gnome任职,所以不再需要自己动手了。
lkraav

Answers:


4

这一切都是可行的udev。看一下UAM,它似乎可以解决您提到的大多数问题,但实际上确实可以自动安装。如果愿意,可以利用它提供的强大功能,但可以对其进行修改,以免自动装入介质。您也可以联系作者,并建议您将非自动安装方法作为一项新功能。同时,简要了解其功能:

  • 它在之上运行udev,使其与DE无关且基于事件。(这还建议了一种可能不会被发现的光学介质的解决方法udev。)
  • 让您定义MOUNTPOINT_TEMPLATES可以解决您以多种自定义方式提及的命名问题(请参见uam.conf),还可以使用LABEL根据需要
  • 支持通知机制,您只需要调整它们以适应特定于DE的需求。
  • 它似乎具有清晰的设计,可让您轻松找到触发每个动作的位置,时间和方式。

今天,我被称为tinymount上#awesome,有兴趣这个主题或许应该检查出来
lkraav

同时,我主要使用bashmount。
lkraav

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变量一起使用,因为我认为这很危险。如果插入两个使用相同标签的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记忆棒。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.