我需要普通用户能够在我的计算机上安装 /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”中得到“权限被拒绝”的信息。