电脑技术学习

FreeBSD连载(15):文件的属性

dn001

文件系统与磁盘操作

  文件在Unix下是一个非常重要的概念,Unix下不但使用文件来保存数据,而且使用文件来保存目录信息、表 示硬件设备等。Unix的文件名对大小写敏感,例如 “FOO” 和 “foo” 是两个不同的文件,而且文件名可长 达255个字符。

  文件是按照分级的形式组织起来,每一级称为一个目录,其内容使用一个特殊的目录文件保存,而第一级目录为根目 录,这就形成了一种树状结构,最下面是根目录 “/” ,根目录下放有普通文件和其子目录,如: “/usr/” 、 “/var/” 等,而在不同的子目录下又有自己的文件和子目录。

  /目录:目录树的根,用于保存系统的内核文件和系统启动文件,它所在的文件系统为根文件系统。

  /dev目录:用于保存系统的设备文件,占用大致固定的硬盘空间,位于根文件系统中。

  /etc目录:用于保存系统的配置文件,包括passwd,rc等非常重要的文件,也被放置到根文件系统中。

  /bin和/sbin目录:保存了用于系统维护目的的执行文件,其中/sbin中的文件通常直接用于系统维护 ,/bin为提供管理员使用系统的基本工具。也必须放置在根文件系统上,在系统运行在单用户模式时,只有根文件系统安 装到系统上时,就能够运行这些程序进行系统维护任务。

  /tmp目录:用于存放程序运行产生的临时文件,这个目录也是每个用户都可写的,在系统启动时将自动清空这个 目录。当系统运行较大型的服务程序时,会要求较大的/tmp空间,会超过根文件系统的空间,因此可以在其他文件系统中 创建另一个临时文件目录,使用符号连接等方法进行维护。

  /usr目录:用于保存系统正常运行时使用的多种文件,其中/usr/bin放置系统执行文件,/usr/sbin 放置系统维护程序,/usr/local放置非标准的应用程序,/usr/share放置系统中的文档和其他数 据文件,/usr/src中放置系统的源代码,/usr/X11R6放置X Window系统、应用程序和数据文件。 由于这些内容非常多,/usr目录通常为一个单独安装的文件系统,占用一个硬盘分区,称为usr文件系统。随着系统任 务的增长,/usr目录中的内容也会迅速增多,还要考虑将其较大的子目录分离出来,例如/usr/local目录。

  /var目录:用于保存系统运行时产生和使用的数据文件,例如/var/log目录用于放置系统日志,/va r/db/pkg目录用于放置系统软件包的安装记录。很多应用程序也使用它来放置数据文件,如news服务器等。这个 目录下文件会随系统的运行而不断变化,其中的很多文件会不断增大,占用大量的磁盘空间。应该将这个目录分离出来,这样 即使某个进程在这个目录下没有限制的产生数据文件,填充整个文件系统,也不会影响其他目录下的数据存储,例如用户在自 己目录下的数据存储。由于/var目录的大小会随着应用程序的需要改变,对于提供网络服务的服务器,/var占用磁盘 分区应该大一些。

  /home目录:使用它用于维护用户的个人目录,它的大小由用户数量及用户的活跃程度决定,也需要有足够的空 间才能提供正常的服务。通常这个目录保存在usr文件系统中,而在根目录下使用连接来维护。当用户数量增加的很多的时 候,应该让它位于一个单独的文件系统中。

  这些目录开始就设计为保存不同的数据,而各个目录会使用不同的磁盘分区。习惯于Dos/Windows的使用 者会不习惯这种使用多个文件系统的方式,而只使用一个文件系统,这种做法是不对的。多文件系统可以用于分隔不同的任务 ,分隔系统风险,增加可靠性,对于用作服务器的FreeBSD系统是必需的。

  Unix的树状目录结构十分标准,那类文件应该放置到那个目录中都有一定的习惯。当然在不同的Unix中,具 体文件的位置也有细微的差别,事实上在Unix发展的过程中,标准目录树结构的也有几次较大的改动,但是基本结构是相 同的。由于FreeBSD有统一的版本,所有的开发者都使用同一个源代码树,而且使用统一的Packages Collection 机制来维护应用软件,因此FreeBSD的目录结构更为整齐、干净。

  • 文件的属性

  由于FreeBSD是一个多用户系统,不同的用户对不同的文件就应该有不同的处理权力,通常创建文件的用户就 拥有这个文件,成为这个文件的属主。同样,文件也有自己的属组,这是一个文件的两个重要属性。由于文件的属主和组涉及 到对文件的访问控制,因此只有root能更改文件的这两个属性,更改文件属主的命令为chown,更改文件属组的命令 为chgrp。

  由于不可能为每个用户都单独提供完全独立的文件系统,多用户操作系统必须提供一种安全的访问控制机制,使得用 户既能和其他用户共享某些文件,又能保证各个用户的文件不会被非法存取或破坏。Unix分别针对属主、同组用户和其他 用户共三种不同的用户,分别设置了存取控制权限,这个权限分别为:读、写和执行,使用英文字母r(Read)、w(Write) 和x(eXecute)来表示。由于对属主、组和其他用户均有这三种权限设置,因此每个文件共有九个权限参 数。使用 “ls -l” 命令就能看到文件的权限设置:

