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