首先简单认识一下硬盘的物理结构,总体来说,硬盘结构包括: 盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分。 所有的盘片(一般硬盘里有多个盘片,盘片之间平行)都固定在一个主轴上。 在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离很小(所以剧烈震动容易损坏),磁头连在一个磁头控制器上,统一控制各个磁头的运动。 磁头沿盘片的半径方向动作,而盘片则按照指定方向高速旋转,这样磁头就可以到达盘片上的任意位置了。
一个磁盘由多个圆环组成,这些圆环就叫做磁道,而一个磁轨又分为多个扇区(sector)一个一个扇区是512Byte,硬盘所有磁盘相同位置的圆环组成一个磁柱(Cylinder)。硬盘容量为:512Byte * 扇区数 * 磁柱数*磁头数
前面三个数都好理解,可能有人不理解乘以磁头数是干嘛,因为前面三个数相当于计算一个圆的存储量,而一个磁头读取一个圆,所以乘以磁头数量就相当于圆面积乘以圆数量。
磁盘分割的最小单位是磁柱(Cylinder)
磁盘的分割其实就是记录一个分割区(partition)的起始磁柱与结束磁柱,而这些被记录的信息都存放在主要开机扇区( Master Boot Recorder, MBR )。事实上, MBR 就是在一块硬盘的第零轨上面,这也是计算机开机之后要去利用该硬盘时, 必须要读取的第一个区域。
思考一个问题:MBR的大小是不是固定的?
我们这么想,数据的存储顺序为 : MBR + 其他数据 。如果MBR的大小不固定,比如原来MBR中存放了3个partition的信息,现在我们要新增一个partition,会出现什么后果?后果就是所有的“其他数据”都要顺序的向后移动一个partition信息的距离。是不是想到了数组的增删了。所以我们希望将MBR固定,事实也是如此MBR被固定为只能存放4个partition的信息。这样似乎好多了,但是只有四个partition,够用吗?设计者当然也想到了这个问题,所以将partition分为Primary和Extended两类(Extended最多只能有一个)。其中P是可以直接使用的,而E不能直接使用,E相当于一个指针,指向扩展的partition的位置信息存储处。
filesystem也即文件系统,每个partition都可以有自己的filesystem,例如fat32,ntfs之类的
不同的partition虽然filesystem不一样,但是都是用来存储数据的。前面我们介绍了硬盘的最小存储单元为sector(扇区,一般为512Byte),但是filesystem的最小存储单元却不是sector而是block。block是sector的2的次方倍数,磁头一次读取一个block的数据。所以如果block过小,则读取一个文件时磁头需要读取较多数量的block,这样效率很低,但是block也不能过大,因为一个block中只能存在一个档案,例如block大小为100M,那么如果有一个100.1M的文件,则需要占用两个block,浪费了大量空间。
每个filesystem中的第一个block称为superblock。superblock的作用是存储filesystem的大小,空的和填满的区块以及其他的总数和诸如此类的信息。也就是说如果你要使用一个filesystem的时候,第一个要经过的就是superblock这个块了,如果superblock坏了,这个partition大概也回天乏术了。
我们既然是学习linux,自然要学习linux的filessystem,我们以linux最标准的EXT2做说明。
EXT2中的filesystem分为inode区和block区,其中 inode存储文件的相关属性等信息,而block区存储文件的内容,每个inode都充当指针pointer的作用,它能描述文件的相关属性并指向该文件所在block的位置。blocks与inodes的数量在一开始格式化的时候就已经固定了。
整个filesystem示意图:

