术语文件系统是一个花哨的词,用来描述您的计算机如何跟踪您创建的所有文件。无论是办公文档、配置文件,还是成千上万的数码照片,您的计算机都必须以对您和它都有用的方式存储大量数据。像 Ext4、XFS、JFS、BtrFS 等文件系统是您的计算机用来跟踪数据的“语言”。
您的桌面或终端可以做很多事情来帮助您快速找到数据。例如,您的文件管理器可能具有过滤器功能,因此您可以快速查看主目录中的图像文件,或者它可能具有搜索功能,可以通过文件名找到文件等等。这些特性被称为文件属性,因为它们正是如此:数据对象的属性,由文件头和文件系统本身的代码定义。大多数文件系统记录标准文件属性,例如文件名、文件大小、文件类型、创建时间戳和上次访问时间戳。
我在我的计算机上使用开源的 XFS 文件系统,不是因为它的可靠性和高性能,而是因为扩展属性带来的细微便利。
常见文件属性
当您保存文件时,有关它的数据会随之一起保存。常见属性告诉您的操作系统是否更新访问时间、何时将文件中的数据同步回磁盘以及其他后勤细节。哪些属性被保存取决于底层文件系统的功能和特性。
除了标准文件属性(就存在标准属性而言),XFS、Ext4 和 BtrFS 文件系统都可以使用扩展文件系统。
扩展属性
XFS、Ext4 和 BtrFS 允许您创建自己的任意文件属性。因为您正在创建属性,所以您的操作系统中没有任何内置功能来利用它们,但我将它们用作文件的“标签”,就像我对照片使用 EXIF 数据的方式一样。开发人员可能会选择使用扩展属性在应用程序中开发自定义功能。
XFS 中属性有两个“命名空间”:user 和 root。创建属性时,您必须将属性添加到其中一个命名空间。要将属性添加到 root 命名空间,您必须使用 sudo
命令或以 root 用户身份登录。
添加属性
您可以使用 attr
或 setfattr
命令将属性添加到 XFS 文件系统上的文件。
attr
命令假定 user
命名空间,因此您只需设置 (-s
) 属性的名称,后跟值 (-V
)
$ attr -s flavor -V vanilla example.txt
Attribute "flavor" set to a 7 byte value for example.txt:
vanilla
setfattr
命令要求您指定目标命名空间
$ setfattr --name user.flavor --value chocolate example.txt
列出扩展文件属性
使用 attr
或 getfattr
命令查看您添加到文件的扩展属性。attr
命令默认为 user 命名空间,并使用 -g
选项来获取扩展属性
$ attr -g flavor example.txt
Attribute "flavor" had a 9 byte value for example.txt:
chocolate
getfattr
命令需要属性的命名空间和名称
$ getfattr --name user.flavor example.txt
# file: example.txt
user.flavor="chocolate"
列出所有扩展属性
要查看文件上的所有扩展属性,您可以使用 attr -l
$ attr -l example.txt
Attribute "md5sum" has a 32 byte value for example.txt
Attribute "flavor" has a 9 byte value for example.txt
或者,您可以使用 getfattr -d
$ getfattr -d example.txt
# file: example.txt
user.flavor="chocolate"
user.md5sum="969181e76237567018e14fe1448dfd11"
任何扩展文件属性都可以使用 attr
或 setfattr
更新,就像您正在创建属性一样
$ setfattr --name user.flavor --value strawberry example.txt
$ getfattr -d example.txt
# file: example.txt
user.flavor="strawberry"
user.md5sum="969181e76237567018e14fe1448dfd11"
其他文件系统上的属性
使用扩展属性的最大风险是忘记这些属性特定于它们所在的文件系统。这意味着当您将文件从一个驱动器或分区复制到另一个驱动器或分区时,即使目标文件系统支持扩展属性,这些属性也会丢失即使目标文件系统支持扩展属性。
为避免丢失扩展属性,您必须使用支持保留它们的工具,例如 rsync
命令。
$ rsync --archive --xattrs ~/example.txt /tmp/
无论您使用什么工具,如果您将文件传输到不清楚如何处理扩展属性的文件系统,这些属性都会被删除。
搜索属性
与扩展属性交互的机制不多,因此使用您添加的文件属性的选项有限。我将扩展属性用作标记机制,这使我可以关联彼此之间没有明显关系的文件。例如,假设我需要一个知识共享图形用于我正在进行的项目。假设我事先有远见地将扩展属性 license 添加到我的图形集合中。我可以使用 find
和 getfattr
一起搜索我的图形文件夹
find ~/Graphics/ -type f \
-exec getfattr \
--name user.license \
-m cc-by-sa {} \; 2>/dev/null
# file: /home/tux/Graphics/Linux/kde-eco-award.png
user.license="cc-by-sa"
user.md5sum="969181e76237567018e14fe1448dfd11"
文件系统的秘密
文件系统通常不是您应该注意的东西。它们实际上是用于定义文件的系统。这不是计算机执行的最令人兴奋的任务,也不是用户应该担心的事情。但是某些文件系统为您提供了一些有趣且安全的特殊功能,而扩展文件属性就是一个很好的例子。它的用途可能有限,但扩展属性是一种为您的数据添加上下文的独特方式。
评论已关闭。