一、前言
========
本文主要说明Linux下普通文件及目录的存取权限设置。本文是为稍具基础的初学者写的(我也是beginner),如
果您能够理解如下几行'ls -l'命令的输出含义(注意下面标注^的位),那您就没有必要读本文了――别浪费时
间看对你没用的东西,时间是最宝贵的!
-r-sr-xr-x 1 root bin 26975 Jun 24 1999 01:32 /usr/bin/passwd-----------1.1
^
-rwxrwSr-x 1 zyd zyd 12506 Oct 29 10:27 test_euid-----------------------1.2
^
drwxrwxrwt 5 root root 1024 Nov 1 17:17 01;34 /tmp----------------------1.3
^^^^ ^ ^
-rwxr-xr-x 2 zyd zyd 32506 Oct 19 10:20 hard_link-----------------------1.4
^
lrwxr-xr-x 1 zyd zyd 1 Oct 23 10:40 sym_link-/tmp/sym_target-----------1.5
^ ^^^^^^^^^^^^^^^
二、'ls -l'命令输出格式简介
===========================
'ls -l'命令以长格式显示文件列表,其各字段含义如下:
lrwxr-xr-x 1 zyd users 15 Oct 23 10:40 sym_link-/tmp/sym_target
_________ ___ _____ ____________ ________ _______________
| | | | | | | | |
| | | | | | | | +--符号连接(s_link)
| | | | | | | |
| | | | | | | +-----文件名(name)
| | | | | | |
| | | | | | +----文件最后更改时间(time)
| | | | | |
| | | | | +------------以字节计的文件长度(size)
| | | | |
| | | | +----------文件属组(group)
| | | |
| | | +--------------------文件属主(user)
| | |
| | +-------连接数位(count)
| |
| +-------文件模式位(mode),占9位
|
+------------文件类型位(type),占一位
以上9个字段中除了s_link外,其他字段对不同文件和目录都应该有。其中user、group、time和name的含义自
明,本文就不再介绍,其它字段将分专题小节在本文介绍。
三、文件类型(type)
Linux支持的文件类型主要包括一下7类,箭头右面的字符就是相应的文件类型位标志:
1、普通文件========-
2、目录文件========d
3、符号连接========l
4、字符设备文件====c
5、块设备文件======b
6、命名管道FIFO
7、套接口socket
其中FIFO和socket超出了本文的范畴,不做介绍。其它文件简单解释如下:
1、普通文件:就是普通文件(废话!),你用'vi myfile'建立的myfile就是普通文件,比如可执行二进制代码
文件、script脚本文件、ASCII文本文件、数据文件、配置文件......就解释到这样行吗?
2、目录文件:目录可以理解成放其它文件和/或其它目录的容器,是一种特殊文件,其内容由目录项组成,每个
目录项主要包括两部分内容:文件名name和索引节点号inode,两者和起来称为连接,我们将在下小节对inode
进行更详细的介绍。
3、设备文件:不知道诸位是否有使用DOS的经验,如果我们的机器只有三个DOS系统文件IO.SYS, MSDOS.SYS,
COMMAND.COM,而你需要编辑一份英文文档,日后再通过打印机输出,你能怎么办?
COPY CON MYDOC.TXT
;在此输入文档内容
^+D ;结束存盘
COPY MYDOC.TXT PRN ;打印文档
如果你熟悉这个过程,那你就已经理解设备文件了。以上的CON和PRN分别是DOS定义的两个设备文件,分别对应
终端和并行打印口。这种设计使我们不必了解设备使用的具体硬件细节,按使用普通文件相同的方法来使用外部
设备。
Linux下的设备文件分为三大类:字符设备、块设备和网络设备,要想准确区别它们可能需要单独写一篇更臭更
长的文章,大致情况是:字符设备是直接读取的,不使用缓冲区,象串行口、终端等;而块设备都是通过缓冲区
进行读取的,并且每次只能读取一定数量的块,比如磁盘每次至少要读取一个扇区(如512字节),块设备可以实
现随机读写;网络设备即前面提到的socket,因为我还不很熟悉,就不乱说了。设备文件一般都保存在/dev目
录下,诸位可以用ls -l命令看看都有什么?反正本文的重点在于介绍普通文件和目录,设备文件不是重点,所
以就只介绍到这里。
四、索引节点、硬连接和连接计数
==============================
1、索引节点inode:
Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的
具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。例如:
假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:
This is my file.
当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例
中假设分别是1、20、30)。
假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁
头、20柱面、30扇区),最终读出文件的内容:“This is my file.”
所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不
同物理数据区的文件必定分别对应着两个不同的inode号码。
文件拷贝命令:
# cp /home/zyd/mytext newfile
在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:
1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇
区)。
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。
所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。
2、硬连接hardlink:
我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:1个inode号码肯定和一片完全
属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案
是肯定的。我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相
同的inode值,实际上就使它们对应着同一个文件。有几个目录项具有相同的inode号,我们就说这个文件有几
个硬连接(hardlink),对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连
接可以通过ln命令建立,例如:
# ln /home/zyd/mytext hardlink_mytext
就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个
目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保
证两个文件能同步更新。
'ls -il'可以显示文件的inode(在下面最左边):
262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext
3、连接计数count:
前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共
有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。
那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细
说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直
接子目录数(就是只包括儿子,不包括孙子啦!)。例如:如果一个目录/abc的count域为5,那么
/abc目录一定包含3个子目录。
至此我们已经介绍了普通文件、目录文件、设备文件、硬连接、连接计数、索引节点等非常重要的概念。
4、进一步说明:
硬连接文件实际上并不是一种新的文件类