在已挂载的文件系统中测试 -x

test -x in Mounted Filesystem

在将图像放入 SD 卡之前,我正在使用 QEMU 测试 Raspberry Pi。我正在设置一个自动脚本,将一些文件放到 Pi 上,除此之外,这样当我将 SD 卡放入 Pi 时,它可以立即使用。我想我 运行 对权限的工作方式感到奇怪,但我不确定。

当您 运行 test -x 时,该文件应该是可执行的。基本上,x 位应该为您的用户打开。但是,这似乎不适用于已挂载文件系统中的文件。

主持人是Ubuntu,嘉宾是Raspberry Pi巴斯特。我用 guestmount 创建了挂载点,因为我挂载的是快照,而不是原始快照,这似乎是 only/best 的方式。基本流程是:

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将该文件编辑到 root 以进行比较:

$ 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

但是对于mountpoint里面的一个文件,同样的权限,测试成功:

$ 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 vs. ARM)吗?是不是因为我使用的是 guestmount,而文件系统不是真正的文件系统,而是快照和原始文件的合并?或者这只是安装的方式?我在哪里可以找到更多关于这种特殊行为的资源,就像我可能遇到的其他权限问题一样?

如果您需要更多关于主人或客人的信息,请询问。

这是 guestmount 使用的 libguestfs 中的错误。你可以 see it here:

  /* 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 应该只对目录和至少设置了一个执行位的文件具有执行权限。

我无法构建项目来提交补丁,但你可以提交错误。