文件属性是另外一种控制用户对系统访问的手段,这和你所用的文件系统有关,这里涉及的都是ext3文件系统。文件属性和文件权限很类似,文件属性是和某个特定的文件系统特有的,用来加强对文件的访问控制和安全保护。此外,文件属性是由sys_open()和sys_truncate()等文件系统调用检查和赋予的不受用户的识别号和其他因素的影响,这和文件权限有根本的区别。因此,这种文件访问的机制提供比文件权限控制更强的文件控制。可用的文件属性解析如下:
[code]A(don't update atime)[/code]
如果文件设定了这个属性,文件系统不会更新最后的访问时间。这对减少磁盘的I/O(尤其在笔记本电脑和NFS上,这个属性对提高文件系统的性能是很有效的)
a(append only)如果文件设定了这个属性,任何程序只能以添加模式打开这个文件。对于目录来说,只能在这个目录下添加新的目录或文件,不能对本目录或者本目录里的子目录或者文件作改名或删除才作。这个属性只有root才能设定或删除。
[code]c(compressed)[/code]
如果文件设定了这个属性,系统内核自动压缩该文件。
[code]d(no dump)[/code]
如果文件设定了这个属性,对文件系统(dump)备份时忽略该文件,文件系统备份参数在/etc/fstab里。
[code]i(immutable)[/code]
如果文件设定了这个属性,这个文件就不能修改,包括文件内容修改,文件删除,改名和建立符号链接。而对于目录来说,不能在本目录里建立和删除文件,只能对本目录里的文件作修改。值得注意的是,这个属性也会限制对存储时间的限制,因此,设定这个属性就不必设定A属性。这个属性只有root才能设定或删除。
[code]S(synchronous updates)[/code]
如果文件设定了这个属性,这个文件被修改时,文件系统会马上同步同步写入磁盘里。
[code]s(secure deletion)[/code]
如果文件设定了这个属性,这个文件被删除时, 原来被占用的区域会被重新填入0来覆盖。
[code]u(undeletable)[/code]
如果文件设定了这个属性,这个文件被删除时,文件内容会被保存,用户可以恢复被删除的文件。
文件属性相关的系统命令主要有两个:lsattr和chattr。
lsattr命令是查看文件属性的命令,参数比较少,和ls比较相似,具体可以参照相关的文档。下面看看具体的简单应用。
[code][chase@linuxtime doc]$ lsattr a-------------- a[/code]
上面是lsattr的简单运行结果。
chattr命令是对文件属性修改的命令,文件属性的修改没有像文件权限的修改提供两种方式,只能使用字符方式。它如何对属性进行设定呢?主要是通过+(添加),-(删除)或=(设定)。对于添加和删除就不多说了,主要说说=(设定)的使用,它是用来重新设定文件的属性的,下面我们看看具体的例子。
[code][chase@linuxtime doc]$ lsattr a;chattr +s a;lsattr a;chattr +u a;lsattr a;chattr =SA a;lsattr a
-------------- a
s------------- a
su------------ a
--S---A------- a[/code]
由上面可以看到,a 开始什么属性也没设定,但使用+(添加)s和u属性后,再使用=(设定)SA后,a的属性就有原来有s和u属性立刻被删除了。还有一点又指出的是
[code][chase@linuxtime doc]$ lsattr a; chattr = a; lsattr a
--S---A------- a
-------------- a[/code]
但我们要删除所有的文件属性时,只要使用=(设定)后什么都不加就可以了。
下面我们看看比较有常用属性对系统用户控制具体的作用。看看A的作用
[code][chase@linuxtime doc]$ lsattr a; stat a; cat a; stat a
-------------- a
File: "a"
Size: 0 Blocks: 0 IO Block: 4096 Regular File
Device: 303h/771d Inode: 13 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 500/ chase) Gid: ( 500/ chase)
Access: Wed Apr 16 11:24:16 2003
Modify: Wed Apr 16 11:00:28 2003
Change: Wed Apr 16 11:19:55 2003
File: "a"
Size: 0 Blocks: 0 IO Block: 4096 Regular File
Device: 303h/771d Inode: 13 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 500/ chase) Gid: ( 500/ chase)
Access: Wed Apr 16 11:24:22 2003
Modify: Wed Apr 16 11:00:28 2003
Change: Wed Apr 16 11:19:55 2003[/code]
上面例子看到,对于没有任何文件属性的文件a来说,对它作cat操作会造成Access Time的改变。我们再看看下面设定了A属性的文件a的情况。
[code][chase@linuxtime doc]$ chattr +A a; lsattr a;stat a; cat a; stat a
------A------- a
File: "a"
Size: 0 Blocks: 0 IO Block: 4096 Regular File
Device: 303h/771d Inode: 13 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 500/ chase) Gid: ( 500/ chase)
Access: Wed Apr 16 11:25:07 2003
Modify: Wed Apr 16 11:00:28 2003
Change: Wed Apr 16 11:29:25 2003
File: "a"
Size: 0 Blocks: 0 IO Block: 4096 Regular File
Device: 303h/771d Inode: 13 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 500/ chase) Gid: ( 500/ chase)
Access: Wed Apr 16 11:25:07 2003
Modify: Wed Apr 16 11:00:28 2003
Change: Wed Apr 16 11:29:25 2003[/code]
情况就改变,cat前后有文件属性A的文件a的Access Time是不变的。这个属性对于高负荷的文件系统的影响还是比较大的,这个对系统的性能有一定的影响。
对于a属性,我们在从例子出发来看看它的作用,
[code][root@linuxtime doc]# lsattr a; chattr +a a; lsattr a
-------------- a
----a--------- a
[chase@linuxtime doc]$ lsattr a; echo "a" > a;echo "b" >> a;cat a;
----a--------- a
bash: a: Operation not permitted
b[/code]
因为a属性只能root来设定,所以先用root把文件a的a属性设定好, 然后再回到普通用户对这个文件作一些操作。我们先对文件a作一个修改的操作,echo "a" > a, 是先删除文件a的内容,然后再把"a"字符写入文件a,因为文件a只能以添加模式打开,因此第一步就出错,相应的出错信息是"bash: a: Operation not permitted";然后,我们做一个添加的操作echo "b" >> a,这个只对文件a以添加模式打开,并写入内容。最后我们可以看到文件a里只有字符"b"没有字符"a",这就是a属性起的作用。
对于剩下的属性都需要内核的支持才能起作用,而且对于主流的内核都没有支持。因而在这里就不多说啦。


