首页 > 其他分享 >深入理解chattr

深入理解chattr

时间:2024-09-23 11:48:36浏览次数:8  
标签:文件 00 EXT4 ext2 ext4 chattr 理解 深入 FL

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 {
	__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 主要包括以下几种:

  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 核心功能的基础上,增加了更多高级特性,尤其是在性能优化、加密和日志方面,适应了现代系统的需求。

标签:文件,00,EXT4,ext2,ext4,chattr,理解,深入,FL
From: https://blog.csdn.net/zyqash/article/details/142452432

相关文章

  • ScanFormer:逐层抵达目标,基于特征金字塔的指代表达理解框架 | CVPR'24
    指代表达理解(REC)旨在在图像中定位由自由形式自然语言描述指定的目标对象。尽管最先进的方法取得了令人印象深刻的性能,但它们对图像进行了密集感知,包含与语言查询无关的多余视觉区域,导致额外的计算开销。这启发论文探讨一个问题:能否消除与语言无关的多余视觉区域,以提高模型的效率?......
  • Docker是什么-通过部署一个SpringBoot项目到Docker来快速理解它
    Docker是什么Docker是一个开源的容器化技术,它可以使开发人员将自己的程序打包成一个完整的镜像,这个镜像包含了程序以及它依赖的运行环境,可以任意系统的机器上部署,只要其安装了Docker。下面介绍下Docker和核心的概念容器化(container)服务程序部署可以分为三个阶段物理机器部署,......
  • mongo 副本集rs 理解和使用小结
    在MongoDB中,rs(通常指的是“replicaset”的缩写)是复制集(ReplicaSet)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本中引用复制集时。复制集是MongoDB用来实现数据冗余和高可用性的一个核心组件。复制集(ReplicaSet)的作用:数据冗余:复制集在多个服务器上维护相同数据的......
  • 邮件发送基础:深入SMTP协议、配置邮件服务器及Python实现
    目录引言SMTP协议基础定义与功能工作原理特性与优势邮件服务器配置第三方邮件服务商配置自建邮件服务器配置使用Python发送邮件安装smtplib和email模块发送简单纯文本邮件发送HTML格式邮件发送带附件的邮件完整示例:发送带附件的HTML邮件注意事项总结引言......
  • 对二进制减法的理解
    以下内容是写在通过NandGame网站学习二进制运算的,但是没想到写了这么多,想着也可以单独发出来写到这里突然想到最近在《编码:隐匿在计算机软硬件背后的语言》这本书看到二进制减法的运算,作者一开始不是直接讲减数要转换成补码再计算,而是讲了十进制减法为了不使用借位如何方便计算......
  • 【TS】加深TS理解的开发实战示例代码
    TS接口开发实战:基于类类型接口设计实现日期时间应用interfaceITimeDate{curTime:Date;setTime(cur:Date):void;getTime():Date;}classCTimeimplementsITimeDate{curTime:Date;constructor(cur:Date){this.curTime=cur;......
  • 深入探讨Hailuo AI:基于MoE、Dense和Diffusion模型的AI视频生成技术解析
    1.什么是HailuoAI?近年来,AI生成技术在视频制作领域迅速崛起。众多创新工具使得视频生成变得更加自动化和高效,而HailuoAI正是在这一背景下成为一款备受瞩目的工具。作为MiniMax开发的AI视频生成平台,HailuoAI运用了先进的**MixtureofExperts(MoE)**模型,为用户提供了高......
  • C语言深入理解指针(四)
    目录字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字函数指针数组转移表字符指针变量字符指针在之前我们有提到过,(字符)(指针)前面的字符代表着存储的元素为......
  • 【C++基础知识——std::visit函数理解】
    1.std::visit函数的定义std::visit通常用于访问std::variant类型的对象。std::variant是C++17引入的一种类型安全的联合体,可以存储多个类型中的一个。visit函数允许你通过一个访问者(visitor)来访问std::variant中存储的值,而不需要显式地检查存储的类型。2.示例#......
  • MySQL 优化器:理解与探秘
    在MySQL数据库的世界里,优化器扮演着至关重要的角色。它就像是一位幕后的魔法师,默默地为数据库的高效运行贡献着力量。那么,MySQL优化器究竟是什么?它又是如何工作的呢?让我们一起来揭开它的神秘面纱。一、MySQL优化器是什么?MySQL优化器是数据库管理系统中的一个核心组件......