我使用QEMU测试Raspberry Pi,然后将图像放到SD卡上。我正在设置一个自动脚本,将一些文件放到Pi上,除其他外,这样当我将SD卡放入Pi中时,它就可以立即使用。我想我在权限的工作方式上遇到了一些怪癖,但我不确定。
当您运行test -x
时,文件应该是可执行的。基本上,x
位应该是为用户打开的。但是,这似乎不适用于挂载文件系统中的文件。
主机是Ubuntu,客户支持图像是Raspberry Pi Buster。我用guestmount
创建了挂载点,因为我正在挂载快照,而不是原始快照,这似乎是唯一/最好的方法。基本流程是:
qemu-img convert -Oqcow2 raspberry-pi.img raspberry-pi.qcow
qemu-img create -f qcow2 snapshot.qcow -b raspberry-pi.qcow
sudo guestmount -a 'snapshot.qcow' -i 'mountpoint/'
例如,我在存储库之外有一个文件。我在挂载点内测试的文件是由root创建的,因此我将这个文件编辑为chmod
以便进行比较:
$ sudo ls -l --author ~/test/file
-rw-r--r-- 1 root root root 1133 Oct 8 21:43 /home/me/test/file
$ sudo test -x ~/test/file && echo 'exists' || echo 'doesn\'t exist'
doesn't exist
但是,对于具有相同权限的挂载点内的文件,测试是成功的:
$ sudo ls -l --author mountpoint/home/pi/test/file
-rw-r--r-- 1 root root root 0 Oct 8 22:41 mountpoint/home/pi/test/file
$ sudo test -x ~/test/file && echo 'exists' || echo 'doesn\'t exist'
exists
为什么挂载点内的文件是可执行的,而外部的文件不是可执行的?是因为挂载的文件系统是不同的体系结构(x86与ARM)?是因为我使用的是guestmount
,而文件系统不是真正的文件,而是快照和原始文件的合并吗?或者这只是安装的工作方式?我在哪里可以找到更多关于这种奇怪行为的资源,就像我可能遇到的其他许可怪癖一样?
如果您需要更多关于主人或客人的信息,请询问。
发布于 2020-10-08 20:45:19
这是libguestfs
中guestmount
使用的一个bug。你可以在这里看
/* Root user should be able to access everything, so only bother
* with these fine-grained tests for non-root. (RHBZ#1106548).
*/
if (fuse->uid != 0) {
[...]
if (mask & X_OK)
ok = ok &&
( fuse->uid == statbuf.st_uid ? statbuf.st_mode & S_IXUSR
: fuse->gid == statbuf.st_gid ? statbuf.st_mode & S_IXGRP
: statbuf.st_mode & S_IXOTH);
}
FS采取了一种快捷方式,因为您是root用户,所以您可以完全访问,因此没有必要检查权限。
正如你所展示的,这不是真的。Root只应该对目录和至少设置了一个执行位的文件具有执行权限。
我无法构建该项目来提交修补程序,但您可以提交一个bug。
https://stackoverflow.com/questions/64273334
复制