[英]Distinguishing file on the filesystem
我正在尝试通过以下要求来区分文件系统上的文件(假设所有文件都在同一文件系统内):
由于我假设所有文件都在同一文件系统中,因此我倾向于使用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来存储一些meta uid
?
las,这是不可能的,因为:
对于在用户控制下的所有数据/元数据(包括扩展属性等),可以将其值/内容设置为与“原始”文件完全相同的值。
对于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应该就足够了。
这些文件属性与索引节点一起保存,因此重命名文件或(硬链接)将保留这些属性。 但是,不会删除并重新创建它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.