benny_feng 于 2006-08-29 09:11:58发表:
上面是一个设定超过soft限额时所允许的时限。从上面的例子看出:对于Block和Inode的soft限额的时限为7天。如果你要不同的时间单位,你就可以用seconds,minutes,hours,days,weeks和months来表示。quotaon: 这个命令是用来启动quota的,如果你还没有建立aquota.user和aquota.group两个文件的话,运行这个命令就会出错,所以在此之前一定要完成quotacheck的工作,然后直接运行quota -a就可以了。你还可以制定启动的是用户限额(u)或是用户组限额(g),还有指定特定的以配置限额的分区启动。
[code][root@lustr root]# quotaon -uv /home[/code]
上面就是指定目录/home启动用户限额。
quotaoff: 这个命令就是关闭quota,参数同上。
好了,我说了一大堆的东西。下面说说配置限额的步骤:
1. 先要启动文件系统的限额功能。这一步主要是要编辑/etc/fstab文件。
在通常的没启动限额功能的文件系统的fstab文件内容如下:
[code]LABEL=/ / ext3 defaults 1 1
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/sda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0[/code]
如果你想对/home这个目录下,也就是/dev/sda5分区启动限额功能的话,我们可以修改对应的home项为:
[code]LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2[/code]
你可以看到,在home对应项增加usrquota和grpquota(注意拼写)来实现用户和用户组的限额功能,然后重新启动linux。重起后,你要检查/etc/mtab是否在对应的home项加上usrquota和grpquota,如下:
[code]/dev/sda1 / ext3 rw 0 0
none /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
none /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/sda5 /home ext3 rw,usrquota,grpquota 0 0
none /dev/shm tmpfs rw 0 0
/dev/sda2 /usr ext3 rw 0 0
/dev/sda6 /var ext3 rw 0 0[/code]
你是不是觉得有点奇怪,我刚才不是只编辑fstab,那和mtab有什么关系呢? 主要原因是quota真正读取的文件是mtab,所以你一定要确认mtab在你修改fstab文件重起后一定更新为上面,这样才可以确认你对fstab的修改成功。
2. 首次扫描文件系统的使用情况。
主要使用quotacheck来扫描文件系统。如上所说,在扫描完毕后,就会在对应的目录下产生aquota.user和aquota.group, 这两个文件的位置都是在顶层的目录里,例如你对/home启动quota功能,那么这两个文件就会位于/home/下面。
[code][root@lustr home]# ls -l
total 31
-rw------- 1 root root 7168 Apr 22 04:29 aquota.group
-rw------- 1 root root 7168 Apr 22 05:14 aquota.user
drwx------ 2 chase chase 4096 Apr 22 05:05 chase
drwx------ 2 test test 1024 Apr 22 05:13 test[/code]
既然这两个文件都产生了,我们就可以启动文件系统限额功能对特定的用户或用户组实行限额。
3. 启动quota。
我们可以用前面介绍的quotaon来启动。
[code][root@lustr root]# quotaon -av
/dev/sda5 [/home]: group quotas turned on
/dev/sda5 [/home]: user quotas turned on[/code]
这是一个启动的输出结果。
4. 配置用户或用户组的限额
这一步可以参考edquota命令的说明。
上面基本把与quota配置相关的命令和文件都介绍了。
benny_feng 于 2006-08-29 09:09:42发表:
我就废话少说,先来介绍文件系统限额方式:soft: 就它的名字你可以了解到,这种方式不是硬性的,是具有弹性的限额方式。换句话说,用户的以达到这个配额,并在一定的条件下超过,但是必须在一定时间内把占用的空间减少到指定的soft的限额以下。
hard:这用方式就没有弹性可言啦,是一种硬性的不可逾越的限额上限。与soft相比,我们可以知道,如果我们设定限额时,soft的大小应比hard的大小小。而在用户达到soft的限制的时候系统会产生警告信息,以免用户达到hard的限额才被警告。
时限:所谓是时限就是在soft方式提到的, 当用户所占用的空间超过soft但还没达到hard的时候,这个时限就会被启动,用户必须在这个时限内把所占用的空间减少到soft的限额以下。
还有另外的一类的文件系统限额方式:
user: 这种方式是针对系统中个别用户进行文件系统限额。
group: 有针对用户的自然会有针对用户组的文件系统限额方式。
现在,你对文件系统限额的方式有一定的了解。好!下面我们就进入实战阶段, 真真正正来配置系统的限额。
首先,quota是需要linux内核支持才行,而现在使用的Linux Kernel 2.4.XX都支持quota也就是说只要你使用linux distributions,例如Mandrake 9.0或Redhat 8.0 就可以配置文件系统的限额。接着,我们了解与quota有关的系统命令,它们是quota,quotacheck,edquota,quotaon和quotaoff,它们的详细说明如下:
quota: 主要是用来查询用户的限额配置清况。下面是一个例子:
[code][root@lustr root]# quota -u chase
Disk quotas for user chase (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda5 6 10 20 6 0 0[/code]
上面每一项具体的意思会在后面相关的地方会解释。
quotacheck: 这个命令主要是用来扫描要实现限额的文件系统,并在第一次运行时建立必要的限额配置文件,如果在建立quota后运行,它就会更新这两个文件。通常情况下,quotacheck扫描文件系统时,它先把文件系统挂载成只读方式,因为当在扫描的过程中出现文件的增加或减少都会使quotacheck出错。当扫描完毕后,它又会把文件系统挂载成读写方式。linux还特别强调在文件系统quota on或off都要运行quotacheck。下面是一个例子;
[code]root@lustr root]# quotacheck -uvg /home/
quotacheck: Scanning /dev/sda5 [/home] done
quotacheck: Checked 3 directories and 7 files[/code]
这个例子是扫描/home下面的文件系统其中参数u和g是表示要对user和group的限额都要扫描,结果是在这个目录下有3个目录和7个文件。v就不用多说了, 除此之外还有一个参数是a,它表示对所有在配置了quota的分区都要进行扫描。
edquota: 这个命令是主要的文件配额命令, 它可以配置用户或用户组的文件系统限额。除此之外,edquota还可以建立一个用户限额配置的拷贝, 并用于其他用户的限额配置。下面是一个例子;
[code][root@lustr root]# edquota -u chase[/code]
当运行上命令后,edquota缺省调用vi来编辑quota文件, 如果你不想使用vi来编辑quota的文件,你可以设定环境变量EDITOR或VISUAL为你希望的编辑器。 下面是vi的输出结果;
[code]Disk quotas for user chase (uid 500):
Filesystem blocks soft hard inodes soft hard
/dev/sda5 6 10 20 6 0 0[/code]
上面的结果和我们先前所运行quota的结果很类似的, 我在这里说说上面每一项的具体意思以帮助大家理解quota的输出结果。
Filesystem: 这个就不用多说啦。
blocks: 这个是当前用户在这个分区里所使用的空间大小,单位是Kbyte。 这个是文件系统自己计算出来的,所以在编辑该文件时不要修改这个参数。
soft: 这个在一开始就介绍过了,就是soft限额方式的限额值。单位也是KBytes。
hard: 这个在一开始就介绍过了,就是hard限额方式的限额值。单位也是KBytes。
inodes: 这个是当前用户使用文件系统节点的个数。和blocks类似,它也是文件系统自己计算出来的,所以在编辑该文件时不要修改这个参数。
注意: 当soft,hard设定为0,0时,这表示没有限额。第一和第二对的soft和hard时对block和inode的不同限额数,而在quota的输出结果就分别是blocks和files的限额数。
下面有两个例子
[code][root@lustr root]# quota -u test;edquota -p chase -u test;quota -u test
Disk quotas for user test (uid 501): none
Disk quotas for user test (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda5 5 10 20 5 0 0[/code]
上面是一个用chase用户限额的拷贝实施在test用户上。
[code][root@lustr root]# edquota -t[/code]
下面是vi的输出结果:
[code]Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sda5 7days 7days[/code]