如何在没有root权限的情况下挂载镜像文件?

如何在没有root权限的情况下挂载镜像文件?

我可以在没有root权限的情况下挂载文件系统映像吗?通常我会这样做:

mount -o loop DISK_IMAGE FOLDER

不使用 sudo 或设置 suid on mount,有没有合适的方法来做到这一点?

我知道我可以使用fusermount一些 ISO 映像,但这非常有限,即使对于 ISO 映像,我的某些映像也无法安装,但mount始终可以使用。

答案1

您无法安装管理员未以某种方式授予您安装权限的任何内容。只有 root 可以调用mount系统调用。原因是有很多方法可以通过挂载来提升权限,例如在系统位置上挂载某些内容、使文件看起来属于另一个用户、利用依赖文件所有权的程序、创建 setuid 文件或利用错误在文件系统驱动程序中。

mount命令是 setuid root。但如果您不是 root,它只允许您挂载 中提到的内容fstab

fusermount命令是 setuid root。它只允许您通过 FUSE 驱动程序挂载东西,并限制您以这种方式提供具有任意所有权或权限的文件的能力(在大多数设置下,FUSE 挂载上的所有文件都属于您)。

你最好的选择是找到一个FUSE文件系统它能够读取您的磁盘映像。对于 ISO 9660 图像,请同时尝试弗塞索UMfuse 的 ISO 9660 支持(在 Debian 下可用fuseiso9660包裹)。

答案2

Debian 维基展示了执行此操作的几种方法。这是一种方法。这需要udisks2安装该软件包。

首先,创建一个“循环设备”。这将允许我们挂载图像文件。

$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.

请注意,它将图像映射到/dev/loop0。但是,如果上一个命令返回了/dev/loop1,那么您将在以下所有命令中替换/dev/loop0为。/dev/loop1

如果我们创建的块设备没有使用上一个命令自动挂载,您可能需要运行此命令:

$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME

您可以查看磁盘上的文件:

$ ls -l /media/$USER/$IMAGE_NAME/

完成后您可以卸载它:

$ udisksctl unmount -b /dev/loop0
$ udisksctl loop-delete -b /dev/loop0

答案3

您可以使用 FUSE 模块 guestmount 来挂载多种类型的磁盘映像。它是 guestfs 生态系统的一部分,不需要 root 权限。

看看手册页了解更多详情。

例子

1.对于主文件系统位于第一个分区的典型 Windows 客户机:

guestmount -a windows.img -m /dev/sda1 --ro /mnt

2.对于第一个分区上有 /boot 文件系统且逻辑卷上有根文件系统的典型 Linux 客户机:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt

答案4

实际上,作为没有 root 权限的普通用户,只要在/etc/fstab.

当然修改需要/etc/fstabroot权限。但是,可以非常灵活地使用单个条目来将许多不同的文件挂载到不同的挂载点上,而无需进一步编辑/etc/fstab.

这里有两个非常短的(5行+注释)Bash脚本可以完成这项工作:

用于安装

#!/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权限,而允许所有人使用该权限。不幸的是,该选项并不总是有效,并且可能需要采取一些其他步骤才能发挥作用。这在中讨论umountusersuser选项“user”适用于挂载,不适用于卸载

首先,您添加/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条目可以通过符号链接指向正确的循环设备/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 权限。

其他参考:

相关内容