磁盘
磁盘是一种永久性存储介质,在计算机中,磁盘几乎是唯一的机械设备。与磁盘相对应的就是内存,内存是掉电易失存储介质,目前所有的普通文件都是在磁盘中存储的
CHS寻址法
- 盘面:就是数据存储在哪一个面;由于每个盘面都有一个对应的磁头,所以盘面在定位中等价于磁头。
- 磁道:磁盘的盘面上会一圈一圈的向外扩展出一个一个的磁道,磁道就是一个圆环(圆柱(Cylinder):因为盘面确定后,只需要确定磁道就可以了,也就是只需要确定是哪一个同心圆柱就可以了,所以称为圆柱)。
- 扇区:扇区就是一个磁道上的一部分(扇形与圆环的相交部分),在确定扇区后,磁道就是一个扇环。磁盘读写的单位是扇区 (512字节),对于特殊的磁盘,可能会有更大的读写单位。
我们打开一个文件,访问文件的属性和数据,就必须要确认文件位于哪个盘面,磁盘,扇区
物理结构上每一个扇区看似是混乱的,但我们可以在逻辑结构上用数组的方式将他们看出是线性的。
操作系统读取的基本单位是按照扇区的,所以数组的每个基本单位就是一个扇区。
- 假设一个盘面有10个磁道,1个磁道有10个扇区,因此一个盘面便有100个扇区。
当我们提供该数组的某个下标时,我们便可以定位到该扇区处于具体哪一个盘面,哪一个扇区,哪一个磁道,这样的逻辑扇区地址称为LBA地址。
通过逻辑地址确定该扇区处于磁盘中的具体位置称为CHS地址。
对于操作系统而言,一次读取512字节太小了,所以一般而言,操作系统未来和磁盘进行交互的时候,读取的基本单位是:4KB(8个连续的扇区),该基本单位称为块
inode
-
磁盘一般比较内存比较大(800GB/1TB等)如果直接管理不容易。所以磁盘需要进行分区。(实际上一个电脑中大都只有一个磁盘,而我们电脑中的C、D盘也是分区而来)
-
对于一个分区的管理,操作系统还是采用分组的方法:在一个分区内部分组,然后就只需要管理好一个组,就可以管理好一个分区,自然就可以管理好一整个磁盘了。
对于一个分区,需要先写入文件系统的管理资源,才能在磁盘中进行文件管理。这个过程称为“格式化”。 -
分组之后每一个组也要进行管理
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的.
inode是一个大小确定的结构体,里面存储文件的属性信息,比如有文件的大小,文件的权限,文件的创建者,文件的ACM时间(修改、保存、访问)等。(需要注意:indoe内部不包含文件名称) inode有一个固定的大小,无论是怎么样的文件都可以用inode存储文件的属性信息。
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
超级块(Super Block):存放文件系统本身的结构信息。
记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT(Group Descriptor Table):块组描述符,描述块组属性信息。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
inode Bitmap(inode位图):每个bit表示一个inode是否空闲可用。
inode Table:存放文件属性inode的表。
Data blocks(数据块):存放文件内容。(占有大部分空间),每一个数据占有8个扇区(4KB).
在Linux当中,我们可以使用命令stat 文件名来查看对应文件的信息。
理解文件的增删改查
- i创造一个文件:
我们通过touch一个新文件来看看如何工作。
[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc
创建一个新文件主要有一下4个操作:
- 存储属性
内核通过inode位图先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到对应的inode中。 - 存储数据
该文件需要存储在三个磁盘块,内核通过快位图的映射找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。 - 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。 - 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
什么是目录??
1.目录也是文件,所以也有对应的inode。
2. 目录的数据块当中存储的是该目录下的文件名以及对应文件的inode的映射关系,因此inode上并不存在文件名。
- 对文件写入信息
1、通过文件的inode编号找到对应的inode结构。
2、通过inode结构找到存储该文件内容的数据块,并将数据写入数据块。
3、若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和inode结构
一个文件使用的数据块和inode结构的对应关系,是通过一个数组进行维护的,该数组一般可以存储15个元素,其中前12个元素分别对应该文件使用的12个数据块,剩余的三个元素分别是一级索引、二级索引和三级索引,当该文件使用数据块的个数超过12个时,可以用这三个索引进行数据块扩充。
- 删除一个文件
1、将该文件申请过的数据块在块位图当中置为无效。
2、将该文件对应的inode在inode位图当中置为无效。
操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的。为什么说是短时间内呢,因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了。
软硬链接
软链接
软链接又叫做符号链接,软链接文件相对于源文件来说是一个独立的文件,该文件有自己的inode号,但是该文件只包含了源文件(被链接文件)的路径名,所以软链接文件的大小要比源文件小得多。软链接就类似于Windows操作系统当中的快捷方式。
软链接创造命令如下:
ln -s xxx yyy // xxx被链接文件名 yyy链接文件名
可以看到软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小很多。
运行test 和 test-softlink 是一样的结果:
当我们删了源文件,链接文件是不能独立存在的,即使该文件名仍存在,但是却不能执行或进行其它操作。
硬链接
通过下面的指令来进行硬链接:
ln xxx yyy //xxx被链接文件名 yyy链接文件名
硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数都变成了2。也就是我们熟知的取别名。
硬链接就是在其目录上给被硬链接的文件的inode建立另一个文件名与inode的映射关系,而inode有一个引用计数(记录一个inode被几个文件名映射)。
隐藏文件
这些隐藏文件其实就是硬链接。
软硬链接的应用场景
软链接的应用:
- 链接各种库。linux的各种指令,本质上就是一个个的可执行程序文件,这些指令的运行需要库文件的支持,才能正常运行。可以在OS默认查找的目录下建立软连接,便于对库的查找。
- 创建快捷方式,可以帮我们快速找到深路径的文件。
硬链接的应用:
- 目录创建后的隐藏文件
linux中不能给目录建立硬连接,防止系统在查找文件的时候形成路径环绕。
那系统自带的隐藏文件不会形成路径环绕吗?
不会,系统会对这些隐藏文件做特殊处理防止形成路径环绕。