>

Types of Unix files

  • Regular file: On a Unix system, everything is a file; if something is not a file, it is a process
  • Directories: files that are lists of other files.
  • Special files: the mechanism used for input and output. Most special files are in /dev, we will discuss them later.
  • Links: a system to make a file or directory visible in multiple parts of the system’s file tree. We will talk about links in detail.
  • (Domain) sockets: a special file type, similar to TCP/IP sockets, providing inter-process networking protected by the file system’s access control.
  • Named pipes: act more or less like sockets and form a way for processes to communicate with each other, without using network socket semantics.
Symbol Meaning
- Regular file
d Directory
l Link
c Special file
s Socket
p Named pipe
b Block device

Concepts

在介绍 Unix 文件系统之前先来介绍一下机械硬盘的典型构造中的基本概念[在 Unix 问世的时代,还没有SSD],机械硬盘主体是由多个圆形硬盘盘所组成的,依据硬盘盘能够容纳的数据量,而有所谓的单碟(一块硬盘里面只有一个硬盘盘)或者是多碟(一块硬盘里面含有多个硬盘盘)的硬盘,一般情况下都是多碟。

disk head 磁头主要进行该硬盘盘上面的读写动作。磁头需要进行位置变换,来找到对应的位置进行读写。
disk track 磁道就是磁头在磁盘盘上转一圈所形成的圆
disk cylinder 在一个拥有多个磁盘盘的磁盘里,所有相同半径的那一个磁道就组成了磁柱[Cylinder]
disk sector 由圆心向外划直线,则可将磁道再细分为一个一个的扇区[Sector],这个扇区就是硬盘盘上面的最小储存物理量了,通常一个sector的大小约为512 Bytes
disk partition 硬盘的分割,也就是记录每一个分割区的起始与结束磁柱,这两个磁柱之间形成了一个环状的区域

以上这些就是典型机械硬盘的基本概念,后面介绍的是逻辑概念。

block 硬盘的最小储存单位是 sector,也就是说对于硬盘它是一个 sector 一个 sector 存的。但是数据存储的最小单位并不是 sector,用 sector 来储存太没有效率了,因为一个sector只有512Bytes,而磁头是一个一个sector的读取,也就是说,如果我的文件有10MBytes,那么为了读这个文件,我的磁头必须要进行I/O操作20480次。所以在这之上我们要构建一个逻辑存储单位,把几个sector聚在一次,这样就会大大降低I/O次数[这也是为什么会有virtual memory而不是OS直接操作硬盘的原因]。

Block这个最小储存单位是架构在sector的大小上面[因为sector为硬盘的最小物理储存单位,此为硬件设定]。 Block的大小为sector的2的次方倍数。此时,磁头一次可以读取一个block,如果假设我们在格式化的时候,指定Block为4 KBytes[亦即由连续的八个sector所构成一个block],那么同样一个10MBytes的文件,磁头要读取的次数则大幅降为 2560次,这个时候可就大大的增加文件的读取效能。当然有不能一味的增加大小,要是这样的话,将所有sector都设为一个block岂不是更方便,但是真是情况并不是这样。所以Block单位的规划并不是越大越好,因为一个Block最多仅能容纳一个文件。举例来说好了,假如Block规划为4KBytes,而一个文件大小为0.1KBytes,这个小文件将占用掉一个Block的空间,也就是说,该Block虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所以,实际上剩下的3.9KBytes是不能再被使用了.

superblock 当我们在进行磁盘分区时,每个磁盘分区就是一个文件系统[filesystem],而每个文件系统开始的位置的那个block就称为superblock,所以一个partiiton拥有一个superblock来存储一个描述数据的数据,类似metadata。superblock储存了文件系统的大小、空的和填满的区块,以及他各自的总数和其他诸如此类的信息等等,这也就是说,当要使用这一个磁盘分区槽来进行数据存取的时候,第一个要经过的就是superblock这个区块,如果superblock坏了,对应的磁盘槽大概也就回天乏术了!

free list 在unix文件系统里是一个 a linked list of all the free blocks in the file system,就是一个存折所有空白区块的链表。

inode 是unix文件系统的基础,inode 存的是索引信息。

Block是记录文件内容数据的区域。首先,每个文件不止有文件的内容数据,还包括文件的种种属性,例如:所属群组、所属使用者、能否执行、文件建立时间、文件特殊属性等等。由于操作系统是一个多人多任务的环境,为了要保护每个用户所拥有数据的隐密性,所以文件属性的增加是在所难免的。所以一般情况下每个文件的内容分为两个部分来储存,一个是文件的属性,另一个则是文件的内容。所以规划出inode与Block来分别储存文件的属性(放在inode当中)与文件的内容(放置在Block area当中)。当我们要将一个partition格式化时,就必须要指定inode与Block的大小才行,也就是说,当partition被格式化时,它一定会有inode table与block area这两个区域。

inode包含文件的元信息,具体来说有以下内容:文件的字节数,文件拥有者的User ID,文件的Group ID,文件的读、写、执行权限,文件的时间戳,链接数(即有多少文件名指向这个inode),文件数据block的位置

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。这里值得重复一遍,Unix系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。