chattr 和 lsattr 命令详解

lsattr 命令

lsattr 命令用于查看文件的第二扩展文件系统属性。

语法:

lsattr(选项)(参数)

 

选项:

-E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从设备直接获得的。
-D:显示属性的名称,属性的默认值,描述和用户是否可以修改属性值的标志。
-R:递归的操作方式;
-V:显示指令的版本信息;
-a:列出目录中的所有文件,包括隐藏文件。

  

lsattr 经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时,必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备。

chattr 命令

chattr 命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。

  

语法:

chattr  (选项)

选项:

-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。

  

1、用chattr命令防止系统中某个关键文件被修改:

# chattr +i /etc/resolv.conf

然后用mv /etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。

vim编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉:

chattr -i /etc/resolv.conf

  

使用 lsattr 命令来显示文件属性:  

# lsattr /etc/resolv.conf

##输出结果:
----i-------- /etc/resolv.conf

  

2、让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:

# chattr +a /var/log/messages

  

详解:

chattr 和 lsattr 命令详解

-e 的解释是`The e attribute indicates that the file is using extents for mapping the blocks on disk.`

:e属性表示该文件正在使用扩展区来映射磁盘上的块

-I 的解释是`The I attribute is used by the htree program code to indicate that a directory is being indexed using hashed trees.`

: I htree程序代码使用I属性来指示使用散列树索引目录

这个‘e’属性表示,该文件在磁盘块映射上使用了extents。 这里的extents我们可以理解成是一个连续的范围。这个属性是不能通过chattr去除的。

 

关于 chattr 和 lsattr 的解释说明

lsattr:查看特殊权限
chattr:在EXT2文件系统上改变文件属性

用法

chattr  [+-=]  [ASacdistu]  [文件或目录名称]

  

chattr 改变EXT2文件系统上的一个文件的属性
参数符号格式是 +-=[acdeijstuADST]
操作符  '+'  表示将选中的属性增加到指定的文件上; ‘-' 则表示删除该属性;'=' 表示文件仅仅设置指定的属性

参数说明:

