[Linux]文件系统

1.理解文件系统

  • Linux磁盘文件特性:内容加属性,内容大小是不确定的,但是属性大小是一定的,并且内容和属性是分开存储的。文件属性是用一个结构体来定义的,在Linux中,该结构体是固定128字节大小如下代码:
struct inode
{
    类型;
    大小;
    权限;
    时间;
    inode编号;//整个分区内唯一的,用来区分文件的inode
    ...
}
  • 而Linux中一个文件块是4KB,那么一块就可以存储4*1024/128=32个该结构体。其中,值得注意的是文件名是不属于文件属性的。
  • 系统中,表示一个文件,用的不直接是文件名,而是inode,用命令ls -i就可以查看文件的inode

2.刨析文件分组中的各个组成

在这里插入图片描述

  • i节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等。假设我们这个group0大小是10GB,我们要在这10GB的大小的空间内存放一万个文件,也就说说有一万个inode,那么10000*128/4/1024=312。这意味着有312个block就能存储一万个inode。所以如果有一万个文件,那么这312个block包含的一万个inode组成的表就是inode Table

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。比特位的位置代表:第几个inode;比特位的内容:表示该inode是否正在被使用。

  • 数据区:存放文件内容,里面有很多4kb的区域用来存放文件内容
    在这里插入图片描述

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。比特位的位置代表第几个数据block,比特位的内容代表该block是否正在被使用。

struct inode
{
    类型;
    大小;
    权限;
    时间;
    inode编号;//整个分区内唯一的,用来区分文件的inode
    int block[15];
    ...
}
  • inode结构体中还有个成员变量是block的数组,这个数组里面的内容存放的是该文件存放block块的下标。其中存放15个元素,即[0, 14],其中[0, 11]就是存放该文件正常被使用的数据块的下标,[12, 13]不直接存放数据块下标,里面的内容指向的是数据块编号,即间接索引,14中存放的内容是指向12.13这样的索引数据块,即三级索引块。

  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。描述整个分区
    在这里插入图片描述

  • 格式化的本质就是向指定的分区写入全新的文件系统。上面说的文件系统叫Ext*(2)

3.详谈文件名和文件的增删查改

  • 首先,明确一个概念,目录是一个文件,那么目录肯定也是有内容+属性,其中目录的内容是很多对文件名和inode编号的映射关系。
  • 对于一个文件的增删查改,都和这个文件所处的目录有关系,查找一个文件,在内核中,都要逆向地递归般得到/,然后从根目录进行路径解析。
  • 一个被写入文件系统的分区,要被Linux使用,必须先将这个分区进行挂载,mount命令。
  • 一个文件系统所对应的分区,挂在对应的目录中。分区的访问,都是通过所挂在的路径访问的,所以访问一个文件,可以根据路径前缀,优先区分出文件在哪一个分区下。

4.软硬链接

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 由上面的现象可以看出来,硬链接本质不是一个独立的文件,而软链接有自己的inode,是一个独立的文件。

  • 在这里插入图片描述

  • 硬链接肯定没有新建文件,而是新建了一个文件名,和目标文件的inode编号形成了映射关系,写入到指定目录的数据块中。前面的2代表的是硬链接数(也就是下图的引用计数),而删了test.c后,硬链接数就等于1了。所以,我们所说的删除文件,其中就是删除目录文件中的映射关系,当文件的inode中的引用计数为0时,才会把inode位图和block位图中对应文件的比特位置零,也就是删除磁盘中的文件。

  • 在这里插入图片描述

4.1软硬链接的原理
  • 硬链接的本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数++
  • 软链接的本质就是一个独立文件,软链接内容里面放的是目标文件的路径,类似于windows下的快捷方式。(额外小知识:linux系统中删除的指令除了rm,还有unlink指令)
  • 在这里插入图片描述
  • linux中可以给目录创建软链接,但是不可以给目录创建硬链接。这样可以避免环路问题,避免陷入死递归。除非系统自己建立硬链接,例如.和…

相关推荐

  1. Linux虚拟文件系统

    2024-03-25 17:20:04       35 阅读
  2. linux 文件系统

    2024-03-25 17:20:04       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 17:20:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 17:20:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 17:20:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 17:20:04       18 阅读

热门阅读

  1. Redis 基础命令详解【保姆级教材】

    2024-03-25 17:20:04       30 阅读
  2. ARM的三个按键实验

    2024-03-25 17:20:04       18 阅读
  3. bert-base-chinese另外的加载方法.txt

    2024-03-25 17:20:04       20 阅读
  4. 抖店好不好做?新手小白怎么做?教你从0到1!

    2024-03-25 17:20:04       15 阅读
  5. 宝塔部署项目

    2024-03-25 17:20:04       21 阅读
  6. nicerefresh--自动刷新Spring中@Value的值

    2024-03-25 17:20:04       15 阅读
  7. MySQL索引

    2024-03-25 17:20:04       14 阅读
  8. 蓝桥杯竞赛规则及说明【C/C++】

    2024-03-25 17:20:04       28 阅读
  9. GOF23种设计模式

    2024-03-25 17:20:04       19 阅读
  10. 稀碎从零算法笔记Day24-LeetCode:存在重复元素

    2024-03-25 17:20:04       18 阅读