一切都是文件

初学者指南 介绍了文件所有权和权限访问概念,但是我们需要重新定义“什么叫文件”这个概念来真正理解 UNIX® 文件系统(它也适用于 Linux 的文件系统)。

这里的“一切确确实实意味着一切。硬盘,硬盘分区,并行口,到网站的连接,以太网卡:所有这些都是文件。甚至目录也是文件。除了标准的文件和目录,Linux 还可以辨识很多别的类型的文件。注意这里说的文件类型不是文件内容的类型:对于 GNU/Linux 和任何 UNIX® 系统,不论是 PNG 图象,二进制文件还是其他什么,文件就是一串数据流。通过内容区分文件类型是留给应用程序的任务。

不同文件类型

如果您还记得,当您键入 ls -l 时,访问权限前的字符标明了文件的类型。我们已经看到两类文件:普通文件 (-) 和目录 (d)。您也可以在目录之间浏览并且列出目录内容的时候找到其他类型的文件。

  1. 字符模式文件: 这些文件不是特殊的系统文件(比如我们已经讨论过的/dev/null)就是内容(如果真的存在)不需要被存入 缓冲区 (也就是不需要被记录在内存中)的外设(串行或并行口)。这样的文件被标记成 c

  2. 块模式文件:这些文件是外设。但与字符文件不同的是,他们的内容被存入缓冲区的。举例来说,这样的文件有以下几类:硬盘,硬盘分区,软驱,CD-ROM 驱动器等等。块模式文件的例子有 /dev/hda/dev/sda5 。这些都在 ls -l 的输出中被字母 b标记。

  3. 符号链接:这些都是普通文件,他们在 Mandrakelinux 系统启动(参见 第 11 章 启动文件: init sysv章节)时被频繁调用。从它们的名字就可以看出,它们是用来通过符号的方式链接文件的。也就是说,它们是保存指向不同文件的路径的文件。它们可能并不指向一个实际存在的文件。它们经常被称为软链接,并被“l”所标识。

  4. 命名管道:如果您怀疑的话,那么我告诉您,命名管道除了具有名字,别的都和 shell 里使用的管道非常相似。如果您想了解更多情况的话就请继续阅读本节。命名管道非常罕见以至于您几乎不可能在搜索文件树的过程中找到它。不过如果您找到的话,您会发现他们被 p 标记。更多关于它们的介绍请参考 “匿名管道和命名管道”一节

  5. 接口:这是所有网络连接的文件类型,但是它们之中只有少部分是有名字的。而且接口有不同类型,但其中只有一种是可以被连接的。不过这些都已经超出了本书的范畴。这样的文件都被 s 标记。

这里有一个包含每个文件的例子:

$ ls -l /dev/null /dev/sda  /etc/rc.d/rc3.d/S20random /proc/554/maps \
/tmp/ssh-zhang/ssh-510-agent
crw-rw-rw-    1 root     root       1,   3 May  5  1998 /dev/null
brw-rw----    1 root     disk       8,   0 May  5  1998 /dev/sda
lrwxrwxrwx    1 root     root           16 Dec  9 19:12 /etc/rc.d/rc3.d/
  S20random -> ../init.d/random*
pr--r--r--    1 zhang  zhang         0 Dec 10 20:23 /proc/554/maps|
srwx------    1 zhang  zhang         0 Dec 10 20:08 /tmp/ssh-zhang/
  ssh-510-agent=
$

信息节点

Inode 和“一切都是文件”概念一样是所有 UNIX® 文件系统的基本组成部分。inode 这个词是“信息节点”的简写。

信息节点存储在磁盘的信息节点表内。它们为了可能会被存贮在文件系统里的所有文件而存在。这些文件包括目录,命名管道,字符模式文件等等。正是因为这样,所以才有了这句名言 “The inode is the file(信息节点就是文件)” 。信息节点是 UNIX®识别文件的独特方法。

不,您不能误解下面的话:在 UNIX®中,您不是通过文件名来识别文件,而是通过他的信息节点号[22]因为同样的文件可能拥有几个名字或根本没有名字。在 UNIX® 中,一个文件名只是一个目录信息节点的一项。这样的一项被称为链接。下面我们讨论链接的细节。



[22] 重要的是:信息节点号对于每个文件系统都是独一无二的。这意味着同样的信息节点号可以在不同文件系统下存在。这引出了磁盘信息节点和内存信息节点的区别。两个磁盘信息节点可以拥有相同的编号,但是内存信息节点在系统中具有唯一的编号。举例来说,一个获得唯一信息节点的方法,是对磁盘信息节点号和块设备标志做哈希运算。