+-=:分别是”+”(增加)、”-“(减少)、”=”(设定)属性

 

  • A:当设定了属性A,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免诸如手提电脑容易产生磁盘I/* O错误的情况;

  • S:这个功能有点类似sync,是将数据同步写入磁盘中,可以有效避免数据流失;

  • a:设定a后,这个文件将只能增加数据而不能删除,只有root才能设定这个属性;

  • c:设定这个属性后,将会自动将此文件压缩,在读取时自动解压缩。但是在存储的时候,会现进行压缩在存储(对于大* 文件很有用);

  • d:当dump(备份)程序执行时,设定d属性将可使该文件(或目录)具有dump功效;+d 可以备份时跳过该文件

  • i:这个参数可以让一个文件”不能被删除、更名、设定链接,也无法写入数据,对于系统安全有很大的助益

  • j:当使用ext3文件系统格式时,设定j属性将使文件在写入时先记录在日志中,但是当filesystem设定参数为data=jour* nalled时,由于已经设定了日志,所以这个属性无效

  • s:当文件设定了s参数时,它会被完全移出这个硬盘空间

  • u:与s相反,当使用u配置文件时,数据内容其实还可以存在于磁盘中,可以用来取消删除

  • 大文件(h),

  • 压缩错误(E),

  • 索引目录(I),

  • 压缩的原始访问?(X),

  • 和压缩的零碎文件(Z).

介绍

除ext2外其它常见的文件系统,如ext3 ext4 NTFS 等都是日志型文件系统,所谓日志型文件系统即所有有行为会记录在磁盘,系统默认会预留一些空间来记录的操作行为,当系统不正常关机再开机时,不需要全盘扫描来恢复至系统正常状态。

Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

1. 与 Ext3 兼容。
    执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

2. 更大的文件系统和更大的文件。
    较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

3. 无限数量的子目录。
    Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

4. Extents。
    Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

5. 多块分配。
    当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

6. 延迟分配。
    Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

7. 快速 fsck。
    以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

8. 日志校验。
    日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

9. “无日志”(No Journaling)模式。
    日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

10. 在线碎片整理。
    尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

11. inode 相关特性。
    Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

12. 持久预分配(Persistent preallocation)。
    P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

13. 默认启用 barrier。
    磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)
    .-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
    loop:用来把一个文件当成硬盘分区挂接上系统
    ro:采用只读方式挂接设备
    rw:采用读写方式挂接设备
    iocharset:指定访问文件系统所用字符集

在Microsoft Winsows的世界,硬盘可以格式化成NTFS、FAT32、FATl6等等不同的格式。同樣地,在GNU/Linux底下也是有很多不同的文件系统格 式可供选择。当前在GNU/Linux底下,比较常用的有这几种格式:Ext2/Ext3、ReiserFS、XFS和JFS等数种。
 
    除了Ext2以外,其它几种都是日誌型文件系统。那什麼是日誌型文件系统呢? 就是系统会多用一些额外的空间纪錄硬盘的数据状态,因而在不正常开关机后,不需整个硬盘重新扫描来恢复正常的系统状态。

问题1: the file is using extents …, 但为什么lsattr中目录为什么也有`-e选项?

为什么目录也会显示-e -I问题,这个问题我觉得是man文档的准确性问题,众所周知:Linux下一切皆文件。这里其想表述的是文件,即所有的文件都支持,但为什么链接文件不支持,这里我们有留意到图中的软链是链接的目录,我们再来看下是软链的文件是否能正常显示

# lsattr /etc/system-release
lsattr: Operation not supported While reading flags on /etc/system-release

 发现软链的文件也是不行的 

问题2:什么是extents,扩展在这里是不好理解的?

lsattr-e 是指extents,是指ext(2,3,4)系列文件系统中支持的Extents属性,经常大量的搜索查找后,发现该属性有专门的介绍

Ext3等文件系统采用间接块映射,主要针对大文件操作,现今科技的发展和技术的普及,硬件的容量规模提升的非常快,当操作大文件时,大数据时, 效率极其低下。比如一个 100MB 大小的文件,在 Ext文件系统中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。

为解决该问题,Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent为一组连续的数据块,上述文件则表示为“ 该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

所以-e是指文件系统中的文件或目录是否支持该特性,该特性在现代操作系统中起到非常重要的作用。

问题3:The I attribute is used by the htree program code, htree是什么?

因为man文档是介绍的是htree programe,所以起初的我理所应当的理解为系统命令,但经过验证后发现不是一个系统命令。

yum whatprovides htree

  

问题到这里为止,我觉得该单词不够成我对该句的理解,所以当时对其也没有放太多心思,不过后来发现这个想法是错误的!!

Btrfs: B-tree file system

其实是一个文件系统,大家可以在btrfs文件系统wiki,还有这里的这里还有介绍  

问题4:indicate that a directory is being indexed using hashed trees。indexed using hashed trees被引用?

最初的理解是被软链索引过的目录会有-I的选项,我们来验证下,从上面的这幅图执行ll命令返回结果的第二列数字看,所有目录都有被链接,但lsattr命令返回的结果却并非所有的目录均有属性I。所以该选项只能猜测并验证了。进一步查看 chattr命令后发现,该属性It may not be set or reset using chattr(1)。该选项的概念也只能猜测:

    系统对特有的常被引用或其它程序调用的目录添加该属性,以提升速度和提高效率。

做一个简单的验证。自己创建的目录默认没有I属性

自己创建的目录默认没有I属性

----------I--e- /lib64
----------I--e- /etc
-------------e- /home
-------------e- /lib
----------I--e- /lib64
----------I--e- /sbin

这些常见的lib库及经常会被调用的系统文件会被添加I属性。

举列说明:

我们有这样的需求:Linux系统下一个文件不允许别人修改、删除或者只允许添加,我们就可以使用chattr命令。

[root@serv01 test]# cat note.txt 
1.不许迟到
2.不许早退
3.不许抽烟
[root@serv01 test]# chattr +i note.txt

#root用户都不能编辑
[root@serv01 test]# vim note.txt 
[root@serv01 test]# cat note.txt
1.不许迟到
2.不许早退
3.不许抽烟

#root用户不能删除 修改
[root@serv01 test]# rm -f note.txt
rm: cannot remove `note.txt': Operation not permitted
[root@serv01 test]# echo "this is test" >> note.txt
-bash: note.txt: Permission denied

#ll查看文件属性不能看到,需要使用lsattr查看
[root@serv01 test]# ll note.txt
-rw-r--r--. 1 root root 45 Sep 21 17:46 note.txt
[root@serv01 test]# lsattr note.txt
----i--------e- note.txt

#root用户不能修改只是个相对概念,root用户可以修改文件的属性,就可以修改了
[root@serv01 test]# chattr -i note.txt
[root@serv01 test]# lsattr note.txt
-------------e- note.txt
[root@serv01 test]# vim note.txt
[root@serv01 test]# cat note.txt
1.不许迟到
2.不许早退
3.不许抽烟
4.可以不来上班

#留言板:自己说的话不能删除
[root@serv01 test]# vim note.txt
[root@serv01 test]# cat note.txt
1.不许迟到
2.不许早退
3.不许抽烟
4.可以不来上班
hello
[root@serv01 test]# chattr +a note.txt
[root@serv01 test]# lsattr note.txt
-----a-------e- note.txt
[root@serv01 test]# vim note.txt
[root@serv01 test]# ls
note.txt  note.txt~  note.txy~ note.txz~  
#删除,发现没有权限 
[root@serv01 test]# rm -rf *
rm: remove regular file `note.txt'? y
rm: cannot remove `note.txt': Operation not permitted
[root@serv01 test]# ls
note.txt  upload
[root@serv01 test]# echo "hello world" > note.txt 
-bash: note.txt: Operation not permitted
#只能使用追加的方式添加内容
[root@serv01 test]# echo "hello world" >> note.txt 
[root@serv01 test]# cat note.txt 
1.不许迟到
2.不许早退
3.不许抽烟
4.可以不来上班
hello
hello world

[root@serv01 test]# chattr -a note.txt 
[root@serv01 test]# lsattr note.txt 
-------------e- note.txt

 

上一篇:Django REST framework 中文教程1:序列化


下一篇:Android-Java-synchronized静态方法&字节码文件对象