在linux中的链接(包括硬链接和软连接,软链接也叫符号链接)也与iNode以及block有关。
我们首先在一个空目录下创建一个文件并在里面添加hello的数据,然后再给该文件添加一个软链接和硬链接,此时目录下的情况如下:
luoxin@luoxin-virtual-machine:~/bin/link$ echo hello >> demo luoxin@luoxin-virtual-machine:~/bin/link$ ln demo hardlink luoxin@luoxin-virtual-machine:~/bin/link$ ln -s demo softlink luoxin@luoxin-virtual-machine:~/bin/link$ ls -l total 8 -rw-rw-r-- 2 luoxin luoxin 6 8月 8 19:33 demo -rw-rw-r-- 2 luoxin luoxin 6 8月 8 19:33 hardlink lrwxrwxrwx 1 luoxin luoxin 4 8月 8 19:35 softlink -> demo
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
首先我们看到对于硬链接,除了名字之外其他的东西都和原文件相同,而软连接则和原文件有巨大差别。
首先让我们先知道这种长格式的文件中每一列的具体含义是什么。
-rw-rw-r-- 2 luoxin luoxin 6 8月 8 19:33 demo其中第一个字符表示了是文件还是目录,d的话代表目录,-代表文件, l代表软连接。后面的9个字符分为3x3三组,分别代表创建者,群组,其他人的读,写与执行的权力,
2:硬链接数
luoxin:文件所有者
luoxin:文件所属组
6:文件大小
8月 8 19:33 : 最后修改时间
demo:文件名
将软连接与硬链接进行对比,首先是他们的文件属性不一样,硬链接是普通的文本文件(d)而软链接是链接文件(l),其次是读写以及执行的权限,随后是大小居然也不一样,硬链接的大小与原文件相同,而软链接的大小是4,我们不妨大胆的猜测软链接的大小是不是总是固定为4的,修改一下demo文件的内容后再查看。
luoxin@luoxin-virtual-machine:~/bin/link$ echo " world!" >> demo luoxin@luoxin-virtual-machine:~/bin/link$ ls -l total 8 -rw-rw-r-- 2 luoxin luoxin 14 8月 8 19:59 demo -rw-rw-r-- 2 luoxin luoxin 14 8月 8 19:59 hardlink lrwxrwxrwx 1 luoxin luoxin 4 8月 8 19:35 softlink -> demo
- 1
- 2
- 3
- 4
- 5
- 6
可以看到软链接的大小确实没有改变
其实底层的关系是这样的: 文件名 -> inode ->block
而创建一个硬链接就相当于创建了一个文件,文件指向他所链接的文件的inode
在这种情况下,就算我们删除了demo文件也仍然可以通过hardlink来访问原来的block
luoxin@luoxin-virtual-machine:~/bin/link$ rm demo luoxin@luoxin-virtual-machine:~/bin/link$ cat hardlink hello world!
- 1
- 2
- 3
- 4
而软连接则不是这种方式
所以如果我们将demo删除了,那还能通过softlink访问到原来的文件内容吗?显然是不能了
luoxin@luoxin-virtual-machine:~/bin/link$ ls hardlink softlink luoxin@luoxin-virtual-machine:~/bin/link$ cat softlink cat: softlink: No such file or directory
- 1
- 2
- 3
- 4
明明softlink是存在的,他却说找不到,其实就是它把softlink当作原来demo文件的决定路径了,而文件删除了,在该路径上自然也就找不到文件了。
我们不妨再试试如下操作
luoxin@luoxin-virtual-machine:~/bin/link$ echo "123456" >> softlink luoxin@luoxin-virtual-machine:~/bin/link$ ls demo hardlink softlink luoxin@luoxin-virtual-machine:~/bin/link$ cat demo 123456 luoxin@luoxin-virtual-machine:~/bin/link$ cat hardlink hello world!
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这下就更清楚了吧,软链接就相当于给文件的路径起了别名,如果文件路径发生改变,则软连接失效,而硬链接不会因为文件位置的改变而失效。
那么到底谁更常用呢?
软链接就像是快捷方式,而硬链接就像是备份!符号链接(软链接)可以做跨分区的 link;而 硬连接由于 inode 故,只能在本分区中做link.所以,符号链接的使用频率要高的多。
我们知道硬盘的存取速度相对于内存来说是很慢的,linux为了提高整体的速度,采用异步处理的方式。
什么是异步呢?举例来说:『当系统读取了某一个档案, 则该档案所在的区块数据会被加载到内存当中,所以该磁盘区块就会被放置在主存储器的缓冲快取区中, 若这些区块的数据被改变时,刚开始数据仅有主存储器的区块数据会被改变, 而且在缓冲区当中的区块数据会被标记为『 Dirty 』,这个时候磁盘实体区块尚未被修正! 所以亦即表示,这些『 Dirty 』区块的数据必需回写到磁盘当中, 以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。』
所以linux的关机真的要注意,否则可能会造成文件的丢失甚至是磁盘的损毁!!!
标记为『 Dirty 』,这个时候磁盘实体区块尚未被修正! 所以亦即表示,这些『 Dirty 』区块的数据必需回写到磁盘当中, 以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。』
所以linux的关机真的要注意,否则可能会造成文件的丢失甚至是磁盘的损毁!!!
我们上面提到的都是关于档案系统 (filesystem),但是要能够让我们的 Linux 使用的话, 非得『挂载 (mount)』上我们的 Linux 系统才行啊! 刚刚我们上面提到了目录可以记录文件名与 inode 的相关信息,此外, 目录也是让我们得以跟 filesystem 产生对应的入口点。因此,我们称那个入口点目录为『 挂载点 (mount point) 』