chattr 命令与 lsattr 命令输出的含义

概述

Linux 中的 lsattr 命令用于显示文件目录上设置的属性。此外,属性是控制文件系统如何对待文件和目录的特殊标志,即文件系统对象。例如,属性可以将文件标记为不可变(immutable)或仅追加(append-only)。

正因为如此,理解 lsattr 的输出对 Linux 系统管理员来说非常重要。我们可能需要出于安全、合规或其他原因检查或修改文件属性。因此,掌握 lsattr 的解读方法可以使我们快速检查属性并判断是否需要进行更改。

在本教程中,我们将讨论 lsattr 命令及其输出含义,并了解如何使用 chattr 命令修改文件属性。

lsattr 命令

我们使用 lsattr 命令来列出支持扩展属性的 Linux 文件系统上的文件或目录的属性:

  • ext2
  • ext3
  • ext4
  • xfs
  • btrfs

通常,lsattr 的基本语法为:

$ lsattr [选项] [文件]

在实际使用中,lsattr 命令接受要检查的文件和目录名称作为参数。如果不指定文件,它将检查当前工作目录的属性。

因此,lsattr 命令为每个属性显示一个字符,以表示该属性是开启还是关闭

$ lsattr test.txt
----i--------e-- test.txt

此输出显示我们在 test.txt 上设置了不可变(immutable)和扩展格式(extent format)属性。

然而,lsattr 不会显示属性的名称。因此,我们需要了解每个字母代码的含义才能解读输出。

lsattr 选项

此外,lsattr 命令提供了多个选项,我们可以用它来修改其行为和输出。例如,可以使用 -R 选项递归列出目录中所有文件的属性,或使用 -a 选项仅列出已设置属性的文件。

-R 选项

-R 选项告诉 lsattr 递归列出所有文件和目录。它还会列出子目录的内容:

$ lsattr -R /home/abdulhameed
--------------e------- /home/abdulhameed/export-set_5.sh
--------------e------- /home/abdulhameed/export-set_4.sh
--------------e------- /home/abdulhameed/Music
...

正如我们所见,这是 /home/abdulhameed 目录及其子目录中所有文件和目录的列表。

-a 选项

默认情况下,lsattr 不会列出任何隐藏文件。然而,-a 选项会显示指定目录中所有文件的属性,包括以点号开头的隐藏文件

$ lsattr -a /home/abdulhameed
--------------e------- /home/abdulhameed/export-set_5.sh
--------------e------- /home/abdulhameed/export-set_4.sh
--------------e------- /home/abdulhameed/Music
--------------e------- /home/abdulhameed/export-set_2.sh
--------------e------- /home/abdulhameed/.cache
--------------e------- /home/abdulhameed/.themes
...
--------------e------- /home/abdulhameed/.bash_logout
--------------e------- /home/abdulhameed/.config
--------------e------- /home/abdulhameed/.vscode

因此,此命令列出 /home/abdulhameed 中的所有文件,包括 .cache.bash_logout 等隐藏文件。

-d 选项

默认情况下,如果将目录名作为参数提供,lsattr 会列出其内容。然而,-d 选项告诉 lsattr 命令仅列出目录本身,而不列出其内容

$ lsattr -d /home/abdulhameed
--------------e------- /home/abdulhameed

输出的是目录对象本身的属性,而不是其任何内容的属性。

-v 选项

-v 选项打印文件的版本或生成号:

$ lsattr -v /home/abdulhameed
707470822  --------------e------- /home/abdulhameed/export-set_5.sh
1241820598 --------------e------- /home/abdulhameed/export-set_4.sh
741945726  --------------e------- /home/abdulhameed/Music
264954810  --------------e------- /home/abdulhameed/export-set_2.sh
4092474338 --------------e------- file.txt
646553919  --------------e------- /home/abdulhameed/test
617306977  -----------I--e------- /home/abdulhameed/Downloads
...

显然,第一列的数字是版本号。版本号是一个 32 位无符号整数,每次修改文件时都会递增。因此,某些文件系统使用此数字来跟踪文件更改。

lsattr 输出

通常,lsattr 命令的输出由两列组成:

  • 属性
  • 文件或目录名称

此外,属性列显示一系列字母,代表为每个文件或目录设置或未设置的标志。因此,我们可以根据功能将这些属性分为几类。

删除与修改

这类属性控制文件和目录的删除、修改或重命名方式:

字母 属性 说明
a append-only(仅追加) 文件只能以追加模式打开进行写入。
i immutable(不可变) 文件不能被修改、删除或重命名。
s secure deletion(安全删除) 内核通过将数据块覆盖为零来安全擦除文件。
u undeletable(不可删除) 文件不能被删除,即使是超级用户也不行。

因此,这些属性可以保护重要文件和目录免受意外或恶意的更改。

性能与存储

此类属性影响文件和目录在磁盘上的存储、缓存和访问方式:

字母 属性 说明
A no atime update(不更新访问时间) 文件被读取时不更新访问时间。
c compressed(压缩) 文件写入磁盘时由内核自动压缩。
D synchronous directory update(同步目录更新) 对目录的任何写入操作都会立即同步到磁盘。
e extent format(扩展格式) 文件使用连续的块范围来映射存储块。
S synchronous update(同步更新) 对文件的任何写入操作都会立即同步到磁盘。
t no tail-merging(不合并尾部碎片) 文件末尾的碎片不会与其他文件合并。

本质上,我们可以使用这些属性来优化文件的性能和存储。

备份与恢复

这些属性决定文件和目录如何被备份和恢复程序处理:

字母 属性 说明
d no dump(不转储) 文件不是 dump 程序的备份候选文件。
j data journalling(数据日志) 对文件的任何写入操作首先写入外部日志,然后再写入磁盘。

因此,我们可以使用这些属性更有效地管理备份和恢复流程。

目录结构

这些属性仅适用于目录,影响它们如何存储条目和子目录:

字母 属性 说明
I indexed directory(索引目录) 目录以哈希树结构存储其条目以实现更快的查找。
T top of directory hierarchy(目录层次结构顶层) 目录是 Orlov 块分配器的目录层次结构的顶层。

此外,Orlov 块分配器是一种为目录分配磁盘块的方法。它尝试将相关的子目录分组到同一个块组中。因此,这可以提高性能。

chattr 命令

此外,我们可以使用 chattr 命令来修改支持扩展属性的 Linux 文件系统的文件和目录属性

$ chattr [选项] [属性] [文件]

其中,选项 是修改命令行为的标志,属性 是指示设置或清除哪些属性的字母,文件 是要修改的文件名。

我们可以使用以下符号作为属性的前缀:

  • +:添加属性
  • -:移除属性
  • =:设置属性(并清除其他所有属性)

让我们看一个向文件添加属性的示例:

$ chattr +i file.txt

此命令将不可变属性添加到 file.txt

同样,我们可以从文件中移除属性:

$ chattr -a file.txt

现在,file.txt 不再具有仅追加属性。

最后,我们可以设置文件具有某个属性并清除其他属性:

$ chattr =c file.txt

此命令为 file.txt 设置压缩属性,并清除之前为该文件设置的所有其他属性。

有些属性无法通过 chattr 修改:

  • E:压缩错误
  • h:大文件
  • I:索引目录
  • N:内联数据
  • X:压缩原始访问
  • Z:压缩脏文件

不过,lsattr 会列出这些属性。

此外,某些属性需要以 root 用户身份运行 chattr 命令:

  • a:仅追加
  • i:不可变
  • j:数据日志

让我们以普通用户身份在 file.txt 上设置 a 属性:

$ chattr +a file.txt
chattr: Operation not permitted while setting flags on file.txt

这会导致 chattr 返回错误。

结论

在本文中,我们首先学习了如何使用 lsattr 命令列出文件属性。然后,通过理解每个属性的含义来解读其输出。最后,我们探讨了如何使用 chattr 命令来修改文件的属性。

posted @ 2026-08-24 09:18  LoftyAmbition  阅读(8)  评论(0)    收藏  举报