实际上,只要已在中创建了正确的条目,就可以轻松地或多或少地以没有root特权的普通用户身份来挂载任何内容/etc/fstab
。
当然,/etc/fstab
需要root特权的修改。但是,单个条目可以非常灵活地用于(u)在不同的挂载点上挂载许多不同的文件,而无需对进行任何进一步的编辑/etc/fstab
。
这里有两个非常简短的Bash脚本(5行+注释):
用于安装
#!/bin/sh
# usage: usmount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to mount device $1 on mount point $2
# Use /etc/fstab entry :
# /tmp/UFS/drive /tmp/UFS/mountpoint auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
mount /tmp/UFS/drive || mount /tmp/UFS/mountpoint
# The last statement should be a bit more subtle
# Trying both is generally not useful.
和拆卸
#!/bin/sh
# usage: usumount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to umount device $1 from mount point $2
# Use /etc/fstab entry :
# /tmp/UFS/drive /tmp/UFS/mountpoint auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
umount /tmp/UFS/drive || umount /tmp/UFS/mountpoint
# One of the two umounts may fail because it is ambiguous
# Actually both could fail, with careless mounting organization :-)
/tmp/UFS/
创建目录是为了隔离链接并避免冲突。但是符号链接可以位于用户空间中的任何位置,只要它们位于同一位置(相同路径)即可。该/etc/fstab
条目也不会更改。
重要警告:
出于安全考虑,限制了安装。使其更加灵活可能会打开恶意软件的大门。我不是安全专家,所以我建议您打开门不超过绝对需要的数量...使用选项限制可以挂载的文件系统可以执行的操作。如果知识渊博的撰稿人可以进一步评论安全问题,则可能会很有用。
可以使用各种选项来限制使用已挂载的文件系统,例如,noexec
这些选项可防止执行二进制文件或nosuid
,从而有助于提高安全性。实际上,这些选项在使用user
或时被添加为默认选项users
,这在下面的操作中是必然的。在覆盖这些默认值之前,请三思。 http://en.wikipedia.org/wiki/Fstab
可以添加其他选项以进一步保护。例如,在选项 owner
中的 /etc/fstab
条目将让用户只处理文件或他们自己的设备。请参阅 man mount
以获取选项列表: http : //linux.die.net/man/8/mount。
/etc/fstab
也可以通过包含符号链接的目录(或多个目录)的user.group所有权来限制该条目的使用。
说明
在我意识到我可以简化以上两个脚本之前就写了这个说明。我之所以没有立即想到它们,部分原因是我手头有一个更为复杂的问题,如果没有一些额外的设备,它们将无法解决。因此,我的解释可能比应有的更为复杂,但是我没有勇气从头开始重写所有内容。
其基本思路是,以创建条目中/etc/fstab
包含的选项user
或users
使用户可以要求mount
做安装在该条目被赋予作为参数文件中指定要安装或(在我的经验,但不能同时)的挂载点使用。
您还需要一个正确的条目umount
(这是一个稍微不同的问题-参见下文)。该选项user
通常优于,users
因为它将权限限制为umount
安装文件系统的用户,而users
将允许所有人。不幸的是,该选项user
并不总是有效,可能需要采取一些其他步骤。选项“ user”的mount(而非umount)工作中对此进行了讨论。
首先,您添加/etc/fstab
一个条目,例如:
/tmp/UFS/drive /tmp/UFS/mountpoint auto users,noauto, 0 0
并/tmp/UFS/drive
用作要挂载的任何设备或文件(例如包含ISO文件系统映像的文件)的符号链接(或符号链接)/home/johndoe/john-image-file.iso
。
您还可以/tmp/UFS/mountpoint
将您要使用的安装点定义为符号链接,例如/mnt/iso
。
然后john-image-file.iso
,您可以使用以下命令进行挂载:
$ mount /tmp/UFS/drive
在我的Mageia Linux上,这已经足够了,因为现在已经隐式使用了循环设备,不再需要-o loop
显式使用。我不知道今天有多普遍。请参阅
安装时,何时应使用回路设备?
此安装出现在表和命令中:
$ df | tail -1
/dev/loop0 5,1G 5,1G 0 100% /mnt/iso
$ tail -1 /etc/mtab
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ mount | tail -1
/home/johndoe/john-image-file.iso on /mnt/iso type udf (ro,nosuid,nodev,noexec,relatime,utf8)
$ tail -1 /proc/mounts
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ tail -1 /proc/self/mountinfo
46 22 7:0 / /mnt/iso rw,nosuid,nodev,noexec,relatime - udf /dev/loop0 ro,utf8
$ tail -1 /proc/self/mountstats
device /dev/loop0 mounted on /mnt/iso with fstype udf
挂载操作适用于任何文件或驱动器,只需要从/tmp/UFS/drive
该文件或驱动器进行符号链接即可。当然,可以为符号链接选择其他名称和位置,只要它永不改变即可。
卸载文件的方式与正确使用符号链接相同。对于与某些硬件驱动器相对应的普通设备,只需使用相同的链接。
但是,包含文件系统映像的文件是通过一种称为循环设备的特殊设备装入的,该设备在装入文件时会自动分配。
要卸载文件,您需要引用循环设备,而不是文件。因此,您需要在/etc/fstab
一个条目中匹配在/etc/mtab
这里使用的环路设备/dev/loop0
和这里的安装点
/mnt/iso
。
您无法提前创建此类条目,因为循环设备可能会因动态分配而有所不同。注意,也可以使用固定环路设备,但是在其他方面不方便。请参阅
http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ (此博客实际上启发了此处的答复)。
但是,您可以/dev/loop0
通过询问系统来找到循环设备的名称,就像我们在上面以几种不同方式所做的一样。然后,/etc/fstab
可以使我们的标准条目通过symlink指向正确的循环设备/tmp/UFS/drive
,并指向先前使用进行的安装点/tmp/UFS/mountpoint
。完成此操作后,可以使用以下任何命令来卸载该文件(只要与不会产生歧义/etc/mtab
,这是一个不同的问题):
$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint
由于仅在发出命令时才需要两个符号链接,因此可以动态更改它们。因此,我们的单个/etc/fstab
条目允许安装任何数量的文件,并以任何顺序卸载它们,而无需root特权。
其他参考:
mount
二进制文件不需要SUID权限,那么您应该可以使用fakeroot而不会出现问题。