3.1 文件系统
不同的操作系统需要使用不同类型的文件系统,但为了与其他操作系统相兼容,以相互交换数据,通常操作系统都能支持多种类型的文件系统。比如,Windows服务器系列,系统默认或推荐采用的文件系统是NTFS,但同时也支持FAT32或FAT16文件系统。DOS和Windows 9x一般采用FAT16或FAT32。Linux内核支持十多种不同类型的文件系统,对于Red Hat Linux,系统默认使用ext2或ext3,以及swap文件系统,下面对Linux常用的文件系统作一个简单介绍。
1.ext2与ext3文件系统
ext是第一个专门为Linux设计的文件系统类型,称为扩展文件系统,在Linux发展的早期,起过重要的作用。由于其稳定性、速度和兼容性方面存在许多缺陷,ext现已很少使用。
ext2是为解决ext文件系统存在的缺陷而设计的可扩展、高性能的文件系统,称为二级扩展文件系统。ext2于1993年发布,在速度和CPU利用率上具有较突出的优势,是GNU/Linux系统中标准的文件系统,支持256个字节的长文件名,文件存取性能极好。
ext3是ext2的升级版本,兼容ext2,并且在ext2的基础上,增加了文件系统日志记录功能,称为日志式文件系统。日志式文件系统在因断电或其他异常事件而停机重启后,操作系统会根据文件系统的日志,快速检测并恢复文件系统到正常的状态,并可提高系统的恢复时间,提高数据的安全性。若对数据有较高安全性要求,建议使用ext3文件系统。
日志文件系统是目前Linux文件系统发展的方向,常用的还用reiserfs和jfs等日志文件系统。
2.swap文件系统
swap用于Linux的交换分区。在Linux中,使用交换分区来提供虚拟内存,其分区大小一般是系统物理内存的2倍。swap文件系统的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。
3.vfat文件系统
vfat是Linux对DOS、Windows系统下的FAT(包括FAT16和FAT32)文件系统的一个统称,在DOS文件系统的基础上增加了对长文件名的支持。Red Hat Linux支持FAT16和FAT32分区,也能在该系统中通过相关命令创建FAT分区。
4.NFS文件系统
NFS即网络文件系统,用于在UNIX系统间通过网络进行文件共享,用户可将网络中NFS服务器提供的共享目录挂载到本地的文件目录中,从而实现操作和访问NFS文件系统中的内容。
5.ISO9660文件系统
该文件系统是光盘所使用的标准文件系统,Linux对该文件系统也有很好的支持,不仅能读取光盘和光盘ISO映像文件,而且还支持在Linux环境中刻录光盘。
Linux还能支持很多其他的文件系统,比如:Minix(Linux支持的第一个文件系统)、MSDOS(DOS、Windows和一些OS/2操作系统使用的文件系统)、UMSDOS(Linux使用的扩展的DOS文件系统)、High Sierra(Linux自动支持,用于进一步向UNIX系统描述ISO9660文件系统下的文件)、HPFS(IBM的LAN server和OS/2操作系统使用的高性能文件系统)、SYSV(SystemV/Coherent文件系统在Linux上的实现)、SMB(用来实现Windows和Linux之间的文件共享的支持SMB协议的网络文件系统)、NCP(Novell NetWare使用的,支持NCP协议的网络文件系统)、UFS(一个广泛使用于各种操作系统的文件系统)、ReiserFS(Linux内核2.4.1以后支持的一种全新的日志文件系统)、HFS(由苹果电脑开发,使用在Mac OS上的分层文件系统)、XFS(全64位的快速、稳固的日志文件系统)、NTFS(Windows NT/2000以上操作系统所支持的文件系统)。
要想了解Linux所支持的文件系统类型,可通过以下命令来查看:
# ls /lib/modules/2.6.18-53.el5/kernel/fs
3.1.1 目录结构
文件系统也可以看做是Linux下的所有文件和目录的集合,这些文件和目录结构是以一个树状的结构来组织的,“/”就是树根,叫做“根目录”。对于一个Linux系统而言,有且只有一个根目录。所有的文件和目录都是以此为起点组织起来的,如图3-1所示。
图3-1 Linux的文件系统结构
对于从Windows平台转移过来的新手而言,最为困惑的问题之一就是文件都存在哪里呢?Linux目录结构的设计非常科学,它为以后的管理、扩充提供了很大的方便。使用命令“ls -l /”命令可以观察到所有的二级目录。在这里首先来解释一下它们的主要作用。
◇ bin:存放了必要的标准的(或者说是默认的)Linux的工具,如ls、dir、more等。通常这个目录已经包含在系统变量PATH里。也就是说,当我们输入命令“ls”,系统就会去/bin目录下面查找ls这个程序。
◇ boot:存放内核以及启动所需的文件等。
◇ dev:存放与设备(包括外设、磁盘、终端等)有关的文件(UNIX和Linux系统均把设备当成文件)。当我们连线打印机时,系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB驱动等都放在这个目录里。
◇ etc:存放系统的配置文件。修改系统配置主要就是修改该目录下的文件。例如:在安装了samba软件包后,要想修改samba服务器的配置,就要到“/etc/samba”目录下去修改相应的配置文件。
◇ home:存放普通用户的个人数据。普通用户的家目录的位置为:/home/用户名,具体每个用户的配置文件,以及用户的数据都放在这里。home目录是不断变化的,需要经常维护管理。
◇ lib:用于存放Linux下可执行程序的共享运行库。类似于Windows下的dll。
◇ lost+found:存放系统启动自检磁盘时发现的碎片文件。丢失的文件很有可能从这里找回。该目录一般为空。
◇ mnt:主要用该目录来挂载外部设备。
◇ opt:用来安装第三方软件,并且安装后所有的数据、库文件等都是存放在同一个目录下面,如需卸载某个软件,只要在该目录下直接删除即可。例如:把firefox安装到“/opt/firefox_beta”目录下,该目录就包含了运行firefox所需的所有文件、库、数据等等。只需删除“/opt/firefox_beta”目录即可删除firefox,非常简单。
◇ proc:虚拟的文件系统,反映内核进程和系统信息。该目录不占用任何硬盘空间。
◇ root:超级用户(root)的家目录。超级用户对系统有最高权限,应小心使用。
◇ media:主要用该目录来挂载那些USB接口的移动硬盘(包括U盘)、CD/DVD驱动器等移动存储设备。
◇ sbin:存放超级用户使用的基本的系统管理程序。
◇ tmp:存放临时文件。有些被用了一次两次之后就不会再被用到文件就放在这里。Linux系统会定期自动清理该目录,因此,千万不要把重要的数据放在这里。/tmp是一个全局可写的目录,但通过设置粘滞位,能防止每个用户删除其他人的文件。
◇ usr:存放所有用户公用的配置资料、工具、文档、C语言头文件等。该目录一般是固定不变的,除非要安装新的软件,因此可以通过网络共享这个目录(文件系统)。该目录包含了许多子目录:“/usr/bin”目录用于存放程序;“/usr/share”用于存放一些共享的数据,比如音乐文件或者图标等;“/usr/lib”目录用于存放那些不能直接运行的,但却是许多程序运行所必需的一些函数库文件。
◇ var:存放系统中经常变化的数据,如系统中的各种数据库、日志文件、打印机、邮件以及一些应用程序的数据文件等。建议单独作为一个分区。
3.1.2 设置文件属性
文件的属性包括文件的权限、所有权等,这是学习Linux的一个相当重要的关卡。当屏幕前面出现类似“Permission deny”的提示信息时,大多是因为权限设置错误。
1.查看文件属性
最常用于查看文件属性的命令是“ls -l”。如图3-2所示为root家目录中所有文件的详细信息。其中每一行说明一个文件,由7个字段组成。
图3-2 Linux的文件系统结构
选项“-a”表示列出所有的文件(包含隐藏文件,即文件名以“.”开头的文件)。现在来解释这7个字段的具体含义。
(1)第一栏代表文件的属性,该属性由10个字符组成。
第一个字符表示文件的类型:“d”表示目录,“-”表示一般文件,“l”表示链接文件,“b”表示可供储存的块设备(如硬盘),“c”表示串行端口的字符设备(如键盘、鼠标),“p”表示人工管道。建议用命令“file”来查看文件类型的详细信息。
在紧接着的9个字符中,每三个为一组,分别表示所有者的权限、同组用户的权限以及其他用户的权限。而每组均为为“rwx”三项权限的组合。其中,“r”表示可读,“w”表示可写,“x”表示可执行,如果不具备某项权限,则在相应位上置“-”。
例如,建立一个文件,其默认的属性为“-rw-r--r--”,则说明该文件是一般文件,其所有者对其可读、可写,但不可执行,而其他用户仅能读取。
需要特别注意的是目录的权限。对于目录可读表示可以用“ls”列出该目录的内容,对于目录可写表示允许在其中建立、修改、删除文件和子目录;对于目录可执行表示允许用“cd”进入该目录。此外,在Linux系统中,一个文件是否可执行是由文件是否具有x属性决定的,而与其文件名无关。
此外,文件与目录设置还有特殊权限。由于特殊权限会拥有一些“特权”,因而用户若无特殊需求,不应该启用这些权限,避免安全方面出现严重漏洞,造成黑客入侵,甚至摧毁系统。特殊权限有以下三种。
◇ s或S(SUID,Set UID):设在第一组权限的可执行权限位上(s表示该文件可执行,S表示该文件不可执行)。可执行的文件搭配SUID权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root账号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
◇ s或S(SGID,Set GID):设在第二组权限的可执行权限位上(s表示该文件可执行,S表示该文件不可执行)。SGID若设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源;若设置在目录上,则意味着此目录树中的所有文件和目录的所属组都将变成此目录所属的组。
◇ T或T(Sticky):设在第三组权限的可执行权限位上(t表示该文件可执行,T表示该文件不可执行)。典型的例子是/tmp和 /var/tmp目录。粘滞位是普通用户在此目录中创建的文件,读写受其权限位的限制,但是删除却只能由文件所有者或root删除,其他用户即使拥有写权限,也不能删除之。
(2)第二栏表示文件链接的个数或者目录中子目录的个数(即i-node个数)。
(3)第三栏表示文件的所有者。
(4)第四栏表示文件所属的群组。
(5)第五栏表示文件的大小。
(6)第六栏表示文件的创建日期或者是最近的修改日期。
(7)第七栏表示文件的名字。Linux文件名的最大长度是256个字符,通常由字母、数字、“.”(点号)、“_”(下画线)和“-”(连字符)组成。尤其需要注意的是,Linux文件名和命令都是严格区分大小写的。名字首位为“.”的文件是隐藏文件。
【范例】 用命令“ls -l a”列出的文件a的详细信息:
-rwxr-xr-- 1 user1 network 5238 Feb 14 10:25 a
可以看出,文件a的所有者为user1,所属的组为network(已知network的成员有:user1、user2、user3)。用户user1对文件a具有可读可写可执行的权利;同属于network组的其他用户user2、user3不能写;至于所有其他用户则仅能读取。
【范例】 用命令“ls -ld b”列出的目录b的详细信息如下:
drwxr-xr-- 1 user1 network 5238 Feb 14 10:25 b
可以看出,目录b的所有者为user1,所属的组为network(已知network的成员有:user1、user2、user3)。用户user1可以在该目录中进行任何工作;同属于network组的其他用户如user2、user3也可以进入该目录进行工作,但是不能在该目录下进行写入的动作;至于所有其他用户则不能进入该目录,也无法写入该目录。
2.设置文件所有者与属组
(1)用chgrp命令改变文件属组。
首先要保证这个组名存在于文件“/etc/group”中。chgrp命令的用法:
# chgrp groupname filename|directory
【范例】 以root身份建立文件a,修改其所属的组为petcat。命令如下:
# touch a // 所建文件a属于root用户和root组 # chgrp petcat a // 修改文件a所属的组为petcat # ls -l a -rw-r--r-- 1 root petcat 0 Mar 8 22:07 a // 文件a的属组已改变 # chgrp none a // 设置文件a属于一个不存在的组none chgrp: invalid group 'none' // 报错
(2)用chgrp命令改变文件所有者和属组。
chown(change owner)命令可以改变文件所属的用户,同时也可以改变其所属的组。同样要保证这个用户名存在于文件“/etc/passwd”中,并且组名存在于文件“/etc/group”中。此外,如果要改变整个目录树的所有关系,则应加上选项“-R”。
用法:# chown [-R] username:groupname filename|directory
参数说明:用户和属组可以是名称也可以是UID或GID。多个文件之间用空格分隔。
【范例】 以root身份建立目录b,并在其中建立测试文件b_a,要求修改整个目录树的所有关系,使其所有者变为petcat用户,所属的组变为petcat组。命令如下:
需要改变文件所有关系的最常见的场景,就是在用户把文件复制给其他人时,如果不改变目标文件的所有者,则默认属于执行复制操作的用户,从而很可能导致该文件无法被使用。例如,把用户petcat的文件.bash_profile复制给用户teacher,操作如下:
需要说明的是,尽管“cp”默认将目标文件的所有者改成执行命令的用户及用户组,但该命令还提供了选项“-p”,可以将原文件内容及其属性(包括权限和所有关系)一起复制。
3.设置权限
用法:# chmod [-R] permission filename|directory
其中,参数permission为要设置的权限值,可以用数字类型或者符号类型来表示。
(1)以数字表示法修改权限。
所谓数字表示法是指将读取(r)、写入(w)和运行(x)分别以4、2、1来表示,没有授予的部分就表示为0,然后再把所授予的权限相加而成,如表3-1所示。
表3-1 权限的数字表示法
从该表可以看出,如果分别将同一组的数字相加,则三组只需要三个数字就能说明一个文件的权限。
【范例】 开放文件a所有的权限,允许任何人对其执行任何操作。命令如下:
我们编写shell脚本时,由于新建文件的属性默认是“-rw-r--r--”,因此首先需要将其转变为可执行文件,并且不希望被其他人修改。通常的做法是:设置文件的属性为“-rwxr-xr-x”,相当于数字类型为[4+2+1][4+0+1][4+0+1]=755,因此可以使用命令“chmod 755 filename”。
(2)以文字表示法修改访问权限。
使用权限的文字表示法时,系统用4种字母来表示不同的用户。
◇ u:user,表示所有者。
◇ g:group,表示属组。
◇ o:others,表示其他用户。
◇ a:all,表示以上三种用户。
操作权限使用下面3种字符的组合表示。
◇ r:read,可读。
◇ w:write,写入。
◇ x:execute,执行。
【范例】 设置文件a的属性为“-rwxr-xr--”,使用操作符“=”即可以实现。命令如下:
# chmod u=rwx,g=rx,o=r a # ll a -rwxr-xr-- 1 petcat test 0 Mar 8 22:07 a
此外,如果不清楚文件a原先的权限,而只需要增加或者取消某些权限,则需要借助操作符“+”或者“-”。
【范例】 允许所有人写文件a,但不允许除所有者之外的其他人执行该文件。命令如下:
# ll a -rwxr-xr-- 1 petcat test 0 Mar 8 22:07 a chmod a+w,go-x a # ll a -rwxrw-rw- 1 petcat test 0 Mar 8 22:07 a
3.1.3 检查文件系统的有关命令
1.fdisk –l
该命令用来查看磁盘上的分区情况,如图3-3所示。
图3-3 当前磁盘的分区情况
2.Df
该命令反映当前系统中各个分区的使用情况(占用空间大小),如图3-4所示。建议加上“-h”选项使“df”命令的结果易读(显示数据单位)。
图3-4 当前各个分区的使用情况
说明:/dev/shm目录是一个虚拟交换文件系统,目录的内容来自内存。它可以加快交换文件系统的读取速度。
3.Du
自动统计当前系统中所有(或者某个)目录的使用情况,如图3-5所示。需要注意的是,由于普通用户不能读proc、root等目录,因此必须以root身份使用该命令。
图3-5 当前所有目录的使用情况