Linux 文件系統擴展屬性【轉】


轉自:https://blog.csdn.net/ganggexiongqi/article/details/7661024

擴展屬性(xattrs)提供了一個機制用來將《鍵/值》對永久地關聯到文件,讓現有的文件系統得以支持在原始設計中未提供的功能。擴展屬性是文件系統不可知論者,應用程序可以通過一個標准的接口來操縱他們,此接口不因文件系統而異。每個擴展屬性可以通過唯一的鍵來區分,鍵的內容必須是有效的UTF-8,格式為namespace.attribute,每個鍵采用完全限定的形式。

  需要注意的是這里的值可以是任意字節的數組,未必是字符存,而且最后可能不是null,這樣在訪問的時候必須知道值的大小。在設置的時候當然也就需要設置值大小。

  一個擴展屬性的用處:GUI的文件管理程序的行為根據文件類型而異。要判斷文件的格式,Winodws之類的操作系統僅需要查看文件的擴展名就可以了,而Unix系統往往需要查看文件的內容來判斷類型。有些文件管理程序會直接產生此信息,有些則會將產生的信息緩存起來以備下次使用。一個更好的做法就是將此類元數據存入擴展屬性。
Linux下定義的4種擴展屬性命名空間:

    system:用於實現利用擴展屬性的內核功能,例如訪問控制表。eg:system.posix_acl_access便是位於此用戶空間的擴展屬性,用戶是否可以讀取或寫入這些屬性取決於所使用的安全模塊。
    security:用於實現安全模塊。
    trusted:把受限制的信息存入用戶空間。
    user:一般進程所使用的標准命名空間,經過一般文件權限位來控制此命名空間的訪問。


下面是一個使用擴展屬性的例子:

創建磁盤
# dd if=/dev/zero of=/opt/testptn count=512
# mke2fs xattr_disk

掛載磁盤
# mount -o loop,user_xattr xattr_disk mnt

擴展特性的操作
# touch test.txt
設置擴展特性
# setfattr -n user.abc -v 123 test.txt
顯示擴展特性
# getfattr -n user.abc test.txt
# file: test.txt
user.abc="123"


再一個例子:

    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/xattr.h>
    #include <sys/types.h>
     
    void testset(){
        char key[7] = {'u','s','e','r','.','#','\0'};
        char value[2] = {'#','\0'};
        int i, ret;
     
        for(i = 0; i < 10; i++){
        key[5] = value[0] = '0'+i;
        ret = setxattr("test", key, value, 2, 0);
        }
    }
     
    void testlist(){
        char buf[1000];
        int ret, i=0, j = 0;
        printf("The key on test are:\n");
        ret = listxattr("test", buf, 1000);
        while(i < ret){
        printf("%s\n", buf+i);
        i += strlen(buf+i);
        i++;
        }
    }
     
    void testremove(){
        char key[7] = "user.2";
        int ret;
        ret = removexattr("test", key);
        printf("%d\n", ret);
    }
     
    void testget(){
        char key[7] = "user.#";
        char value[3];
        int ret, i;
        printf("The <key,value> on test are:\n");
        for(i = 0; i < 11; i++){
        key[5] = '0'+i;
        ret = getxattr("test", key, value, 3);
        if(ret != -1)
            printf("<%s,%s>\n", key, value);
        }
    }
     
    int main(){
        testset();
        testlist();
        testremove();
        testget();
        return 0;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM