在 Linux 中,文件的扩展属性(Extended Attributes)是与文件相关的附加信息。除了基本的权限(如读、写、执行)之外,扩展属性允许你为文件添加额外的元数据,用于存储更多的信息。

扩展属性可以用于各种目的,例如:

  1. 文件安全:你可以使用扩展属性设置文件的只读、不可修改、不可删除等属性,以提高文件的安全性。
  2. 访问控制:扩展属性可以用于确定特定用户或用户组对文件的访问权限,以实现更细粒度的访问控制。
  3. 文件标记:你可以使用扩展属性为文件添加标记,以便在程序中识别和处理特定类型的文件。
  4. 元数据存储:扩展属性可用于存储文件的元数据,如作者、创建日期、文件版本等。

要设置或修改文件的扩展属性,可以使用 chattr 命令,要查看文件的扩展属性,可以使用 lsattr 命令

chattr

注意,通常情况下,不要使用 chattr 命令修改 /、/dev/、/tmp/、/var/ 等目录的隐藏属性,很容易导致系统无法启动

语法

1
chattr [参数] [模式] 文件

参数

参数 说明
-R 递归处理目录下的所有文件
-v 设置文件或目录版本
-V 显示指令执行过程
+ 开启文件或目录的该项属性
关闭文件或目录的该项属性
= 指定文件或目录的该项属性
模式 说明
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖 / 删除内容(Append Only,具有设置了’a’属性的文件只能以追加模式打开进行写入。只有超级用户或拥有CAP_LINUX_IMMUTABLE能力的进程才能设置或清除此属性。
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 当设置了’D’属性的目录被修改时,更改会同步写入磁盘;这相当于对一部分文件应用了’dirsync’挂载选项。
d 使用 dump 命令备份时忽略本文件 / 目录
C 具有设置了’C’属性的文件将不会被写时复制(copy-on-write)更新。此属性仅在支持写时复制的文件系统上受支持。
c 默认将文件或目录进行压缩,具有设置了’c’属性的文件会被内核自动在磁盘上压缩。从该文件读取时会返回未经压缩的数据,向该文件写入时会在存储到磁盘之前压缩数据。
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)设置了’t’属性的文件将不会在文件末尾与其他文件合并存在部分块片段(对于支持尾部合并的文件系统而言)。这对于直接读取文件系统且不理解尾部合并文件的应用程序(如LILO)是必要的。请注意:截至目前为止,ext2、ext3和ext4文件系统不支持尾部合并。
x 可以直接访问压缩文件中的内容
e e’属性表示文件使用范围(extents)来映射磁盘上的块。使用chattr命令无法删除具有此属性的文件。
E 设置了’E’属性的文件、目录或符号链接由文件系统进行加密。这个属性不能通过chattr命令进行设置或清除,但可以通过lsattr命令显示。
F 设置了’F’属性的目录表示在该目录内进行的所有路径查找都以不区分大小写的方式进行。这个属性只能在启用了casefold功能的空目录上进行更改。
j 设置了’j’属性的文件在被写入文件本身之前,会先将其所有数据写入ext3或ext4日志(如果文件系统以”data=ordered”或”data=writeback”选项挂载,并且文件系统具有日志功能)。当文件系统以”data=journal”选项挂载时,所有文件数据已经被记录在日志中,此属性不产生任何效果。只有超级用户或拥有CAP_SYS_RESOURCE能力的进程可以设置或清除此属性。
m 设置了’m’属性的文件在支持逐文件压缩的文件系统上将不会进行压缩。
N 设置了’N’属性的文件表示文件的数据存储在inode本身内部。它不能通过chattr命令设置或清除,但可以通过lsattr命令显示。
P 设置了’P’属性的目录将强制执行项目ID的分层结构。这意味着在该目录中创建的文件和目录将继承目录的项目ID,重命名操作受限制,当文件或目录移动到另一个目录时,项目ID必须匹配。此外,只有在文件的项目ID与目标目录匹配时,才能创建文件的硬链接。
T 设置了’T’属性的目录将被视为目录层次结构的顶部,用于Orlov块分配器。这是对ext3和ext4使用的块分配器的提示,表明该目录下的子目录不相关,因此应该在分配目的上分散分配。例如,在/home目录上设置’T’属性是一个非常好的主意,这样/home/john和/home/mary会被放置在不同的块组中。对于未设置此属性的目录,Orlov块分配器将尽可能地将子目录分组放置在更接近一起的位置。
V 设置了’V’属性的文件启用了fs-verity(文件系统完整性验证)。该文件无法被写入,并且文件系统会自动对从文件中读取的所有数据进行验证,以确保其与覆盖整个文件内容的密码散列(例如通过Merkle树)相匹配。这使得能够高效地对文件进行认证。这个属性不能通过chattr命令设置或清除,但可以通过lsattr命令显示。

限制

在当前主流Linux内核中实现的ext2、ext3和ext4文件系统不支持对’c’、’s’和’u’属性的识别。
设置’a’和’i’属性不会影响对已存在文件描述符的写入能力。
‘j’选项只对ext3和ext4文件系统有用。
‘D’选项只在Linux内核版本2.5.19及以后的版本中有用。

实例

给文件添加无法修改的权限

1
2
3
4
5
6
7
[root@localhost ~]# chattr +i anaconda-ks.cfg 
[root@localhost ~]# lsattr anaconda-ks.cfg
----i----------- anaconda-ks.cfg

[root@localhost ~]# rm -r anaconda-ks.cfg
rm:是否删除普通文件 "anaconda-ks.cfg"?y
rm: 无法删除"anaconda-ks.cfg": 不允许的操作

从指定文件移除隐藏属性

1
2
3
[root@localhost ~]# chattr -i anaconda-ks.cfg 
[root@localhost ~]# lsattr anaconda-ks.cfg
---------------- anaconda-ks.cfg

给目录添加隐藏属性,递归操作

1
2
3
4
5
6
[root@localhost ~]# chattr -R +i data/
[root@localhost ~]# lsattr data/
----i----------- data/a.txt
----i----------- data/b.txt
[root@localhost ~]# lsattr data/ -d
----i----------- data/

设置文件只能添加内容,无法覆盖

1
2
3
4
5
6
[root@localhost ~]# echo "123456" > a.txt
[root@localhost ~]# chattr +a a.txt
[root@localhost ~]# echo "123456" > a.txt
bash: a.txt: 不允许的操作
[root@localhost ~]# echo "123456" >> a.txt
[root@localhost ~]# cat a.txt

不再修改文件或目录的访问时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# chattr +A anaconda-ks.cfg 
[root@localhost ~]# lsattr anaconda-ks.cfg
-------A-------- anaconda-ks.cfg
[root@localhost ~]# vim anaconda-ks.cfg
[root@localhost ~]# stat anaconda-ks.cfg
文件:"anaconda-ks.cfg"
大小:1371 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:67259498 硬链接:1
权限:(0444/-r--r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2023-02-18 10:43:12.451650907 +0800
最近更改:2023-02-18 10:43:12.451650907 +0800
最近改动:2023-02-18 10:43:12.453650916 +0800
创建时间:-
[root@localhost ~]# vim anaconda-ks.cfg
[root@localhost ~]# stat anaconda-ks.cfg
文件:"anaconda-ks.cfg"
大小:1384 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:67664943 硬链接:1
权限:(0444/-r--r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2023-02-18 10:43:31.555734612 +0800
最近更改:2023-02-18 10:43:31.555734612 +0800
最近改动:2023-02-18 10:43:31.555734612 +0800
创建时间:-
[root@localhost ~]# echo "123456" > anaconda-ks.cfg
[root@localhost ~]# tail -n 1 anaconda-ks.cfg

lsattr

lsattr用于查看文件的扩展属性

语法

1
lsatrr [参数] [文件]

参数

参数 说明
-a 显示所有文件和目录,包括以”.”为名称开头字符的额外内建,现行目录”.”与上层目录”..”
-d 显示目录名称,而非其内容
-l 此参数目前没有任何作用。
-R 递归处理,将指定目录下的所有文件及子目录一并处理
-v 显示文件或目录版本。

参考

chattr - Linux 手册页 (man7.org)
Linux基础命令-chattr更改文件隐藏属性_Linux学习中的博客-CSDN博客