在启动时是否自动将外部驱动器安装到/ media / LABEL而不需要用户登录?


73

这个问题是相似的,但是与我想要的相反。我希望在启动时将外部USB驱动器自动安装,而无需任何人登录,将其安装到位置/media/<label>

我不想将所有数据都输入到fstab中,部分原因是它既乏味又烦人,但主要是因为我无法预测我将要插入的数据或分区将来会如何变化。

我希望驱动器可以被MPD之类的东西访问,并在我使用SSH登录时可用。 gnome-mount似乎只能在本地登录Gnome图形会话时挂载东西。


4
很好的问题,希望我能为您解答,现在我很好奇这是如何解决的。
反转

1
我更新了答案。
瑞安·汤普森

1
作为记录,我没有像我已经安装的Gnome那样有问题,但是最好的解决方案是无头无GUI服务器。
endlith

1
ARRRGHH ...我的答案有错误。在运行中。 /usr/local/sbin/udev-automounter.sh mount %k应该是/usr/local/sbin/udev-automounter.sh %k。抱歉。
魁北克吉ote德09年

1
好的,从Update-3开始,它可以使用空格。通过使用<LABEL>的“编码”版本将空格转换为\x20来实现。所以它不是很漂亮,但是会起作用。udev不能很好地处理带有空格的标签,但是还有另一个选择使用下划线而不是\x20s(因此至少看起来不错)。似乎必须将空间处理纳入shellscript中。
魁北克吉x德09年

Answers:


74
  • 对于Ubuntu Server 11.10的注意事项:由于过时的vol_id命令,此脚本在Ubuntu Server 11.10上失败。 vol_id已被取代blkid。要修复脚本,请在脚本中将“ vol_id”替换为“ blkid -o udev” udev-auto-mount.sh

我已经为此努力了一段时间,我想我已经找到了可行的解决方案。它是在基于Debian的系统上开发和测试的,因此应该可以在Ubuntu上运行。我将指出它所做的假设,以便它也可以适用于其他系统。

  • 它将自动在插件上安装USB驱动器,并且不需要花太多时间就可以适应Firewire。
  • 它使用UDEV,因此不会胡闹HAL / DeviceKit / GNOME-Anything。
  • 它会自动创建一个/media/LABEL目录以将设备挂载到该目录。

  • 但是,它可能会干扰其他自动安装器。我无法测试。我希望在Gnome-VFS处于活动状态的情况下,两者都可以尝试执行挂载...如果Gnome-VFS挂载失败,则可能未配置桌面图标。应该可以从Gnome卸载,但是可能需要执行gksudo类似操作。

我尚未在系统启动时对此进行测试,但是我看到它可能不起作用的唯一原因是,如果它在系统准备好挂载之前尝试挂载USB驱动器。如果是这样,您可能需要对安装脚本进行其他一些调整。(我正在与ServerFault进行检查,以查看是否有任何建议,但是在那里没有太多兴趣。)

然后,继续。


UDEV参考:


背景(UDEV?Whuzzat?)

UDEV是内核的热插拔系统。这是/dev/disk/by-label/<LABEL>在启动时以及在系统运行时自动配置正确的设备和设备符号链接(例如)的功能。

D-Bus和HAL用于将硬件事件发送到桌面环境之类的侦听器。因此,当您登录GNOME并插入CD或插入USB驱动器时,该事件遵循以下链式:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

而且,您的驱动器已安装。但是在无头系统中,我们不需要登录即可获得自动挂载的好处。

Udev规则

由于UDEV允许我们编写规则并在设备插入时运行程序,因此这是理想的选择。我们将利用Debian / Ubuntu的现有规则,让他们/dev/disk/by-label/<LABEL>为我们设置符号链接,并添加另一条规则为我们安装设备。

