以普通用户身份创建磁盘映像

以普通用户身份创建磁盘映像

我希望能够以普通用户身份运行以下脚本(以 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

为此,我

1)在 /etc/fstab 中添加适当的条目(只有这样普通用户才能运行“mount /dev/loop0”):

/dev/loop0  /mnt  ext2    defaults,loop,users,noauto      0 0

2)将相关用户添加到“磁盘”组(只有这样用户才能运行“losetup” - /dev/loop0 归“磁盘”组所有)

现在,希望最后一个问题是,当我以普通用户身份运行时,我从“echo”收到“权限被拒绝”错误。难怪,因为挂载后,/mnt 目录的权限更改为 755 root:root,显然普通用户无法在其中创建文件。

我应该如何创建“disk.img”以便在安装时它可以由创建它的用户写入?

编辑:

建议的“pmount”解决方案似乎存在同样的问题。重现步骤:

1)安装“pmount”并将“/dev/loop0”添加到/etc/pmount.allow

2)以普通用户身份运行以下命令:

#!/bin/sh

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs -t ext2 -F disk.img
losetup /dev/loop0 disk.img
pmount -w /dev/loop0
echo aaaa > /media/loop0/aa
pumount /media/loop0
losetup -d /dev/loop0

您仍然会从 echo 中收到“权限被拒绝”的消息,原因与我们之前收到的原因相同 - /media/loop0/ 目录的权限为 755:

[user@server test]$ ls -l /media/
total 1
drwxr-xr-x 3 root root 1024 Jul 22 13:40 loop0
[user@server test]$ ls -l /media/loop0/
total 12
drwx------ 2 root root 12288 Jul 22 13:40 lost+found

编辑2:

我设法解决了这个问题 - mkfs.ext3 的选项‘root_owner’派上了用场:

#!/bin/sh

WHOAMI=`whoami`

uid=$(id -u $WHOAMI)
gid=$(id -g $WHOAMI)

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs.ext3 -E root_owner=$uid:$gid disk.img
losetup /dev/loop0 disk.img
mount /dev/loop0
echo aaaa > /mnt/aa
umount /mnt
losetup -d /dev/loop0

然后,挂载点将归运行脚本的用户所有,然后用户就可以在里面写入:)

答案1

使用挂载代替mount

pmount(“策略挂载”)是标准挂载程序的包装器,它允许普通用户挂载无需匹配条目的可移动设备/etc/fstab

大概想要...

-w--read-write

强制将设备安装为可读/可写。如果未指定 -r 或 -w,则内核将选择适当的默认值。

因此,您可以删除 fstab 条目,而不需要将用户添加到disk组中。

/media/如果设备在列表中,它允许在任何位置安装/etc/pmount.allow,因此它也可以解决任何权限问题。

答案2

Rinzwind:我在上面的问题中发布的精简脚本没有显示它,但是“pmount”解决方案存在问题。

问题是它似乎只能挂载到 /media。

完整的脚本更加复杂:它创建一个 500MB 的大图像文件(USB 闪存盘的图像),将其分成 2 个分区(FAT32 和 Ext3),将两个分区都挂载到 TMPFS(/tmp/loop0p1 和 /tmp/loop0p2)并在里面写入大量数据。

能够挂载到 TMPFS 非常重要,这样此操作才能快速进行 - 以我的经验,在 TMPFS 内部执行此操作比在 HD 中的实际块设备中执行要快 10 倍以上。

/media 不是 TMPFS...

相关内容