$ ls -l

drwx------ 4 user wheel 512 Nov 25 17:23 Mail

-rw-rw-r-- 1 user wheel 149 Dec 4 14:18 Makefile

-rwxr-xr-x 1 user wheel 3212 Dec 4 12:36 a.out

drwxr-xr-x 1 user wheel 512 Dec 14 17:03 bin

-rw-r--r-- 1 user wheel 143 Dec 4 12:36 hello.c

drwxr-xr-x 2 user wheel 1024 Oct 16 1997 public_HTML

drwxrwxrwx 2 user wheel 512 Jan 3 14:07 tmp

  从上面的例子中,可以看到文件的权限设置在列出的数据的第一列中显示,例如文件a.out的属性是-rwxr-xr-x, 共显示了十个字母的位置。其中第一个位置是用于标识文件的种类,而非权限设置,其余九个位置分别表示三组 的三种权限设置。第二个到第四个位置表示属主的权限分别设置为读、写和执行,第五个到第七个位置设置同组用户的权限, 第八个到第十个位置设置其他用户的权限。当指定位置上没有显示对应的权限,而是 “-” ,则表示不允许对应的权限。 因此a.out的权限设置为,对于属主user的权限为读写和执行,对于同组用户为读和执行权限,对于其他用户也是读 和执行权限。对于目录来讲,拥有读权限意味着用户可以列出这个目录下的文件内容,写权限使用户可以在这个目录下增、删 文件和更改文件名,执行权限保证用户可以使用cd进入这个目录。

  ls输出结果的第一个位置表示类别,例如 “d” 表示目录, “c” 表示该文件为字符设备文件, “b” 表示为块设备文件, “l” 表示为一个符号连接。

  Unix系统内部使用数值来表示这些属性,每一个属性与文件属性中的一个二进制位相对应,如果该存取权限设置 了,对应的二进制位就是1,如果该存取权限没有设置,对应的二进制位是0。这样a.out的权限属性rwxr-xr-x 用二进制来表示就是111101101,Unix下常使用八进制的形式表示,这样这个权限是755。

  文件的属主和管理员可以使用命令chmod来设置或改变文件的权限。chmod有几种不同的使用方法,可以直 接使用八进制的权限表示方式设置属性,或者使用属性字母来设置或更改文件的属性,不同的使用方法要求不同的 chmod参数,下面是使用chmod的一些例子:

  chmod 750 a.out :改变a.out的权限为750;

  chmod a+x a.out :对所有用户增加a.out的执行权限,
  a(All)表示所有用户;

  chmod u=rwx a.out :设置属主的权限为读、写和执行
  u(user)表示属主用户;

  chmod g+rw a.out :增加同组用户的读写权限,
  g(group)表示同组用户;

  chmod o-w a.out :减少其他用户的写权限,
  o(others)表示其他用户;

  chmod go= a.out :清除同组和其他用户的所有权限;

  chmod o=u-w a.out :设置其他用户的权限为减去写权限的属主权限;

  权限755是最常见的文件权限设置,这种属性的文件允许其他用户可以访问这个文件,但不可以更改,如果不打算 让其他用户访问文件,文件的存取权限可以设置为700。文件在创建的时候,系统使用掩码来决定文件的权限,掩码的二进 制对应位为1的,文件属性的对应位就设置为0,例如当掩码的八进制表示为022时(二进制为000010010),创 建的文件权限就为755(111101101)。文件掩码使用umask命令来设置,例如使用 “umask 027 ” 设置掩码为027,则创建的文件权限为750,其他用户将对这个文件没有任何权限。可以在启动资源文件或者在登录 类别中设置中设置用户的掩码。

  目录需要设置执行位,以允许用户能使用cd命令进入这个目录中

  当一个文件的权限设置完毕之后,在一个进程试图访问这个文件时,系统就比较这个进程的属主和属组与文件的属主 和属组,判断这个进程是否具备访问权限。由于每个进程的属主和属组标识是由启动这个进程的用户决定的,因此一个用户启 动的进程就具备其本身对文件的访问权限。

  除了读、写和执行权限以外,对于可执行的程序还有另外两个非常重要的属性:设置属主身份(setuid, Set User ID) 权限和设置组身份(setgid, Set Group ID)权限,这两个属性允许某个程序 可以更改自己的进程标识为程序文件属主或组,因而就可以具备该程序文件属主或属组的访问权限,而不再仅仅是启动进程的 用户的访问权限,这样就能完成特定的任务。很多系统程序,例如su,就是通过这个特性来完成从执行进程时的普通用户身 份到root用户身份的转化的,因此这两个属性对于系统安全至关重要。不是必要的系统程序,不能具备这些属性。

  可以使用 “chmod +s file” 或 “chmod g+s file” 来设置这两个属性,或者 使用 “chmod 4755 file” 、 “chmod 2755 file” 八进制方式来设置setuid 或setgid属性。

  • 文件的连接和符号连接

  Unix中使用i节点(i node)来记录真实的物理文件及其位置,文件名只是指向i节点的一个连接。因此 每个文件可以有多个名字,每个名字就称为文件的一个连接,而同一个文件的所有连接所指向的i节点件完全相同。但在删除 时只有全部删除这个i节点的全部连接,才能删除i节点、即删除这个文件本身。

