chattr概述
chattr
是 Linux 系统中的一个命令,用于更改文件或目录的属性。这些属性通常与文件的写入、删除、备份等操作有关。通过 chattr
,你可以为文件或目录设置一些特殊的标志(例如不可修改、只能追加等),以提高文件系统的安全性或控制特定的行为。
基本语法
chattr [选项] [符号][属性] 文件名
- 选项: 用于控制
chattr
的行为。 - 符号:
+
表示添加属性,-
表示移除属性,=
表示将属性设置为指定的值。 - 属性: 要应用的属性标志,如
i
表示不可修改,a
表示只能追加等。 - 文件名: 需要更改属性的文件或目录。
常见选项
- -R: 递归地改变目录及其所有子文件的属性。
- -V: 显示详细信息,解释执行了哪些操作。
- -f: 抑制错误信息,只显示成功的更改。
常见属性标志
以下是 chattr
支持的一些常见属性标志,适用于 ext2
、ext3
和 ext4
文件系统:
a
: 追加模式(append only)。只能向文件末尾追加数据,不能修改或删除已有内容。适用于日志文件。i
: 不可修改(immutable)。文件不能被修改、删除、重命名或链接。d
: 禁止备份(no dump)。该文件在执行dump
备份程序时会被忽略。s
: 安全删除(secure deletion)。文件删除后,其数据会被覆盖,无法恢复。u
: 可恢复删除(undeletable)。删除文件时保存其内容以便恢复。c
: 压缩(compress)。文件会在磁盘上被压缩保存,但现在一般不使用。A
: 不更新atime
(no atime updates)。访问文件时不更新其访问时间。
使用实例
- 查看文件或目录的属性
要查看文件或目录的当前属性,可以使用 lsattr
命令:
lsattr filename
输出类似如下内容,----i--------
表示文件的 i_flags
:
----i--------e-- filename
- 将文件设置为不可修改
chattr +i filename
该命令将文件 filename
设置为不可修改状态。文件无法被删除、重命名或修改。
- 取消文件的不可修改属性
chattr -i filename
该命令将移除文件的不可修改标志,使其可以再次被修改或删除。
- 设置文件只能追加数据
chattr +a filename
此命令将文件设置为只能追加模式,适合用于日志文件,以防止修改现有内容;添加此标志后只能执行类似 “echo xxx >> filename”的指令,“vi”、“echo > ”等指令都不可执行。
- 递归修改目录及其子文件的属性
chattr -R +i dirname
该命令将目录 dirname
及其所有子文件设置为不可修改。
- 将文件属性设置为指定值
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 {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Creation time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks; /* Blocks count */
__le32 i_flags; /* File flags */
...
i_flags详解
在文件系统中,inode
是存储文件或目录元数据的结构,其中 i_flags
是用于记录特定文件或目录的行为标志(flags),即一些特殊的文件系统属性。它可以控制文件的某些操作行为,例如只读、不可删除、不可修改等。
在 Linux 系统中的 ext4
文件系统中,常见的 i_flags
主要包括以下几种:
- EXT4_SECRM_FL (
0x00000001
): 文件被标记为安全删除,当删除时需要额外的操作保障安全。 - EXT4_UNRM_FL (
0x00000002
): 文件标记为可恢复删除,即删除后可以恢复。 - EXT4_COMPR_FL (
0x00000004
): 文件是否压缩(已废弃)。 - EXT4_SYNC_FL (
0x00000008
): 所有对该文件的写入操作会被同步到磁盘上。 - EXT4_IMMUTABLE_FL (
0x00000010
): 文件不可修改,不能被删除或写入。 - EXT4_APPEND_FL (
0x00000020
): 文件只能在末尾追加数据,不能修改现有内容。 - EXT4_NODUMP_FL (
0x00000040
): 文件不会被dump
程序备份。 - EXT4_NOATIME_FL (
0x00000080
): 访问文件时不更新atime
(访问时间)。 - EXT4_DIRTY_FL (
0x00000100
): 文件数据脏,未同步到磁盘(内部使用)。 - EXT4_COMPRBLK_FL (
0x00000200
): 文件系统支持压缩块(已废弃)。 - EXT4_NOCOMPR_FL (
0x00000400
): 文件不能被压缩(已废弃)。 - EXT4_ENCRYPT_FL (
0x00000800
): 文件或目录被加密。 - EXT4_INDEX_FL (
0x00001000
): 目录使用索引方式存储,提升目录查询速度。 - EXT4_JOURNAL_DATA_FL (
0x00002000
): 文件的所有数据写入被记录到日志(journal)中。 - EXT4_NOTAIL_FL (
0x00008000
): 目录不使用尾部合并(主要用于文件系统的性能优化)。 - 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
ext2
和 ext4
文件系统中的 i_flags
(inode 标志)具有许多相似之处,但也有一些重要的区别。随着文件系统的演进,ext4
引入了更多功能,因此在 i_flags
中也反映了这些变化。
相似点
许多 i_flags
在 ext2
和 ext4
文件系统中都存在,并且功能相同。这些包括:
-
EXT2_SECRM_FL / EXT4_SECRM_FL: 安全删除标志,标记文件需要安全删除。
-
EXT2_UNRM_FL / EXT4_UNRM_FL: 可恢复删除标志,标记文件在删除后可以恢复。
-
EXT2_SYNC_FL / EXT4_SYNC_FL: 同步写标志,标记文件的写操作需要立即同步到磁盘。
-
EXT2_IMMUTABLE_FL / EXT4_IMMUTABLE_FL: 文件不可修改,防止删除、重命名、修改。
-
EXT2_APPEND_FL / EXT4_APPEND_FL: 文件只能追加数据,无法修改现有内容。
-
EXT2_NODUMP_FL / EXT4_NODUMP_FL: 标记文件不会被
dump
备份工具备份。 -
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_FL 和 EXT2_COMPRBLK_FL: 这些与文件压缩相关的标志在
ext2
中存在,但已在ext4
中废弃。尽管在早期设计时曾考虑支持压缩,但ext4
放弃了这一功能。 -
EXT2_NOCOMPR_FL: 禁止文件压缩的标志,在
ext2
中用于控制压缩行为,但在ext4
中没有实际作用。
3. 文件系统支持差异
-
日志相关的标志:
ext2
是一个无日志文件系统,而ext4
是带日志功能的文件系统。因此,ext4
引入了像 EXT4_JOURNAL_DATA_FL 这样的标志,而ext2
没有相应功能。 -
性能优化标志:
ext4
文件系统中加入了针对性能优化的标志,比如 EXT4_INDEX_FL 和 EXT4_NOTAIL_FL,这些在ext2
中是不存在的,因为ext2
文件系统在设计上较为简单,缺乏这些高级功能。
总结
标志 | ext2 | ext4 | 描述 |
---|---|---|---|
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
核心功能的基础上,增加了更多高级特性,尤其是在性能优化、加密和日志方面,适应了现代系统的需求。