区分文件系统上的文件

Distinguishing file on the filesystem

我试图根据以下要求区分文件系统上的文件(假设所有文件都在同一文件系统中):

  1. 如果文件 A 被重命名为文件 B,它看起来应该是一样的
  2. 如果文件 A 被删除然后创建它应该看起来是不同的

因为我假设所有文件都在同一个文件系统中,所以我倾向于使用 inode_number。但是不满足2.点。实际上:

root@spc:~/test# touch test
root@spc:~/test# ls -li
total 0
2098203 -rw-r--r-- 1 root root 0 Jan 15 14:55 test
root@spc:~/test# rm test
root@spc:~/test# touch test
root@spc:~/test# ls -li
total 0
2098203 -rw-r--r-- 1 root root 0 Jan 15 14:55 test

所以这两个不同的文件似乎具有相同的 inode 编号。 linux/ext4 有办法做到这一点吗?也许我们可以使用一些文件系统特定 api 来存储一些元数据 uid?

唉,这是不可能的,因为:

  1. 对于用户控制的所有 data/metadata(包括扩展属性等),可以将它们的 values/content 设置为与 "original" 文件.

  2. 对于inode号,它取决于内核中的文件系统支持,其中许多(FS)回收inode号。

您可以设置扩展文件系统属性(在支持的情况下,即当使用选项 user_xattr 安装时使用 ext4):

#include <sys/types.h>
#include <attr/xattr.h>

int main (void) {
    setxattr("test", "user.fileguid", "someuniqueguid", 15, 0);
}

然后用

读回
char uuid[100];
int len = getxattr("test", "user.fileguid", uuid, sizeof(uuid), 0);

如果该属性只能由特权进程修改,您可以使用 security 命名空间而不是 user(即属性名称 security.fileguid)。在这种情况下,文件所有者自己不能修改属性。如果您不使用 user 命名空间,则挂载选项 user_xattr 甚至不是必需的。

但是,创建文件后不会立即设置这些属性。但是在使用您的工具访问文件时(即尚未设置 guid 时)第一次设置随机 guid 应该就足够了。

这些文件属性与 inode 一起保存,因此重命名文件或(硬)链接文件将保留这些属性。但是删除再新建就不会了。