一文了解文件系统
今天是周五,刚结束完答辩之后,就来完善一下这篇文章,嘻嘻,昨天因为跑去刷题了,所以就没有把文章更新出来,然后总结了一下,文件系统这一块其实我的理解也不是太深,这些笔记仅作参考!!
文件系统
https://mp.weixin.qq.com/s/jSG6qLcXWuJTvo1ROBLDtA 这里有一篇不错的文章
- 文件是进程创建的信息逻辑单元,就是每个文件可以看成一个地址空间。
- 操作系统中,处理文件的部分就是文件系统
文件系统的Linux实践
fdisk -l
命令
因为我只分了一个硬盘,所以就只有一个disk,/dev/sda
是第一个驱动器,而/dev/sda1
就是第一个驱动器的第一个分区, BOOT就是编译内核的分区,System是文件系统 的格式,只有对分区格式化了之后,才能被使用
df -h
命令可以显示挂载的每个磁盘中的可用磁盘空间量
mounted on
是挂载点,相当于windows的C盘D盘
/boot
这个是Linux系统的内核和系统启动过程中比如一些系统的初始化等等所需要用到的文件的存储目录。有了这个目录的话,即使你的根分区出现了问题机子也是可以启动的。大小大概是100M上下吧。
/home
这个是我们使用Linux系统最常见的home目录的挂载点,用于存储用户自己创建的文件。可以将多个用户存储在统一的分区。根据我们上面的那个例子我们可以知道,有了这个目录的挂载点即使你的清空根目录你的用户信息也还在,所以为home单独建立一个挂载点还是很有必要的。home的需求很大所以可以尽量多的分配空间给它。
/usr
应用程序所在目录,一般情况下我们的软件都装在这个目录下,它就类比于Windows下的Program Files
/var
用于存放日志文件,或者磁盘读写率比较高的文件也可以放在这里。
/etc
这个是Linux系统下各种配置文件所在的目录,建议大家安装软件后进行的一些系统配置配置在这个目录下的相应的一些文件中,比较不容易出问题。
https://blog.51cto.com/dengyong/2090385 du -sh * 与 ls -lh的区别
简单来说:ls是记录文件的真实大小(内容),du记录的是文件的所有的大小,包括空洞的空间,比如你要在linux下创建一个虚拟机,要创建一个G的空间给虚拟机,那du的大小就是1G+你的内容大小,而ls只是你的内容大小
分区和挂载磁盘限额
作用就是,当professor用户创建第11个文件的时候,该限额已经满了,就能限制该用户对磁盘的空间大小
逻辑卷LVM的用途与创建
当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可
https://blog.****.net/hj19870806/article/details/7696026 概念问题,可以看这篇文章
其实从这个关系,可以清晰看到这个创建的过程。
- 先通过
fdisk
命令来创建分区,如果你需要在原有的磁盘空间上继续扩展就要创建逻辑卷和逻辑卷组,如果你要新开一个空间,就直接格式化和挂载即可 - 假设要扩展,通过
pvcreate
命令,例如:pvcreate /dev/sdb1 /dev/sdc
命令来创建物理卷,创建完之后,可以通过pvs
命令输出物理卷信息报表,你会发现新创建的物理卷都会被分配到centos卷组中 - 随后,你也可以通过
vgcreate
命令来创建新的逻辑卷组,例如:vgcreate vg1 /dev/sdb,vg1是逻辑卷组的名称。最后通过mkfs.xfs
命令和mount
命令再进行格式化和挂载 - 如果我们想扩大root用户的大小,就要扩大逻辑卷组centos的逻辑卷的大小。
lvextend
命命令来扩大容量。
https://www.cnblogs.com/kevingrace/p/5845634.html 这里有详细的操作过程
文件
文件
由元数据
和数据块
组成。数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(每个512字节)块(block)的大小,最常见的是4KB,也就是连续8个sector组成,存储文件数据和目录数据。而元数据用来记录文件的创建者、创建日期、大小等,这种存储文件元数据信息的区域叫做inode注意没有存储文件名,即索引节点。
vim命令和echo命令的区别
vim命令除此之外,还会保证文件的一致性,vim命令在编辑的时候会在**.swap文件中编辑**,而系统读取的是还没修改过的文件,所以就可以保证一致性
窗口1,打开了vim命令
窗口2,查看
mv命令改名
rm命令
这个命令只是去删除你与i结点的链接,并没有真正删除文件,你是可以去恢复的
ln命令 https://www.cnblogs.com/peida/archive/2012/12/11/2812294.html详细参考这个文档
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
文件
-
文件的命名,一般都是名字+扩展名
-
文件结构,可以由多种构造方式,常用的有:字节序列,记录序列,树
-
文件类型
3.1 普通文件
3.1.1 ASCII文件,可以显示和打印,还可以用任何文本编辑器进行编辑
3.1.2 二进制文件,无法让人理解的。
3.2 目录文件(是管理文件系统的系统文件)
-
文件访问
- 顺序访问,从头到尾访问全部字节,不跳过任何内容
- 随机访问,可以不按顺序地读取文件,可以按照关键字来访问记录
-
文件属性
如上图这些属性,我们称为元数据
-
文件操作
- create
- delete
- open 目的:把文件属性和磁盘地址装入内存,便于后续调用和快速访问
- close 访问结束后,释放内部表空间
- read
- write
- append 是write的限制形式,只能再末尾添加数据
- seek 把当前位置指针指向文件中的特定位置,seek调用完之后,就可以开始写数据了
- get attributes
- set attributes
- rename
-
目录(文件系统通常提供目录或文件夹用来记录文件的位置)
- 一级目录系统(根目录),windows下是盘符,linux下是root
- 层次目录系统,子目录是可以重复命名的
- 路径名
-
目录操作
- create,linux下是mkdir命令
- delete
- opendir
- closedir,关于关闭目录,因为linux下一切皆是文件,凡是文件,有读取就一定有关闭,这样才能做到资源的合理利用和释放。
- readdir
- rename
- unlink
文件系统的实现
从用户角度:如何命名,进行那些操作,目录树是什么样的。
从设计者角度:磁盘空间是怎么样管理,文件和目录怎么存储。
文件系统布局
- 磁盘的0号扇区称为主引导记录(MBR),用来引导(boot) 计算机。在 MBR 的结尾是分区表(partition table)。每个分区表给出每个分区由开始到结束的地址。系统管理员使用一个称为分区编辑器的程序来创建,调整大小,删除和操作分区。这种方式的一个缺点是很难适当调整分区的大小,导致一个分区具有很多可用空间,而另一个分区几乎完全被分配。
- 在计算机中,引导就是启动计算机的过程,它可以通过硬件(例如按下电源按钮)或者软件命令的方式来启动。开机后,电脑的 CPU 还不能执行指令,因为此时没有软件在主存中,所以一些软件必须先被加载到内存中,然后才能让 CPU 开始执行。也就是计算机开机后,首先会进行软件的装载过程。
- 超级块包含文件系统的所有关键参数,在计算机启动或者文件系统首次使用时,超级块会被读入内存。
- 空闲空间块,例如,可以用位图或者指针列表的形式给出
- i节点
碎片
比如你用 Windows 电脑创建了一个文件,你会发现这个文件可以存储在任何地方,比如存在桌面上,存在磁盘中的文件夹中或者其他地方。你可以打开文件,编辑文件,删除文件等等。你可能以为这些都在一个地方发生,但是实际上并不是,你的硬盘驱动器可能会将文件中的一部分存储在一个区域内,另一部分存储在另外一个区域,在你打开文件时,硬盘驱动器会迅速的将文件的所有部分汇总在一起,以便其他计算机系统可以使用它。
文件的实现
连续分配
注意:每个文件都从一个新块开始,也就是有可能造成外碎片
问题
-
优势:实现简单、读性能较好(只需要一次寻址)
-
劣势:磁盘会变得零散,外碎片增加,
- 解决碎片问题,有两个方案:
- 压缩磁盘(不可行)
- 用一个空闲列表来管理这些碎片,如果这样做,用户再录入一个文档的时候就必须要预先知道该文本的大小,从而预知有没有办法创建。连续分配这个思想一般似用在DVD,光盘等
链表分配
为每个文件构建磁盘块链表。
-
每个块的第一个字作为指向下一个块的指针,块的其他部分存放数据
- 解决碎片问题,有两个方案:
优势:相对于上一种,这种方法就可以充分利用每个磁盘块(除了最后一块中的内部碎片),同样,在目录项只需要存储首地址即可
劣势:读操作相对比较慢,而且指针也占去了一些字节
采用内存中的表进行链表分配
优点:随机访问容易多了,只需要根据给定的偏移量,顺着链表查就行了。不管文件有多大,只需要记录起始块号就可以找到文件的全部块
缺点:表的大小会过大
上图表示了链表形成的磁盘块的内容。这两个图中都有两个文件,文件 A 依次使用了磁盘块地址 4、7、 2、 10、 12
,文件 B 使用了6、3、11 和 14
。也就是说,文件 A 从地址 4 处开始,顺着链表走就能找到文件 A 的全部磁盘块。同样,从第 6 块开始,顺着链走到最后,也能够找到文件 B 的全部磁盘块。你会发现,这两个链表都以不属于有效磁盘编号的特殊标记(-1)结束
。内存中的这种表格称为 文件分配表(File Application Table,FAT)。
inode
- 记录各个文件包含哪些磁盘块的方法是给每个文件赋予一个称为i节点的数据结构。只有在对应的文件打开时,其i节点才在内存中,其大小与同时打开的最大文件个数成正比,与磁盘的大小无关
- 如果一个文件所含的磁盘块的数目超出i节点所能容纳的数量,一个解决方法是,最后一个磁盘地址不指向数据块,而是指向一个包含额外磁盘地址的块的地址。
- inode里是没有文件名的
目录的实现
目录系统主要功能是把ASCII文件名映射成定位文件数据所需的信息
-
问题1:如何存放文件属性
- 放到目录项中
- 放到i节点中(这个会更好,因为会使目录项更短,只有文件名和i节点号)
- 放到目录项中
-
问题2:如何实现可变长度的长文件名
-
为每个文件名定义一个255个字符的目录空间(很明显是不行的,超级浪费内存)
上图中,有三个文件,project-budget、personnel和foo,每个文件名以一个特殊字符(通常是0)结束
-
每个目录项创建一个固定的部分,这个固定长度的头的后面是一个任意长度的实际文件名
-
这个方法的缺点是:
-
当文件被移走的时候,引入一个长度可变的空隙,很容易就会造成有碎片问题,还有是会使在读取文件名的时候发生缺页中断
-
当文件被移除后,就会留下一块固定长度的空间,而新添加进来的文件大小不一定和空闲空间大小一致。
-
另外一种方法:使目录项自身都有固定长度,而将文件名放置在目录后面的堆中。
- 优点:当文件被移走的时候,另一个文件的目录项总是适合这些空袭;文件名不需要从字的边界开始
- 缺点:要对堆内存就管理,同样会出现缺页中断
-
查找文件名的时候可以使用哈希表,其优点使查找非常迅速,但是需要复杂的管理,只有系统的目录有成百上千个文件时,才会考虑哈希表
-
另一种查找大型目录的方法是,将结果存入高速缓存。
共享文件
- 形成的方式:给该文件加上链接,使文件系统形成一个有向无环图
- 问题1:共享文件很方便,但这也会带来一些问题。如果目录中包含磁盘地址,则当链接文件时,必须把 C 目录中的磁盘地址复制到 B 目录中。如果 B 或者 C 随后又向文件中添加内容,则仅在执行追加的用户的目录中显示新写入的数据块。这种变更将会对其他用户不可见,从而破坏了共享的目的。
- 解决方法:磁盘块不列入目录中,而是会把磁盘块放在与文件本身相关联的小型数据结构中。目录将指向这个小型数据结构。这是 UNIX 中使用的方式(小型数据结构就是 inode)。
- 缺点:
建立一个链接并不改变所有关系
。如下图所示,把B链接到C上,然后所有者属于C,然后 C 尝试删除这个文件,这个时候有个问题,如果 C 把文件移除并清除了 inode 的话,那么 B 会有一个目录项指向无效的节点。如果 inode 以后分配给另一个文件,则 B 的链接指向一个错误的文件。系统通过 inode 可知文件仍在被引用,但是没有办法找到该文件的全部目录项以删除它们。指向目录的指针不能存储在 inode 中,原因是有可能有无数个这样的目录。 - 解决方法:让系统建立一个类型为LINK的新文件,并把该文件放在B目录下,使得B与C得一个文件存在链接,此方法称为符号链接
- 而符号链接没上面那个缺点,因为该文件上的用户只有路径名,没有指向i节点的指针。但是缺点就是:
需要额外的开销
。这些操作会造成很多的磁盘访问
软链接和硬链接的存储格式
ln -s 创建的是软链接,不带 -s 创建的是硬链接。
硬链接与原始文件共用一个 inode 的,但是inode 是不跨文件系统的,每个文件系统都有自己的 inode 列表,因而硬链接是没有办法跨文件系统的。
软链接相当于重新创建了一个文件。这个文件也有独立的 inode,只不过 打开这个文件看里面内容的时候,内容指向另外的一个文件。这就很灵活了。我们可以跨文件系统,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
硬链接,源文件与目标文件的inode号码相同,都指向同一个inode,并且2是该文件的连接数,当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域,如果连接的文件不存在还会帮你创建一个文件
软链接,源文件与目标文件的inode号码不同,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。
但是当我把该被链接的文件删除了之后,就会标红,表示不存在,打开文件f2.txt就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件f2.txt指向文件f1.txt的文件名,而不是文件f1.txt的inode号码,文件f1.txt的inode"链接数"不会因此发生变化。
日志结构文件系统(LFS)
主要功能:面对一个大部分由零碎的随机写操作组成的任务,同样能够充分利用磁盘的带宽。
基本思路:将整个磁盘结构化为一个日志,每隔一段时间或有特殊需要时,被缓冲在内存中的所有未决的写操作都被放到一个单独的段中,作为在日志末尾的一个邻接段写入磁盘。
如果要打开一个文件,就首先需要从i节点图(一般存在内存)中找到文件的i节点。一旦i节点定位之后就可以找到相应的块的地址
- 问题1:如果一个文件被覆盖了,那么它的i节点就会指向新的块,但是旧的磁盘块仍然在先前写入的段中占据着空间
- 解决:LFS有一个清理线程,该线程周期地扫描日志进行磁盘压缩
ext 系列的文件系统的格式
inode 与块的存储
什么是 inode 呢?inode 的“i”是 index 的意思,其实就是“索引”,类似图书馆的索引区域。既然如此,我们每个文件都会对应一个 inode;一个文件夹就是一个文件,也对应 一个 inode。
可以通过命令stat+文件名来查看文件的inode信息
文件还有元数据部分,例如名字、权限等,这就需要一个结构inode来存放。
上图,12是一级间接块,13是二级、14是三级,目的是可以存储更多的文件。
但是这也引入了一个新问题,对于大文件来讲,我们要多次读取硬盘才能找到相应的块,这样访问速度就会比较慢。
为了解决这个问题,引入了一个新的概念,叫作Extents ,Extents 可以用于存放连续的块,防止大文件拆分,从而降低访问效率
个人唠叨
好了,又到了个人唠叨时间了,今天说点什么好呢?嗯,最近刚结束高考嘛,所以就来说说,我高中的那些事吧!
我高中的那些事-我的
“巅峰”
时期
我高中的巅峰时候应该是在高二吧,那时候有着一个不错的女朋友,也成功进入到了我们学校的重点班,可谓是学业爱情双丰收啊!哈哈哈哈,可是好景不长,我跟她在刚上高三不久,就分手了,嗯?初恋,到现在还是有点怀念的,因为那时候大家都在不耽误学业的情况下在一起了,而且那段时光也挺开心的。那相处得这么好,为什么会分手呢?因为一些小插曲吧,这里就不细说了!好了,分手了之后,慢慢我的成绩也稳固起来(仅仅在上学期),我的水平还处于一本水平的!
我高中的那些事-我的
“堕落”
时期
到了高三下学期,我没有稳固好自己的地位,而且我身处重点班,压力是很大的,一次一次的模考,我的成绩一次一次地下降,但是我并没有淡然去接受这个失败
,每次都在骗自己,失误而已,那其实我的内心是很难受的,身处重点班,自己的成绩又是垫底的,那种滋味真的是不好受啊!我也就慢慢被困在这种氛围中,无论是上课提问,还是被老师叫上台,我都是很不自信的
,明明自己会的,但是也并没有自信地说出来,而是畏畏缩缩
的。
之后,在班主任的引导下,我慢慢走出来了,这里真的要谢谢我的班主任,那时候我是生物课代表,班主任是教生物的,对我也很好,非常感谢感谢,但是至今我一次都没回去学校探望过你,嗯,可能也是没面子回去了吧!嘻嘻,等我进大厂之后,我一定回去一趟,带你去吃大餐(在此许下承诺,哈哈哈哈,希望班主任能看到)好了回到正题,我开始去努力学习了,但是,好像不管怎么努力(那时候时放假一周只放一个下午,我都没有回家,继续待在课室学习,一个月才回一次家,嗯,应该很多人都这样吧!),我的成绩都没提上来。
为什么我这么努力,还是得不到自己想要的结果???
这也算是我高三最大的困惑了!明明大家都在重点班,都是同一个老师教,都是一个课室,学习同样的知识点,态度也很端正,为什么我的成绩却依旧这样!还记得有一句鸡汤,他是这样说的:你只需努力,剩下的交给时间
,这句话真的正确吗,我现在慢慢发现,我并不认同这句话,努力的方向不对,继续往前冲根本就没用
,那时候的自己,甚至大一的时候,我还是抱着这种想法,过于追求那种自己想要的结果(高考分数),直至上大学了之后,我还是那样,过于追求专业考试分数,打算我的大学时光就是要拿一个很好的绩点
。
所以,现在的我放弃了追求这些过于表面的东西,选择了一个自己喜欢的方向,并且坚持下来了,那到底现在的我有没有得到自己想要的结果呢?我跟肯定地说,有!!!
因为我喜欢,因为我看到自己在不断进步,自信心也回来了。
所以,我始终认为在状态不好的时候,应该停下来,继续工作浪费时间且效率不高。同样,当发现自己努力的方向不对时,不必执拗的坚持,换个目标可能会更好。如果当初我偏执的追求考试成绩,过程不仅痛苦,结果也可能达不到我想要的高度。
好了,今天就说到这里,希望你看到这篇文章之后,你除了有知识性的增长之外,还能收获到一些意外的东西,喜欢的朋友欢迎点赞关注!
专业考试分数,打算我的大学时光就是要拿一个很好的绩点`。
所以,现在的我放弃了追求这些过于表面的东西,选择了一个自己喜欢的方向,并且坚持下来了,那到底现在的我有没有得到自己想要的结果呢?我跟肯定地说,有!!!
因为我喜欢,因为我看到自己在不断进步,自信心也回来了。
所以,我始终认为在状态不好的时候,应该停下来,继续工作浪费时间且效率不高。同样,当发现自己努力的方向不对时,不必执拗的坚持,换个目标可能会更好。如果当初我偏执的追求考试成绩,过程不仅痛苦,结果也可能达不到我想要的高度。
好了,今天就说到这里,希望你看到这篇文章之后,你除了有知识性的增长之外,还能收获到一些意外的东西,喜欢的朋友欢迎点赞关注!
最后分享一下这周三的晚霞,真的很漂亮,来结束这周吧,周末继续肝SpringMVC源码,加油!!!