UDEV的规则将保存在/etc/udev/rules.d(以及/lib/udev/rules.d在Karmic上),并按数字顺序进行处理。没有编号的文件都将在编号文件之后处理。在我的系统上,HAL规则位于一个名为的文件中90-hal.rules,因此我将规则放入其中,89-local.rules以便它们在进入HAL之前得到处理。首先,您需要确保这些规则在60-persistent-storage.rules。之后发生。 local.rules可能已经足够了。

将其放入您的新规则文件中:

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • 确保在后面没有空格\,只有newline\n)。

  • 更改SUBSYSTEMS=="usb"为以SUBSYSTEMS=="usb|ieee1394"获取Firewire支持。

  • 如果您希望设备始终由特定用户拥有,请添加一个OWNER="username"子句。如果只需要特定用户拥有的文件,请调整安装脚本。

阅读规则

这会将要运行的程序添加到设备要运行的程序列表中。它通过标识USB分区设备<LABEL>,然后将此信息传递给执行安装的脚本。具体来说,此规则是匹配的:

  1. ENV{ID_FS_LABEL_ENC}=="?*"-由较早的系统规则设置的环境变量。非文件系统不存在,因此这就是我们检查它的原因。我们实际上想使用ID_FS_LABEL挂载点,但是我还没有说服UDEV为我转义它,所以我们让挂载脚本来处理它。

    此和其他环境变量由udev使用vol_id命令(不推荐使用)获得。这是一个方便的工具,用于查看分区上的详细信息:

    $ sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add"-仅匹配add事件...

  3. SUBSYSTEMS=="usb"-仅匹配USB总线上的设备。我们SUBSYSTEMS在这里使用是因为这与我们设备的父母相匹配;我们感兴趣的设备实际上是SUBSYSTEM ==“ scsi”。与父USB设备匹配可避免将我们的程序添加到内部驱动器中。

  4. RUN+="..."-不是匹配项,而是一项操作:将此程序添加到要运行的程序列表中。在程序的参数中,%k将其扩展为设备名称(例如sdc1not /dev/sdc1),并$env{FOO}获取环境变量FOO的内容。

测试规则

第一个参考链接(上面)是一个出色的UDEV教程,但是它已经过时了。它运行的用于测试您的规则的程序(udevtest尤其是)已被catch-all udevadm实用程序取代。

添加规则后,插入设备。给它几秒钟,然后检查分配给它的设备:

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

如果您的可移动驱动器包含label_Baz设备,则该驱动器在设备上sdc1。运行此命令,并查看最后的输出:

$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

RUN+=在最后几行中从我们的规则中查找脚本名称(在此示例中,脚本名称从底部第3行)。您可以看到将用于此设备的参数。您现在可以运行该命令以检查参数是否正确。如果它可以在您的命令行上运行,则在插入设备后应该会自动运行。

您还可以实时监视UDEV事件:运行sudo udevadm monitorman udevadm有关开关的详细信息,请参阅)。然后,只需插入新设备,然后观看事件滚动。(除非您真正了解低级的细节,否则可能会造成过度杀伤力。)

重新加载规则

验证规则正确读取后,您需要告诉UDEV重新加载其规则,以便新规则生效。使用以下任何一种方法(如果第一种方法不起作用,则第二种方法应...但尝试第一种方法):

  • sudo udevadm control --reload-rules

  • sudo /etc/init.d/udev reload

  • 重启


脚本!实际上,有2个脚本...


这是第一个脚本。 由于我们运行的程序需要快速完成,因此这只会在后台剥离第二个脚本。放入/usr/local/sbin/udev-automounter.sh

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

这是第二个脚本。 这样可以进行更多的输入检查。放进去/usr/local/sbin/udev-auto-mount.sh。您可能需要调整以下安装选项。现在,该脚本可以自行查找分区LABEL;UDEV仅发送DEVICE名称。

如果在启动时安装驱动器时出现问题,则可以sleep 60在此脚本中添加一段较长的时间,以便在脚本尝试安装驱动器之前给系统时间以完全启动的时间

