磁盘
磁盘虽然不是最早的存储设备,但是现代的存储设备继承了磁盘的逻辑规范,所以了解文件系统,我们可以从磁盘的存储逻辑来入手。

我们并不需要太了解磁盘的结构,但简单说一下吧。如图片中的那个光滑的圆面,就是磁盘本体,其中心的一个原型机械结构叫主轴,可以让磁盘转起来。还有一个尖尖的东西叫磁头,就是通过这个东西来读取磁盘内容的。
磁盘其实是多层的结构,也就是有多个盘片,而且一块盘的两面都可以读取数据。
我们把一个盘面抽象一下:

一圈一圈的叫做磁道 ,对一个磁道进行划分,每一个划分区域就是扇面 ,这是磁盘存储数据的基本单位。而来自不同盘面的同一位置的磁道构成一个柱面。
磁盘容量 = 磁头 数量 * 磁道 数量 * 每道扇区 数量 * 每扇区字节数量。
早期磁盘使用CHS寻址,C是柱面(cylinder),H是磁头(head),S是扇区(sector)。
我们想象一下将一个磁道拉直,就成了一个线性结构,类似一维数组。而将一整个盘面的磁道都拉直,不就类似一个二维数组了吗?再进一步,把所有盘片的磁道都拉直,那整个磁盘不就是多张二维的扇区数组表吗。所以,想要找到一个扇区,不就类似找数组下标了。这就是LBA地址。
虽然现在磁盘已经很少成为家用电脑的存储设备,但是现在我们使用的现代存储设备(尤其是 SSD)继承磁盘逻辑,本质上是为了兼容操作系统和文件系统,把物理上完全不同的结构,伪装成传统磁盘的样子。所以了解一下磁盘结构是十分有助于我们理解文件系统的。
硬盘是磁盘的一种,磁盘是一个广泛的概念 ,而我们上面说的磁盘其实属于机械硬盘 (HDD),而接下来提到硬盘基本指代固态硬盘(SSD)。
"块"的概念
操作系统读取硬盘数据时,一个一个的读取扇区数据效率太低,所以选择一次性连续读取多个扇区,就是一次性读取一个 "块" (block)。
硬盘的每个分区都被划分为一个一个"块",一个"块"的大小格式化的时候确定,不可更改。
"块"是文件存取的最小单位。
"分区"的概念
在 Windows 系统中,比如我们的日用电脑(通常只有一块硬盘),可以发现电脑被分为C盘,D盘等,这其实不是真的有多块硬盘,而是是硬盘的 "分区"(partition)。
但在 Linux 系统中,我们说过 "一切皆文件",那在这种情况下,又是怎么实现分区的呢?答案是通过柱面的号码来实现划分。柱面是分区的最小单位,我们只要设置好一个分区的起始柱面和结束柱面的号码,就可以做到分区了。
"inode"的概念
我们在学习 Linux 的最开始,就知道一个文件其实是由属性+数据组成的。我们通过"块"来存储了文件的数据,也需要一个地方来存储文件的属性,这个地方就是 "inode",索引节点。
一个 inode 有一个唯一的标识符,叫做 inode 号。
但有一个值得注意的点是:文件名这个属性并未纳入到 inode 内部,关于文件名如何处置,我们在后面会讲到。