自学内容网 自学内容网

深入理解chattr

chattr概述

chattr 是 Linux 系统中的一个命令,用于更改文件或目录的属性。这些属性通常与文件的写入、删除、备份等操作有关。通过 chattr,你可以为文件或目录设置一些特殊的标志(例如不可修改、只能追加等),以提高文件系统的安全性或控制特定的行为。

基本语法

chattr [选项] [符号][属性] 文件名 
  • 选项: 用于控制 chattr 的行为。
  • 符号: + 表示添加属性,- 表示移除属性,= 表示将属性设置为指定的值。
  • 属性: 要应用的属性标志,如 i 表示不可修改,a 表示只能追加等。
  • 文件名: 需要更改属性的文件或目录。

常见选项

  • -R: 递归地改变目录及其所有子文件的属性。
  • -V: 显示详细信息,解释执行了哪些操作。
  • -f: 抑制错误信息,只显示成功的更改。

常见属性标志

以下是 chattr 支持的一些常见属性标志,适用于 ext2ext3ext4 文件系统:

  • a: 追加模式(append only)。只能向文件末尾追加数据,不能修改或删除已有内容。适用于日志文件。
  • i: 不可修改(immutable)。文件不能被修改、删除、重命名或链接。
  • d: 禁止备份(no dump)。该文件在执行 dump 备份程序时会被忽略。
  • s: 安全删除(secure deletion)。文件删除后,其数据会被覆盖,无法恢复。
  • u: 可恢复删除(undeletable)。删除文件时保存其内容以便恢复。
  • c: 压缩(compress)。文件会在磁盘上被压缩保存,但现在一般不使用。
  • A: 不更新 atimeno atime updates)。访问文件时不更新其访问时间。

使用实例

  1. 查看文件或目录的属性

要查看文件或目录的当前属性,可以使用 lsattr 命令:

lsattr filename 

输出类似如下内容,----i-------- 表示文件的 i_flags

----i--------e-- filename 
  1. 将文件设置为不可修改
chattr +i filename 

该命令将文件 filename 设置为不可修改状态。文件无法被删除、重命名或修改。

  1. 取消文件的不可修改属性
chattr -i filename 

该命令将移除文件的不可修改标志,使其可以再次被修改或删除。

  1. 设置文件只能追加数据
chattr +a filename  

此命令将文件设置为只能追加模式,适合用于日志文件,以防止修改现有内容;添加此标志后只能执行类似 “echo xxx >> filename”的指令,“vi”、“echo > ”等指令都不可执行。

  1. 递归修改目录及其子文件的属性
chattr -R +i dirname 

该命令将目录 dirname 及其所有子文件设置为不可修改。

  1. 将文件属性设置为指定值
chattr =i filename 

此命令将文件的属性只保留 i,移除文件的其他所有属性。

查看和验证

在更改文件或目录的属性后,建议使用 lsattr 命令验证修改是否生效:

lsattr filename 
总结
  • chattr 是一个强大的工具,用于控制文件的行为,尤其适用于需要提高安全性和防止误操作的场景。
  • 使用 +-= 符号来添加、移除或设置文件属性。

原理

内核源码

chattr其实修改的内容为inode中的i_flags,i_flags变量类型为小端序32bit的无符号整型变量(little ending unsigned int)

[zyq@zyq ~]$ cat linux-5.16.14/fs/ext2/ext2.h 
...
struct ext2_inode {
__le16i_mode;/* File mode */
__le16i_uid;/* Low 16 bits of Owner Uid */
__le32i_size;/* Size in bytes */
__le32i_atime;/* Access time */
__le32i_ctime;/* Creation time */
__le32i_mtime;/* Modification time */
__le32i_dtime;/* Deletion Time */
__le16i_gid;/* Low 16 bits of Group Id */
__le16i_links_count;/* Links count */
__le32i_blocks;/* Blocks count */
__le32i_flags;/* File flags */
...

i_flags详解

在文件系统中,inode 是存储文件或目录元数据的结构,其中 i_flags 是用于记录特定文件或目录的行为标志(flags),即一些特殊的文件系统属性。它可以控制文件的某些操作行为,例如只读、不可删除、不可修改等。

在 Linux 系统中的 ext4 文件系统中,常见的 i_flags 主要包括以下几种:

