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 命令来修改文件的属性。

浙公网安备 33010602011771号