目录
文件系统
概念
磁盘的存储与读取
Linux下的存储
分区
Data Blocks(数据块)
inode Table(inode 表)
Block Bitmap(块位图)
inode Bitmap(inode位图)
Group Descriptor Table(块组描述符表)
Super Block(超级块)
新建文件
删除文件
目录的内容
查找文件
挂载
软硬链接
软连接
硬链接
文件系统
概念
- 文件系统是操作系统用来管理和组织存储设备(如硬盘、SSD、USB等)上数据的结构和方法。它决定了文件如何被存储、命名、访问以及组织,是操作系统和存储设备之间的桥梁
磁盘的存储与读取
- CHS定位法: 通过柱面(Cylinder)、磁头(Head)、扇区(Sector),就可以锁定待读写的位置
- 文件的存储是将内容和属性分开存放
- 磁盘是一个块设备,比如一次读写512B
- 通过下标的整除与求余,即可锁定下标
Linux下的存储
分区
- 一个物理硬盘可以被划分为多个逻辑分区,每个分区可以有自己的文件系统
Data Blocks(数据块)
- 数据块存储的是文件的实际数据内容。文件的内容会被分成多个数据块存储,每个数据块通常大小为4KB(具体大小取决于文件系统的配置)
inode Table(inode 表)
- 存放的文件的属性
- 可以通过inode里的block 来找到对应文件的内容
- block数组的下标通常是15,下标0-12是直接映射;13是间接一次映射;14是间接两次
- 就是说13下标里面按照字节存放的是实际块的下标,算下来是1000个KB
- 14号算下来是1000*1000个4KB
Block Bitmap(块位图)
- 用来标识当前块组中的哪些数据块已经被使用,哪些是空闲的
- 有助于文件系统快速找到空闲块进行数据存储
inode Bitmap(inode位图)
- 它记录的是每个inode的使用情况
- inode是文件系统中用于存储文件或目录元数据的结构,因此inode位图能够帮助系统快速找到可用的inode
- 不同分区的inode是独立的,即不同分区中可以有相同的inode
-
同一分区中不会有两个文件或目录共享相同的 inode 编号
Group Descriptor Table(块组描述符表)
- 块组描述符表存储了该块组的详细信息:块位图的地址、inode位图的地址、inode表的起始位置、该块组中空闲块和空闲inode的数量
- 该表在文件系统中起到索引作用,帮助快速定位块和inode
Super Block(超级块)
- 超级块是整个文件系统的核心部分,它包含了文件系统的元数据
-
并不是所有的块组都有Super Block,只有一些特定的块组会包含 Super Block 的副本;超级块的副本只会存储在特定的块组中,而不是每个块组都有
-
全局元数据:文件系统的类型、块的大小、文件系统的大小(总块数和 inode 数量)、空闲块和 inode 的数量、文件系统的挂载时间、状态等
新建文件
- 通过Super Block找到合适的组块
- 在该组块检查 inode 位图、检查数据块位图(找的可以使用的位置)
- 更新 inode 和数据块的位图 (标记新的使用的位置)
- 更新 inode 表(更新文件的属性)
- 写入数据(写入文件的内容)
- 更新文件系统元数据
删除文件
- 通过文件名找到对应的inode(这个映射关系存在当前的目录中)
- 每个 inode 都有一个 引用计数,它记录了该 inode 被多少个硬链接引用。如果某个文件有多个硬链接,只有当所有的硬链接都被删除时,inode 才会真正释放(也就是上面属性中的ref_count)
- 与该文件关联的所有数据块在 数据块位图中置0
- inode 位图中置0
- 更新目录项
- 更新文件系统元数据
目录的内容
- 存放的是目录下文件的文件名和inode的映射关系
- 所以Linux中,文件名不属于文件属性
查找文件
- 通过cwd和相对位置,就可以锁定待被打开的文件在哪个磁盘目录下
- 找文件例如find,找到是目录下的普通文件,就是目录的内容
挂载
- 个人理解:挂载像是一个扩容,遵循这个目录下的文件系统
- ★换句话:Linux的文件系统树结构中,可以包含多个物理存储介质,也可以包含同一个物理介质的不同分区
- 将一个分区或存储设备连接到操作系统的目录结构中,Linux 的文件系统是一个单一的层次结构,所有文件和目录都位于这个树状结构中
- ★从应用层或者用户层的角度来看,Linux 文件系统通过挂载机制将多个不同的物理存储介质整合到一个统一的文件系统树中,这使得文件访问变得更加统一和便于使用
- 比方说:sudo mount /dev/sdb1 /mnt
- 只要在/mnt目录下的文件,换句话说就是这个目录是一个分区
- 挂载分区的大小确实是通过超级块中的信息来管理的
软硬链接
软连接
- ln -s proj/bin/proc proc.soft.link
- 软链接可以指向不同文件系统中的文件或目录
- 是一个独立的文件(因为inode不同的),文件内容是一个指向目标文件的路径:类似于windows里的快捷方式
- 目标文件被删除时软链接失效
- 软连接目录,像挂载
硬链接
- ln proj/bin/proc proc.hard.link
- 文件名 仅仅是一个指向 inode 的引用,硬链接就是为一个 inode 创建多个引用
- 这个2代表的是硬链接的个数
- 发现目录文件的开始的个数就是2,因为目录文件下有个目录叫做 “.” 这个目录就是当前目录
- 发现图中proj目录的硬链接个数为3:bin目录下的 ".." 是第三个硬链接
- ★只有当最后一个硬链接被删除时,文件的实际数据才会被系统清理
- ★由于目录本身有结构层次和管理权限,硬链接无法直接作用于目录,目录的链接操作通常使用软链接(符号链接)
- ★因为在不同的文件系统中,inode 是独立的,所以硬链接只能在同一个文件系统中使用
★为什么Linux不允许硬链接作用于目录?
- 硬链接文件是另一个文件的实体,解析到的inode是同一个,如果硬链接的是一个目录,且这个目录在改硬链接文件路径上,就会死循环
- ×××而软连接如果是链接到目录,则是查找这个目录下的普通文件,而不查找这个目录下的目录×××,如果一个目录中有一个软链接指向自己,确实会在遍历时造成死循环,这种情况是潜在的风险,但在实际应用中,许多命令和工具(如
find
)会有机制来检测和防止这种循环 - 软链接是一个独立的文件,不会影响文件系统的结构,而如果允许硬链接指向目录可能会导致循环引用和复杂的目录关系,进而影响文件系统的完整性和性能
- 硬链接不能链接目录主要是因为文件系统结构的问题
但是.和..目录的有着与当前或者父目录相同的inode,不是硬链接吗
- 虽然. 和 .. 的 “有着相同的inode” ,但是发现他们的文件类型是目录,而不是硬链接;他们是属于特殊的目录项,是指向当前目录和父目录的逻辑表示
- 存在是为了在目录结构中提供方便的访问
- 这个..就像一个parent指针一样
- 查阅资料发现:find会去找两个目录