我在评论中给出了关于如何检查(运行ps以查看Web服务器是否正在运行)的建议,但是您需要针对系统进行调整。我认为您可能要使用的大多数网络服务器都可以满足此目的-nfsd,smbd,apache等。当然,这样做的风险是,如果服务未运行,则安装脚本将失败,因此请测试特定文件的存在将是更好的解决方案。

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

超级奖金清理脚本!

还有一个脚本。所有这些操作就是卸载设备并删除安装点目录。它假定它具有privs来执行此操作,因此您需要使用来运行它sudo。现在,此脚本在命令行上获取完整的安装点,例如:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

放入/usr/local/sbin/udev-unmounter.sh

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

3
你很棒!:)
kolypto

1
如果我手动运行auto-mount.sh,它将起作用,但是如果我插入驱动器并且不在引导中,则无法运行。:/
endolith

因此问题出在UDEV规则上。lemme对该部分进行了扩展,以帮助您调试。
quack quixote 09年

3
我已经在github上汇编了所有脚本:github.com/fatso83/Code-Snippets/tree/master/system-utils/… 它们在Ubuntu 10.10上运行良好,并且还包括自动卸载
oligofren,

1
参考:udev_237-man udev(Ubuntu_18.04)请注意,由于对systemd-udevd.service实施了默认的沙箱,因此在udev规则内不允许运行访问网络或装入/卸载文件系统的程序。来源:unix.stackexchange.com/questions/200194/...解决的办法,看看serverfault.com/questions/766506/...
专业备份

9

其他人在网上建议的最后一个选择是ivman,但这似乎取决于pmount,您已经说过这是行不通的。 pmount被遗弃,ivman几乎是一样的。

的替代ivmanhalevt,并且在Karmic中可用。它是()的重新实现ivman(读:“维护”和“不依赖于pmount”)。该软件包在Jaunty上不可用,但是如果您不打算升级,则可以自行构建。

这两个工具都位于DBus和HAL层之上,并响应来自它们的事件。显然,两者都可以作为系统守护程序或用户会话安装管理器(la Gnome-VFS)运行- /etc/defaults/{ivman,halevt}文件负责系统设置。

这是一些调整ivman以使用/media/<LABEL>挂载点的说明。halevt这样做可能更简单,但也许它们会帮助您找到答案。


与HALEVT合作