  1. EXT4_SECRM_FL (0x00000001): 文件被标记为安全删除,当删除时需要额外的操作保障安全。
  2. EXT4_UNRM_FL (0x00000002): 文件标记为可恢复删除,即删除后可以恢复。
  3. EXT4_COMPR_FL (0x00000004): 文件是否压缩(已废弃)。
  4. EXT4_SYNC_FL (0x00000008): 所有对该文件的写入操作会被同步到磁盘上。
  5. EXT4_IMMUTABLE_FL (0x00000010): 文件不可修改,不能被删除或写入。
  6. EXT4_APPEND_FL (0x00000020): 文件只能在末尾追加数据,不能修改现有内容。
  7. EXT4_NODUMP_FL (0x00000040): 文件不会被 dump 程序备份。
  8. EXT4_NOATIME_FL (0x00000080): 访问文件时不更新 atime(访问时间)。
  9. EXT4_DIRTY_FL (0x00000100): 文件数据脏,未同步到磁盘(内部使用)。
  10. EXT4_COMPRBLK_FL (0x00000200): 文件系统支持压缩块(已废弃)。
  11. EXT4_NOCOMPR_FL (0x00000400): 文件不能被压缩(已废弃)。
  12. EXT4_ENCRYPT_FL (0x00000800): 文件或目录被加密。
  13. EXT4_INDEX_FL (0x00001000): 目录使用索引方式存储,提升目录查询速度。
  14. EXT4_JOURNAL_DATA_FL (0x00002000): 文件的所有数据写入被记录到日志(journal)中。
  15. EXT4_NOTAIL_FL (0x00008000): 目录不使用尾部合并(主要用于文件系统的性能优化)。
  16. EXT4_DIRSYNC_FL (0x00010000): 目录的更改将被同步到磁盘上。

这些标志位可以通过 lsattr 命令查看并通过 chattr 命令更改。例如,要将文件设置为不可修改(immutable),可以使用以下命令:

chattr +i filename 
[root@node09 ~]# hexdump -s 124K -n 20K /root/disk.img  -C
...
0001f580  a4 81 00 00 03 00 00 00  fd db f0 66 09 dc f0 66  |...........f...f|
0001f590  00 dc f0 66 00 00 00 00  00 00 01 00 02 00 00 00  |...f............|
0001f5a0  10 00 00 00 01 00 00 00  01 02 00 00 00 00 00 00  |................|
0001f5b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0001f5e0  00 00 00 00 38 8d b3 4e  00 00 00 00 00 00 00 00  |....8..N........|
0001f5f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00024000

0001f5a0  10 00 00 00 01 00 00 00  01 02 00 00 00 00 00 00  |................| 

如上红色标记的即为i_flags,因为是小端序所以需要从又往左读即0010(0x00000010),代表文件不可修改,不能被删除或写入;通过这些标志,系统管理员可以控制文件的行为,提高文件系统的安全性、稳定性或性能。

ext2 VS ext4

ext2ext4 文件系统中的 i_flags(inode 标志)具有许多相似之处,但也有一些重要的区别。随着文件系统的演进,ext4 引入了更多功能,因此在 i_flags 中也反映了这些变化。

相似点

许多 i_flagsext2ext4 文件系统中都存在,并且功能相同。这些包括:

  1. EXT2_SECRM_FL / EXT4_SECRM_FL: 安全删除标志,标记文件需要安全删除。

  2. EXT2_UNRM_FL / EXT4_UNRM_FL: 可恢复删除标志,标记文件在删除后可以恢复。

  3. EXT2_SYNC_FL / EXT4_SYNC_FL: 同步写标志,标记文件的写操作需要立即同步到磁盘。

  4. EXT2_IMMUTABLE_FL / EXT4_IMMUTABLE_FL: 文件不可修改,防止删除、重命名、修改。

  5. EXT2_APPEND_FL / EXT4_APPEND_FL: 文件只能追加数据,无法修改现有内容。

  6. EXT2_NODUMP_FL / EXT4_NODUMP_FL: 标记文件不会被 dump 备份工具备份。

  7. EXT2_NOATIME_FL / EXT4_NOATIME_FL: 访问文件时不会更新 atime(访问时间),可减少磁盘写操作。

不同点

随着文件系统的发展,ext4 引入了一些 ext2 不支持或不完全实现的标志,并且废弃了一些 ext2 中的标志。以下是主要区别:

1. 新增的 ext4 专有标志

  • EXT4_ENCRYPT_FL: 文件或目录被加密。这是 ext4 文件系统中新增的功能,允许对文件或目录进行加密处理。

  • EXT4_INDEX_FL: 目录使用 B-tree 索引。在 ext4 中,目录的存储结构可以是索引化的(通过 B-tree 提升查询性能),而 ext2 没有这个功能。

  • EXT4_JOURNAL_DATA_FL: 文件的所有数据写入被记录到日志中。这个功能在 ext4 中较常见,因为 ext4 文件系统支持日志功能,而 ext2 本身不支持日志。

  • EXT4_NOTAIL_FL: 目录不使用尾部合并。这个标志是为解决某些场景下的性能优化问题而设计的,ext2 中则没有广泛应用。

2. 废弃或不再使用的标志

  • EXT2_COMPR_FLEXT2_COMPRBLK_FL: 这些与文件压缩相关的标志在 ext2 中存在,但已在 ext4 中废弃。尽管在早期设计时曾考虑支持压缩,但 ext4 放弃了这一功能。

  • EXT2_NOCOMPR_FL: 禁止文件压缩的标志,在 ext2 中用于控制压缩行为,但在 ext4 中没有实际作用。

3. 文件系统支持差异

  • 日志相关的标志: ext2 是一个无日志文件系统,而 ext4 是带日志功能的文件系统。因此,ext4 引入了像 EXT4_JOURNAL_DATA_FL 这样的标志,而 ext2 没有相应功能。

  • 性能优化标志: ext4 文件系统中加入了针对性能优化的标志,比如 EXT4_INDEX_FLEXT4_NOTAIL_FL,这些在 ext2 中是不存在的,因为 ext2 文件系统在设计上较为简单,缺乏这些高级功能。

总结
标志ext2ext4描述
SECRM_FL安全删除标志
UNRM_FL可恢复删除标志
SYNC_FL同步写入到磁盘
IMMUTABLE_FL文件不可修改
APPEND_FL只能追加数据
NODUMP_FL禁止 dump 备份
NOATIME_FL禁止更新访问时间
COMPR_FL✔ (废弃)压缩文件标志(废弃于 ext4
NOCOMPR_FL✔ (废弃)禁止压缩标志(废弃于 ext4
ENCRYPT_FL文件/目录加密标志
INDEX_FL目录使用 B-tree 索引
JOURNAL_DATA_FL启用日志记录(ext4 支持日志)
NOTAIL_FL禁止尾部块合并(优化性能)

ext4 在保持 ext2 核心功能的基础上,增加了更多高级特性,尤其是在性能优化、加密和日志方面,适应了现代系统的需求。


原文地址:https://blog.csdn.net/zyqash/article/details/142452432

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!