区分文件系统上的文件
Distinguishing file on the filesystem
我试图根据以下要求区分文件系统上的文件(假设所有文件都在同一文件系统中):
- 如果文件 A 被重命名为文件 B,它看起来应该是一样的
- 如果文件 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
?
唉,这是不可能的,因为:
对于用户控制的所有 data/metadata(包括扩展属性等),可以将它们的 values/content 设置为与 "original" 文件.
对于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 一起保存,因此重命名文件或(硬)链接文件将保留这些属性。但是删除再新建就不会了。
我试图根据以下要求区分文件系统上的文件(假设所有文件都在同一文件系统中):
- 如果文件 A 被重命名为文件 B,它看起来应该是一样的
- 如果文件 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
?
唉,这是不可能的,因为:
对于用户控制的所有 data/metadata(包括扩展属性等),可以将它们的 values/content 设置为与 "original" 文件.
对于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 一起保存,因此重命名文件或(硬)链接文件将保留这些属性。但是删除再新建就不会了。