一:硬件
1-1 磁盘
- 机械磁盘是计算机中唯一的机械设备
- 磁盘属于外设
- 磁盘的速率慢
- 容量大,价格便宜
1-2 磁盘物理存储结构
1-3 磁盘存储结构
扇区:磁盘的基本单位,512字节
其中磁头在传动臂的带动下,共进退,因此每一个磁头都处于同一位置,就会形成柱面(柱面就相当于一个个同心圆),当磁头开始向磁盘写入数据时,相当于磁盘批量化的向柱面写入数据
那如果我们想将521字节的内容写入到某一扇区中,磁盘是如何运作的?
首先我们先将磁头定位在扇区所在的柱面,然后将扇区所在面的磁头定位到这个扇区,这种定位扇区的方案称为CHS寻址方式
- 扇区是从磁盘读出和写入信息的最小单元,大小为512字节
- 磁头数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
- 磁道数:磁道是从盘片外圈往内圈编号
- 柱面数:磁道构成柱面,数量上等于磁道个数
- 扇区数:每个磁道被切分成多个扇形区域,每个磁道的扇区数量相同
- 磁盘容量:磁头数 X 磁道数 X 每个磁道上扇区数 X 每个扇区字节大小
1-4 磁盘的逻辑结构
扇区线性结构:
从上面我们知道磁道其实类似一个个的同心圆,那如果我们将同心圆切展开其实就是一个线性结构(相当于一维数组),如下图所示,这样每一个扇区就有了一个线性地址(其实就是数组下标,从1 开始记数),这种地址叫做LBA。其中最小的基本单元为一个扇区
柱面的线性结构:
我们知道柱面是由整个磁盘的所有同一磁道构成的,而一个磁道可以看做成一个线性结构(一维数组),那么柱面的线性结构相当于二维数组
整个磁盘的线性结构:
所以整个磁盘的线性结构相当于三维数组,如果用一维数组表示如下图所示:
1-5 LBA && CHS
CHS转成LBA:
- 磁头数 X 每个磁道扇区数 = 单个柱面的扇区总数
- LBA = 柱面号C * 单个柱面的扇区总数 + 磁头号H * 每个磁道的扇区数 + 扇区数S - 1
- 扇区号通常是从1开始的,而在LBA中,地址是处0开始的
- 柱面和磁道都是从0开始编号的
LBA转成CHS:
- 柱面号C = LBA / (磁头数 * 每个磁道扇区数)(整除)
- 磁头号H = (LBA % (磁头数 * 每个磁道扇区数)) / 每个磁道扇区数
- 扇区号S = (LBA % 每个磁道扇区数)+ 1
二:文件系统
在Linux中文件的内容和属性是分开存储的,而文件的内容存储在磁盘中的Data Blocks,属性则存储在磁盘的inode Table中,并且对于Linux下的一切文件,都要有自己的属性集合(结构体),大小固定为128字节,由于文件名不会作为属性存储在集合中(存储在文件的inode中)由此每个属性集合中都包含一个整形类型的inode_number(),存储着文件在磁盘内的inode编号,而通过 ls -li 就可以打印出文件的inode编号,而通过inode编号就可以找到文件
2-1 Data Blocks(数据区)
Data Blocks中存放着文件的内容,特别注意的是Block号是安装分区划分的,不能跨分区
2-2 Block Bitmap(块位图)
Block Bitmap中存放着Data Blocks中使用情况的数据,即哪一个数据块使用了,哪一个没有被占用。如果申请一个数据块,那么对应的Block Bitmap置1,删除就清0
2-3 inode Table(inode节点表)
inode Table中存放着文件的属性。inode编号是以分区为单位整体划分,不可划分区,这是因为我们要通过inode编号查找对应的文件,而每一个目录下的文件名是唯一的,因此对应的inode编号就是唯一的,所以对于每一个分区来说只能有唯一的文件名和inode编号
2-4 inode Bitmap(inode位图)
inode Bitmap的作用和Block Bitmap的作用类似,每一个bit表示一个inode的使用情况
2-5 GDT(块组描述符表)
GDT描述每一个块组的属性信息,每一个分区中有多少个分组就有多少个GDT。每一个GDT中存放着在这个块组中从哪里开始是inode Table,从哪里开始是Data Blocks,数据块还有多少块等。
2-6 Super Block(超级块)
Super Block存放文件系统本身的结构信息,描述整个分区的文件系统的信息。记录的信息主要有:Block和inode的总量,未使用的block和inode的数量,最近一次挂载的时间,最近一次写入数据的时间等等,并且在一个分区中不止存放着一个Super Block,也不是每一个分组中都一定存在Super Block,而是存在几份Super Block,而且每一份都是一摸一样的。这是因为Super Block存放的是整个分区的文件系统信息,相当重要,如果一份出现问题是可以查看其他的Super Block数据并将数据拷贝至出现问题的Super Block中
三:软硬链接
3.1 软链接
执行ln -s + 目标链接文件 + 生成的链接文件 就可以对文件进行软链接
执行 ln -s code.c code-soft 命令表示用后者code-soft链接前者code.c ,接着我们使用ls -li命令打印文件的inode编号,从下图可以看到code.c文件和code-soft文件的inode编号不一样,可以得知code-soft文件是一个独立的文件
假设我们在bin目录下递归式的创建了很多目录,即一个文件的路径很深(长),那么我们想要访问或者对这个文件的操作就很不方便,每一次执行都必须带上这个文件的绝对路径。例如在bin目录下递归式的创建了exe/excute目录(mkdir -p bin/exe/excute),然后将当前目录下的code文件移动到bin/exe/excute目录下,即 mv code bin/exe/excute ,现在如果我们想执行code这个文件时,我们就需要执行 ./bin/exe/excute/code命令而不是直接./code命令,可以明显看到前者比后者麻烦很多,如下图展示:
而软链接的作用就是通过对文件的软链接可以快速的对文件进行操作,例如将exe文件软链接./bin/exe/excute/code文件,那么通过./exe就能快速的执行该文件了
因此,软连接相当于Windows下的快捷键,其文件内容就存储着指向目标文件的路径
删除软链接,可以使用unlink + 文件名,如上面的例子中我们想删除exe这个软链接文件,就可以使用unlink exe;同时也可以通过rm命令
3.2 硬链接
执行 ln + 目标链接文件 + 生成的链接文件 就可以对文件进行硬链接
执行ln code.c code-hard 命令表示将后者code-hard文件硬链接code.c文件,而硬链接文件本质是一个文件,并且不是一个独立的文件,我们执行 ll -li 可以看到code.c文件和code-hard文件的inode编号一样