<< Back to handbook

Chapter 1. Linux文件系统

Table of Contents

1.1. 管理文件系统

1.2. 文件和目录的权限

1.3. 文件属性

1.4. 文件访问控制列表(Access Control ListsACL

文件系统是一个操作系统的重要组成部分,Linux支持各种常用的文件系统。

Table 1.1. Linux文件系统类型

文件系统

类型名称

用途

Second Extended filesystem

ext2

最常用的Linux文件系统

Three Extended filesystem

ext3

ext2的升级版,带日志功能

Minix filesystem

minix

Minix文件系统,很少用

RAM filesystem

ramfs

内存文件系统,速度超快

Network File System(NFS)

NFS

网络文件系统,由SUN发明,主要用于远程文件共享

DOS-FAT filesystem

msdos

ms-dos文件系统

VFAT filesystem

vfat

Windows95/98采用的文件系统

NT filesystem

ntfs

Windows NT采用的文件系统

HPFS filesystem

hpfs

OS/2采用的文件系统

/proc filesystem

proc

虚拟的进程文件系统

ISO 9660 filesystem

iso9660

大部份光盘所用的文件系统

UFS filesystem

ufs

Sun OS所用的文件系统

Apple Mac filesystem

hfs

Macintosh机采用的文件系统

Novell filesystem

ncpfs

Novell服务器所采用的文件系统

SMB filesystem

smbfs

Samba的共享文件系统

XFS filesystem

xfs

SGI开发的先进的日志文件系统,支持超大容量文件

JFS filesystem

jfs

IBMAIX使用的日志文件系统

ReiserFS filesystem

reiserfs

基于平衡树结构的文件系统

1.1. 管理文件系统

使用mount命令就可在Linux中挂载各种文件系统,如:

debian:~# mount -t vfat /dev/hda1 /mnt/hda1

上面这条命令就把/dev/hda1这个fat分区挂载到了/mnt/hda1目录下。“-t”参数指定文件系统类型,常见的文件类型见上面“Linux文件系统类型一表的内容。在挂载硬盘时,还有一个“-o”参数,它可指定挂载文件系统时的一些选项,如:

·         codepage=xxx,指定代码页,如936(简体中文)437(英文)等。

·         iocharset=xxx,指定字符集,如utf8gb2312等。

·         ro,以只读方式挂载。

·         rw,以读写方式挂载。

mount命令的参数选项是很丰富的,以上介绍的只是常用一些功能,详细介绍请参考man手册。

使用mkfs命令可以创建文件系统,如:

debian:~# mkfs -t ext2 /dev/fd0 1400

这条命令在软盘上创建一个容量为1.44Mext2文件系统。

使用fsck命令可以检查文件系统,如:

debian:~# fsck -t ext2 /dev/hda3

使用mkswap命令可以创建swap空间,如:

debian:~# mkswap -c /dev/hda4
debian:~# swapon /dev/hda4      #启用新创建的swap空间,停用可使用swapoff命令

设备文件是Linux中一种特殊的文件,它对应每种硬件设备,如硬盘、软驱等。它可以像文件一样对它进行读写操作。设备文件位于/dev目录下,/dev/hda代表第一个IDE硬盘,/dev/fd0代表第一个软驱。/dev/null是一个虚设的设备,它就像一个无底的黑洞,任何对/dev/null的写入都会成功,但数据会消失得无影无踪,没有任何反馈。所以我们经常把不想在屏幕显示的信息全部送到/dev/null中。下面是一个设备文件的信息:

brw-rw----  1 root disk 3, 0 2005-07-07 05:29 /dev/hda

大家注意文件的size列,它是由逗号分隔的两个数字(30),第一个值代表主设备号(major device number),第二个值代表次设备号(minor device number)。主设备号对应内核相应的功能,而次设备号对应由驱动程序管理的特定设备。所以同一类设备的主设备号都是相同的,次设备号则不同。内核根据主设备号将I/O的要求导向到适当的驱动程序上,而该驱动程序以次要编号来判断出指定要使用的设备。系统安装同,默认已安装了大部份的设备文件,在/dev目录下可查询到很多的设备文件。但有时我们也需新增一设备文件,这时我们可使用mknod命令,命令格式如下:

mknod -m permissions name type major minor
-m permissions参数可有可无,主要用于设置设备文件的权限
name是所要创建的设备名,要有完整的路径,如/dev/rhda
type是设备文件的类型,c代表字符设备,b代表块设备
major指定设备的主编号
minor指定设备的次编号

使用dumpe2fs device | more可显示文件系统的详细信息。如:

debian:/var/log# dumpe2fs /dev/hdb1 |more
dumpe2fs 1.37 (21-Mar-2005)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          ef214b73-810a-4098-bf01-ab9a85d9c651
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      filetype sparse_super
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3662848
Block count:              7323624
Reserved block count:     366181
Free blocks:              428630
Free inodes:              3470727
First block:              0
Block size:               4096
Fragment size:            4096
Blocks per group:         32768       #文件系统中每个块组的大小
Fragments per group:      32768
Inodes per group:         16352
Inode blocks per group:   511
Last mount time:          Thu Jul  7 20:09:57 2005
Last write time:          Thu Jul  7 23:42:51 2005
Mount count:              15
Maximum mount count:      30
Last checked:             Fri Jun 17 05:31:36 2005
Check interval:           2592000 (1 month)
Next check after:         Sun Jul 17 05:31:36 2005
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128

superblock是每个分区中最重要的信息,如果分区的superblock信息被破坏,则分区就不能使用。所以每个分区的superblock都被备份了。如果ext2文件系统的块组大小是32768,则superblock备份就存放在以32769开始的块组中。使用e2fsck -f -b 32769 /dev/hdb1就可用superblock备份信息修复文件系统的superblock

1.2. 文件和目录的权限

Linux系统以安全性高著称,它有完善的文件和目录权限控制机制。使用ls -l命令可查看系统中文件和目录的权限。如:

debian:~# ls -l
drwxr-xr-x   3 root     root       4096 2005-05-05 02:01 SAPGUI
-rw-r--r--   1 root     root      66842 2005-03-27 17:20 Screenshot.png
-rw-r--r--   1 root     root         72 2005-03-03 20:24 setup.log
-rwxr-xr-x   1 root     root        268 2005-03-13 15:44 test
...

最左边的一串字符是文件和目录的权限控制字符串,权限字符串的第一个字母代表文件类型,不同字符代表不同的意思:

·         -,一般文件

·         d,目录

·         l,符号连接

·         b,块特殊文件

·         c,字符特殊文件

·         ssocket套接字

·         p,命名管道

后面9个字符分成三组,分别代表user(用户)group()other(其它)的许可权限。每组有三个权限位,代表具体的权限:

·         r,表示文件可读或目录可读,位于三位权限组的第一位置。

·         w,表示文件可修改或目录可修改,位于三位权限组的第二位置。

·         x,表示文件可执行或目录中的文件可执行,位于三位权限组的第三位置。

·         s,表示set UIDset GID。位于usergroup权限组的第三位置。如果在user权限组中设置了s位,则当文件被执行时,该文件是以文件所有者UID而不是用户UID执行程序。如果在group权限组中设置了s位,当文件被执行时,该文件是以文件所有者GID而不是用户GID执行程序。s权限位是一个敏感的权限位,容易造成系统的安全问题。请在设置时小心,并注意系统中已有的SUIDSGID文件和目录。

·         t,表示粘着位(sticky)。位于other权限组的第三位置。具有该位的文件和目录只有创建者才能删除。

·         -,表示没有权限。该字符可出现在任何位置,表示没有许可权限。

当我们在linux中创建一个文件或目录时,系统通过umask环境变量来控制默认的权限位设置。umask的值多为022,在profile文件里设置。设置格式如下:

...
umask 022
...

1.3. 文件属性

使用lsattrchattr命令可以显示和改变文件属性。

·         s(secure deletion),当文件被删除时,分配在该文件中的所有块都会清零,并写入磁盘,保证文件的数据被彻底清除,不能被访问。

·         u(undelete),该属性可保存被删除的文件内容。

·         c(compress),当文件保存在磁盘时,内核会自动压缩该文件。

·         S(synchronous),当修改具有该属性的文件时,所有更改将同步写入磁盘。

·         i(immutable),设置了该属性的文件不允许更改。

·         a(append only),文件只能以追加模式打开,只有root才能设置或删除主该属性。

·         d(no dump),具有该属性的文件不能被dump工具备份。

·         A(no atime),不更新atime值,atime是文件文件的访问时间戳。

1.4. 文件访问控制列表(Access Control ListsACL

传统的Linux文件系统的权限控制是通过usergroupotherr(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。为了解决这些问题,Linux开发出了一套新的文件系统权限管理方法,叫文件访问控制列表(Access Control ListsACL)。

要启用ACL,需内核提供ACL支持和安装ACL管理工具。现在的2.6内核都提供ACL支持,在编译内核时只要在file systems分支下,把Ext2 POSIX Access Control ListsExt3 POSIX Access Control Lists选中就可以了。用以下命令挂接硬盘启用文件系统ACL

debian:~# mount -t ext2 -o acl /dev/hda1 /mnt/hda1

我们也可把选项写到/etc/fstab文件中,在需启用acl的分区选项包含acl参数。

ACL有两种,一种是存取ACLaccess ACLs),针对文件和目录设置访问控制列表。一种是默认ACLdefault ACLs),只能针对目录设置。如果目录中的文件没有设置ACL,它就会使用该目录的默认ACL。要设置ACL,首先要安装管理工具,它们分别是getfaclsetfacl,在debian中只要安装acl软件包即可。

debian:~# apt-get install acl

setfacl工具可为文件和目录ACL,命令格式如下:

setfacl -m <rules> <files>

rules的格式如下,多条规则间可用逗号分隔。

u:uid:perms   #为用户设置ACLpermsrwx的组合
g:gid:perms   #为组设置ACL
o:perms      #为其它组设置ACL
m:perms      #设置有效权限屏蔽

下面是setfacl的实例:

debian:~# setfacl -m u:jims:rw testfile.txt   
#-m选项表示添加或修改文件或目录的权限访问列表
 
debian:~# setfacl -x u:jims:rw testfile.txt
#-x选项表示删除文件或目录的访问列表

要设置默认的ACL,只在rules前加一个d:,以表示指定一个目录,如:

debian:~# setfacl -m d:o:rx /data

getfacl用以显示文件或目录的ACL,如:

debian:getfacl debian.xml
# file: debian.xml
# owner: jims
# group: jims
user::rwx
group::r--
other::r--

[Note]

 

tardump工具不能备份ACL文件,如果我们要备份ACL文件系统,可以使用star工具。另外,samba可通过--with-acl-support编译选项支持ACL