更新:为了同时获得自动魔术CD支架(我的UDEV回答没有提供)的兴趣,我更深入地研究了halevt。我找到了这篇博客文章,它有助于解释很多有关该过程的信息。我确实必须halevt为Debian Lenny 编译我自己的包(幸运的是,所有依赖项都在lenny-backports部分中)。安装完成后,该过程通常不会太恐怖:

  1. 确保已在以下位置启用系统halevt守护程序 /etc/default/halevt
  2. 允许系统提升用户将设备装入其中/etc/PolicyKit/PolicyKit.conf(请参见下文;
  3. 修改HAL策略以将卷标复制到中的首选安装点中/etc/hal/fdi/policy/preferences.fdi(请参见下文)
  4. 如果需要CD / DVD支持,请从以上博客文章中获取eject.hal脚本,进行修改并保存在中/usr/local/bin
  5. 修改halevt系统配置以启用挂载 /etc/halevt/halevt.xml
  6. 将代码添加到登录管理器的会话前和会话后脚本中,以在有人登录时停止系统halevt守护程序,并在他们退出时重新启动它。

如果需要重新启动HAL和HALEVT守护程序以检查新配置,请使用此命令以正确的顺序获取它们:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

第1步

检查START_DAEMON=yes/etc/default/halevt

第2步

/etc/PolicyKit/PolicyKit.conf添加此<config></config>部分:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

第三步

/etc/hal/fdi/policy/preferences.fdi加这里面的`部分:

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

第四步

该脚本很好,但是需要运行/bin/bash; 某些系统实际上可能/bin/dash/bin/sh被调用时使用。因此,请更改脚本中的第一行,以确保获得正确的脚本:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

第5步

这是有趣的部分。您的系统可能/etc/halevt/halevt.xml已经提供了基本的功能,因此您必须定制此功能以供自己使用。就我而言,我的系统已经提供了基本的可移动设备安装,但是我不得不添加对CDROM安装和弹出按钮的支持。

我提到的博客文章有一个很好的XML配置示例,您可以根据自己的需要进行调整。这主要是关于为作者的fluxbox环境设置gnome-mount替代品,因此他的示例XML的作用超出了您的期望,但这是一种感受您可以做什么的好方法。中也有一些很好的例子/usr/share/doc/halevt/examples

sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"在一切正常之前,我还必须跑步。

这是我使自动挂载CD / DVD工作的补充:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

第6步

一旦系统halevt-daemon正常运行,您将需要在登录GNOME时将其禁用,并在注销时重新启动。(对于非GDM登录管理者,请参阅我对这个问题的回答。)这些东西是理论上的,因为我不使用它,但它应该可以工作。

在中/etc/gdm/PreSession/Default,添加此命令以停止系统halevt-daemon:

/etc/init.d/halevt stop

在中/etc/gdm/PostSession/Default,添加此文件以重新启动系统halevt-daemon:

/etc/init.d/halevt start

3
对于在2013年阅读此书的人来说,他们现在应该知道HAL已过时,并且应该诉诸于基于udev的解决方案,例如上面给出的一个庸俗的吉x德。
oligofren

6

随着时间的流逝,出现了更简单的解决方案。

该解决方案依赖于为此目的而编写的udevil软件包,无需修改udev规则。(对于新老用户而言)作为直接解决方案可能更可取。

devmonudevil 的脚本发挥了所有作用,而仅取决于udev和glib。几乎可以直接使用,无需初始配置。

我在工作站上所做的只是从以下方式调用devmon rc.local
devmon 2>&1 >> /var/log/devmon &
为方便起见,您可能希望将其嵌入到init脚本中,而不是rc.local使用自动工具pleaserun来创建它:https : //unix.stackexchange.com/ a / 124609/42673

运行后,将检查我插入的存储(查找分区,如果找到则查看其文件系统标签),然后将其装入/media/FILESYSTEM_LABEL
无法想象有比这更简单的事情了,除了也许(著名的)systemd在将来的某个时候合并了此功能。

udevil概览(github.io/udevil
脚本:devmon(igurublog / script-devmon


3

quack quixote的答案在Ubuntu Lucid Lynx(10.04)上不起作用-没有/sbin/vol_id命令。

与其花哨并使用udev,不如将其放入/etc/rc.local并完成:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
谢谢..这是我想要完成的最简单的方法。甚至使用ntfs卷在Ubuntu Server 16上工作
ChrisPrime '16

3

对于基于Debian的系统(例如Ubuntu等),有usbmount软件包可以自动为您安装USB驱动器。它基本上使用了已经概述的基于udev的方法-只是简单的软件包安装。该软件包的原始作者似乎已经筋疲力尽了,但是Ubuntu / Debian似乎仍然对其进行维护(我想它并不那么复杂)-因此它仍可在最新版本中使用。

可以配置已安装的脚本(/etc/usbmount/usbmount.conf)以提供适当的安装点。


1
但是,除非您在配置文件中填写标签列表,否则无法通过标签挂载Usbmount。
吉尔斯2014年

1
如果要在不维护列表的情况下将标签的安装添加到usbmount,请参阅esite.ch/2014/04/11/…
奥利弗·沙特

3

要冲洗魁北克吉德的极好的清除方法:

将以下行添加到您之前创建的udev规则文件中(/etc/udev/rules.d)“

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

接下来,创建以下脚本并对其进行chmod可执行(/usr/local/sbin/udev-autounmounter.sh),其内容如下:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

最后,卸载脚本本身(udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

因此,根据其他说明,该目录将在udev事件中自动出现并消失。


我认为if [ -n "$device_is_mounted" ]; then应该if [ -z "${MOUNTPT}" ]; then,不是吗?
2014年

2

您可能要尝试Pysdm


那只是另一个fstab编辑器,不是吗?
09年

是的,但是“它还允许创建用于存储设备动态配置的udev规则”
Sathyajith Bhat

“ udev规则的创建”会以某种方式帮助我吗?我什至不知道那意味着什么。是否可以在没有用户本地登录的情况下挂载以前未知的可移动设备?
endlith


2

您可以尝试放入su username -c gnome-volume-manager/etc/rc.local。仅运行gnome-volume-manager可能就足够了。

编辑:似乎gnome-volume-manager不再是默认发行版的一部分,即使在Ubuntu桌面上也是如此。

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

但是,也许如果您安装它,它仍然可以工作。值得一试。如果不起作用,请再次将其删除。

还有一个usbmount软件包,可以满足您的需要,但可能会干扰正常的自动挂载。


未知命令“ gnome-volume-manager”。我在Ubuntu Jaunty中。
endlith

有一个/ usr / lib / gnome-volume-manager / gnome-volume-manager,但是它什么也没做。
endlith

哦,我明白了。也有一个名为gnome-volume-manager的软件包。相关:crunchbanglinux.org/forums/topic/239/…–
endolith

看起来gnome-volume-manager使用HAL挂载东西吗?而且“自2009年起,HAL正在弃用DeviceKit。” 为什么Linux中的一切总是这样?他们只是开始使某些东西几乎可以正常工作,然后将其清除,并用不起作用的新东西代替。
09年

pmount甚至不工作了。> pmount / dev / disk / by-label / STORAGE错误:设备/ dev / sdc1无法移动 togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

我为Ququi quixote基于udev的解决方案编辑的附录被拒绝了,所以我要把它们放在这里。请先参考他的帖子。

首先,如果要让udev规则在通过SCSI子系统(包括USB,FireWire和eSATA)连接任何设备时起作用,请将udev规则中的SUBSYSTEMS匹配项更改为SUBSYSTEMS=="scsi"

但是请记住,这将自动安装几乎所有东西,包括如果在系统运行时热插拔内部驱动器,则可能不是您想要的。

其次,这是我正在使用的脚本,它将替换该文章中的所有脚本。一旦卸下已安装的块设备,它还会自动清除/ media /中创建的安装点-无需手动干预。此外,与其不调用其他脚本在后台运行,还不将其从终端执行时(例如,通过udev执行时),它将自身置于后台。

它使用inotifywait等待,直到挂载的设备消失,然后删除其创建的目录。因此,您需要在系统上安装inotify-tools。在基于Debian的发行版(包括Ubuntu)上,sudo apt-get install inotify-tools就足够了。

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

您会注意到,我挂载的设备不同步且为只读。那仅仅是因为99%的时间,我的用例是从外部驱动器读取数据,并且每当我需要对其进行写入时,无论如何我都会在服务器上处于活动状态,并且可以轻松地发出mount -o remount,rw <mountpoint>命令。编辑以适应您的需求:)


您如何运行此脚本?halevt似乎不是apt-get现代版本的当前功能包。
坎贝尔

Agh ...也许,如果我按照quack quixote's的TOP / Accepted Answer条目...仍然很高兴在这里获得更完整的答案:)
Campbeln

1

尝试通过mountmanager进行配置,这样就不必手动输入数据。

它应该是ubuntu存储库的一部分。


您需要启用Universe部分才能获取它。
2009年

apt:mountmanager?section = universe;)
endolith

那只是为我设置一个fstab吗?
endlith

@endolith:apt:universe?install = mountmanager会更合逻辑吗?;)
Bobby

这种格式有效吗?在手册页中没有这么说manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith,2009年

-5

如果一次只安装一个驱动器,则只需将其编辑到/etc/fstab文件中即可。类似于以下内容:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

这应该在启动时挂载它,并使具有烫发功能的任何人都可以访问它。如果您有多个驱动器,仍然可以使用以下方法执行此操作:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
显然不是问题所要问的。
09年
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.