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