ext3:挂载点的权限在我挂载时发生变化

ext3:挂载点的权限在我挂载时发生变化

我需要普通用户能够在我的计算机上安装 /dev/loop0p1 和 /dev/loop0p2。/dev/loop0p1 始终是 FAT32 分区,而 loop0p2 始终是 ext3。

为此,我已:

1)创建目录 /tmp/loop0p1 和 /tmp/loop0p2(在启动脚本中,我知道它们在重启后会消失):

[root@machine tmp]$ ls -l
(...)
drwxrwxrwx 2 root       root       80 Jul 22 00:25 loop0p1
drwxrwxrwx 2 root       root       40 Jul 22 00:50 loop0p2

2)在 /etc/fstab 中添加以下几行:

/dev/loop0p1  /tmp/loop0p1  vfat defaults,loop,users,noauto  0 0
/dev/loop0p2  /tmp/loop0p2  ext3 defaults,loop,users,noauto  0 0

3)现在作为普通用户我可以安装它们,没有问题。

问题在于 loop0p2 Ext3 分区的权限 - 在挂载之前,如上所示,/tmp/loop0p2 挂载点的权限为“777”,但在“挂载 /dev/loop0p2”之后,权限突然神奇地变为“755”:

[root@machine tmp]$ ls -l /tmp
(...)
drwxrwxrwx 2 user user 16384 Jan  1  1970 loop0p1
drwxr-xr-x 3 root root  1024 Jul 22 00:37 loop0p2

而且,不用说,我的用户无法在 /tmp/loop0p2 挂载点内写入任何内容,这是没用的。

为什么权限会改变?是否有一个 ext3 安装选项可以授予我完全访问权限?该死的 ext3 似乎不支持 gid、uid、umask!!

答案1

感谢大家的回答,我现在明白挂载点的权限来自挂载目录。

问题是,我挂载的不是目录,而是文件中块设备的映像。重点是能够在内存中创建 USB 磁盘的映像(这就是我们将其挂载到 /tmp 中的 TMPFS 的原因,这比写入实际块设备要快得多)

普通用户需要能够运行执行此操作的脚本。

以下是总体情况:

1)我创建一个挂载点/tmp/loop0p1

2)我将以下内容添加到 /etc/fstab(以便普通用户可以挂载 /dev/loop0p1):

/dev/loop0p1  /tmp/loop0p1  ext3 defaults,loop,users,noauto  0 0

我运行以下脚本(简化以显示问题的本质):

#!/bin/sh

dd if=/dev/zero of=usb.img bs=1M seek=9 count=1

sfdisk usb.img << EOF 
,20480,83
EOF

losetup -P /dev/loop0 usb.img
sleep 2

mkfs.ext3 /dev/loop0p1

mount /dev/loop0p1
echo "loop0p1" > /tmp/loop0p1/p1.txt
umount /tmp/loop0p1

losetup -d /tmp/loop0

如您所见,该脚本创建了一个 10MB 的空文件,在其中设置了一个 Linux(类型“83”)分区,将其循环挂载到 /dev/loop0,在其中创建一个 Ext3 文件系统,然后将其挂载到 /tmp/loop0p1,并尝试在那里写入文件。

问题是脚本在尝试将文件写入 /tmp/loop0p1 时失败并出现“权限被拒绝”的情况,这也不足为奇,因为就像我已经说过的 - 当我挂载时,/tmp/loop0p1 的权限更改为 755 root:root,所以显然作为普通用户我无法在那里写入任何内容。

我正在挂载的东西只是由“dd”、“sfdisk”和“mkfs.ext3”凭空创建的。我到底应该更改什么,以便运行脚本的用户实际上具有写访问权限?

答案2

挂载后您必须手动授予写入权限。

chmod 777 /你的目录

umask 和 rw 在 ext 文件系统中不起作用。

答案3

这里的问题是,已挂载的文件系统有自己的权限,并且不会继承其挂载到的目录(或挂载点)的权限。

解决方法是在挂载分区后设置您的权限。

为了做到这一点,您可以使用:

chmod 777 /tmp/loop0p2

但是这可能无法完全解决问题,因为如果你还有其他文件之内挂载点也将保留其以前的权限,因此对您来说更有用的命令可能是:

chmod -R 777 /tmp/loop0p2

或者 - 如果仅有的您的用户需要访问它 - 您可以将文件切换为仅需要访问权限的用户:

chown <user>:<group> /tmp/loop0p2 [/ only]
chown -R <user>:<group> /tmp/loop0p2 [recursively]

希望这可以帮助!

答案4

实际上有一个更简单的脚本可以显示该问题。

我们希望能够以普通用户身份运行以下脚本(以 root 身份运行即可):

#!/bin/sh

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs -t ext2 -F disk.img
losetup /dev/loop0 disk.img
mount /dev/loop0
echo aaaa > /mnt/aa
umount /mnt
losetup -d /dev/loop0

为此,我们

  • 在 /etc/fstab 中添加适当的条目,使 /dev/loop0 可由所有用户挂载到 /mnt(只有非 root 用户才能挂载)
  • 将相关用户添加到 /dev/loop 所属的组(在 Fedora 中,这是“disk”组,目的是让用户可以运行“losetup”)
  • 运行脚本。您将从“echo”中得到“权限被拒绝”的信息。

相关内容