Linux下修改文件属性 —— chattr和lsattr命令介绍

1. 介绍

chattr可用于修改Linux文件系统上的文件属性。例如,使用chattr将某个文件设置为’i’属性(不可修改),则即使在root用户下给文件chmod成777模式,也是无法修改、删除和重命名的。可借助这个命令对某些文件进行锁定。chattr可作用于文件或目录。

相应的,lsattr命令用于打印文件的属性。

2. chattr命令

2.1 选项

-R 递归地作用于所有子目录及文件(默认不递归)。
-V 将chattr命令的输出变得详细些,并且会打印出chattr命令的版本。
-f 不打印错误信息。
-v version 给文件设置一个版本号。

2.2 命令用法

命令格式如下:
chattr [ -RVf ] [ -v version ] [ mode ] files…
即,对文件’files’设置为属性’mode’。其中mode可以设置为 “+-=[acdeijstuADST]” 。

例如:

[jc_gbd@ubuntu]test:$ sudo chattr +a main.c

上述mode中:

  • ‘+’ 表示在文件的现有属性上增加后面的属性。
  • ‘-’ 表示在文件的现有属性上删除后面属性。
  • ‘=’ 不管原有属性,直接设置为后面的属性。

可以同时增加/删除/设置多个属性。

  • ‘A’ 文件的atime(access time)记录不可被修改。
  • ‘a’ 将文件设置为append-only-file,即只可向文件追加内容,而不能覆盖和删除。只有特权用户或者拥有CAP_LINUX_IMMUTABLE的普通用户可以设置这个属性。
  • ‘c’ 文件会自动在内核中压缩后存储。读取文件操作会得到未压缩的数据,而写入文件操作会先把数据压缩再存到磁盘中。
  • ‘D’ 有这个属性的目录被修改时,其更改会同步写到磁盘上。相当于mount命令的dirsync选项。
  • ‘d’ 文件不会成为dump程序的备份目标。
  • ‘e’ 文件使用extents来映射磁盘上的块。chattr可能无法删除这个属性。
  • ‘i’ 文件不能被修改,包括写入、删除、重命名和建立符号链接等。只有特权用户或者拥有CAP_LINUX_IMMUTABLE的普通用户可以设置这个属性。
  • ‘j’ 对于日志文件系统ext3,如果挂载时使用”data=ordered”或者”data=writeback”选项,’j’属性会增加”data=journal”的作用,即,向文件写入的新数据会先写到日志,再写到文件里。如果挂载时本来就使用了”data=journal”,则’j’没有作用。只有特权用户或者拥有CAP_LINUX_IMMUTABLE的普通用户可以设置这个属性。
  • ’s’ 当文件被删除时,它占用的block会被清零并回收,即完全删除,保护你的隐私。
  • ‘S’ 当文件被修改时,修改会同时写到磁盘。相当于mount时的sync选项。
  • ‘T’ 设置该属性的目录,会被认为是Orlov block allocator机制的顶层目录,它告诉ext3/ext4,它的各个子目录是没有关系的,在为子目录分配磁盘块时也应尽量分离来。而在没有设置该属性的目录下,子目录通常会分配相近的块。该属性很适用于设置到/home目录,来隔离各用户文件夹。
  • ‘t’ 文件在于其他文件合并(tail-merging)时,不会产生尾部块碎片。
  • ‘u’ 文件在被删除后,其内容仍被保存,允许用于请求数据恢复。

另外,还有一些文件固有或只读的属性,chattr无法更改,但仍可以通过lsattr命令查看到:

  • ‘h’ huge file (文件以blocksize为单位存储它的块而不是以sector为单位,意味着文件大小超过(或曾经超过)2TB。)
  • ‘E’ a compressed file has a compression error
  • ‘I’ indexed directory using hashed trees
  • ‘X’ raw contents of a compressed file can be accessed directly
  • ‘Z’ a compressed file is dirty

3. lsattr命令

通过lsattr打印文件属性的用法很简单,形如:

[jc_gbd@ubuntu]test:$ lsattr main.c
-------A-----e- main.c

也可以加选项,除了上面介绍的-R, -V, -v选项,lsattr还有如下选项:
-a 列出隐藏文件(’.’开头的文件名)。
-d 像文件一样打印目录的属性(只列出目录,而不列出目录中内容)。

4. 使用限制

属性’c’, ‘s’和’u’可能在内核中并没有实现。’j’只适用于ext3文件系统。

chattr属于e2fsprogs包的一部分,因此可认为你系统中的chattr命令和文件系统肯定是配套的。也意味着chattr/lsattr主要用于ext2/ext3/ext4文件系统中的文件或目录(可通过mount命令查看你要更改属性的文件是否位于ext文件系统中)。
实际上,只要文件系统在内核中实现了相应操作的ioctl(request为FS_IOC32_SETFLAGS/FS_IOC_SETFLAGS)的处理,就可以支持chattr。例如jfs、ubifs、reiserfs等文件系统目前也支持了chattr命令处理。对于不支持该命令的文件系统(如tmpfs、vfat、fuseblock等),在执行chattr时会报错:

[jc_gbd@ubuntu]run:$ sudo chattr +i call.sh 
chattr: Inappropriate ioctl for device while reading flags on call.sh

你可能感兴趣的:(Linux系统)