$ ln l1 l2

$ ls -l l*

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l1

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l2

$

  上面的例子使用ln创建了一个连接,然后在ls的结果中可以看到第二列的数字为2,这表示这个文件有两个连接 。这样的连接可以建立在不同的目录中,但所有连接所在的目录必须在同一个文件系统中,才能使用同样的i节点。由于连接 是直接指向标识物理文件的i节点,因此这种连接又称为硬连接。

  另一种更灵活的连接方式是符号连接,它没有指向物理文件的i节点,而是直接指向目录树上的另一个入口,那么当 系统访问这个文件时,就沿着它指向的目录树的位置去查找具体文件。这样就能对任何文件系统中的文件和目录建立连接,因 此称为软连接。符号连接可以跨越文件系统,灵活性很大,能够突破物理文件系统的限制维护目录树的一致性,对于系统管理 和维护很有用。但是这种连接方式需要对目录树进行多次查找,增加了文件操作的额外步骤,因此效率较低,因此不应该使用 多级连接,及某个符号连接指向的目录还是一个符号连接,甚至发生符号连接的循环。应该尽量少用符号连接,并避免多级符 号连接及符号连接的循环。

$ ln -s l1 /root/files

$ ls -l l*

lrwxrwxrwx 1 user wheel 12 Dec 4 12:36 l1 -> /root/files

$

未完,待续。。。  

标签: