我正在尝试按以下要求区分文件系统上的文件(假设所有文件都在同一文件系统内):
由于我假设所有文件都在同一文件系统中,所以我倾向于使用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
?
答案 0 :(得分:1)
A,这是不可能的,因为:
对于在用户控制下的所有数据/元数据(包括扩展属性等),可以将其值/内容设置为与“原始”文件完全相同的值。
< / li>对于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就足够了。
这些文件属性与索引节点一起保存,因此重命名文件或(硬链接)文件将保留这些属性。但是,不会删除和重新创建它。