代码之家  ›  专栏  ›  技术社区  ›  Some Name

区分文件系统上的文件

  •  0
  • Some Name  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Ctx    6 年前

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

    #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 )在这种情况下,文件所有者本身不能修改属性。如果不使用 用户 命名空间,mount选项 用户应用程序 甚至没有必要。

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

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

        2
  •  1
  •   Jean-Baptiste Yunès    6 年前

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

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

    2. 对于inode编号,它依赖于内核中的文件系统支持,其中许多(fs)都会回收inode编号。