在文件系统上区分文件

时间:2019-01-15 11:58:45

标签: c linux filesystems

我正在尝试按以下要求区分文件系统上的文件(假设所有文件都在同一文件系统内):

  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

2 个答案:

答案 0 :(得分:1)

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

  1. 对于在用户控制下的所有数据/元数据(包括扩展属性等),可以将其值/内容设置为与“原始”文件完全相同的值。

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

答案 1 :(得分:1)

您可以设置扩展的文件系统属性(在受支持的情况下,即使用选项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就足够了。

这些文件属性与索引节点一起保存,因此重命名文件或(硬链接)文件将保留这些属性。但是,不会删除和重新创建它。