目录
1、认识硬件--磁盘
唯一的一个机械设备,也是一个外设。
我们可以把磁盘看作是由无数个扇区构成的存储介质。 要把数据存到磁盘,第一个要解决的问题是定位一个扇区:哪一面(定位用哪个磁头),哪一个磁道,哪一个扇区。
在整个计算机里面,不仅仅CPU有寄存器,其他设备(外设也有),磁盘也有。控制寄存器、数据寄存器、状态寄存器
eg:磁盘中有 控制寄存器(比如说是r / w)
数据寄存器:你要写的数据的其实地址在哪里
地址寄存器:要把数据写到磁盘中的什么位置
状态寄存器:有没有写成功
对磁盘进行逻辑结构:物理上圆形的,延展开,逻辑上,它是线性的。最终可以抽象为:由很多扇区组成的数组。(基于扇区的数组)
2、文件系统
文件 = 文件内容 + 文件属性
文件内容-----数据块
文件属性-----inode
(对磁盘中的文件进行管理,就是对未打开的文件进行管理) 对磁盘进行分区,对一小部分进行管理就可以做到对整个磁盘的管理。
Boot Block一般在第一个分区的头部(0面0磁道的1号扇区),包括OS启动的相关信息,OS在什么位置,整个磁盘被划分成了哪几个分区等等,这里面是与开机相关的字段。 其实,这个Boot Block也会在其他扇区的最开头放着。因为如果只在第一个有的话,如果这个挂掉了,出问题了,那就会导致我们的文件系统出问题了。
将大磁盘划分成小分区,然后再将小分区划分成Boot Block 和 n个Block group(现在就是如果我们能将一个Block group管理好就可以将这个分块管理好) Block group里面的东西就是文件系统
这种思想就是分治思想
Super Block:文件系统的基本信息,里面包含的是整个分区的基本使用情况。
记录文件系统的整体信息,包括 inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等
一共用多少个组; 每个组的大小
每个组的inode数量; 每个组的block数量
每个组的inode; 文件系统的类型和名称等
Group Descriptor Table: 描述整个分组的使用情况。存储组信息----已使用的块数量、可用的块数量、已使用的 inode 数量、可用的 inode 数量。 跟踪空间使用情况
Block Bitmap: 有那么多块,我们怎么知道哪些已经被使用,哪些没有别使用----我们可以根据这个bitmap知道。比特位的位置和块号一一映射起来,比特位的内容表示该块有没有被使用。
删一个文件的时候,用不用把块(文件内容)清空呢?答案是:不需要。 删文件只需要找到文件的inode结构体,找到结构体中block数组中的编号,因为该编号就是该文件存放时使用的块号,再位图里清空这些序号就欧克了。话句话说就是删数据的时候并没有对数据做清零,而是对想赢球的管理位图进行清零即可!
inode Bitmap: inode也有很多。比特位的位置和inode的编号映射起来,比特位的内容表示inode是否有效。删一个文件的时候,拿到文件编号,到inode Bitmap里找到文件的inode编号,看它的位图是1说明他是有效的,然后再去inode Table读取它的属性,获得对应的块的块号,在Block Bitmap中将所有块号全部清零,然后再去inode Bitmap里将对应的清0,就完成了文件的删除。 删除文件时,只需要修改Block Bitmap、inode Bitmap 和属性与内容没有关系。
Linux的文件在磁盘当中存储,是将属性和内容分开存的!!
inode Table: ( inode:单个文件的所有属性,128字节。)一般而言一个文件一个inode,这个inode Table中有多个inode,每个ionde都有唯一的编号。 新建文件时,OS在inode Table里面开辟一块空间,将新建的文件的属性填到里面, 需要块了给他分配,不需要就先不分配。文件的大和小就决定它有多个块,当这个文件有多个块的时候,占哪些块也算文件的属性,因此这个属性也在inode Table里。也就是说,inode Table 一定和数据块要建立某种联系。在Linux中,文件属性中,不包含文件的名称!!OS其实根本不知道文件的名字,只知道文件的编号。 在Linux系统里面标识文件用的是inode文件编号。
#define NUM 15 struct inode { inode number 文件类型 权限 引用计数 拥有者 所属组 ACM时间 int block[NUM];-----数据块的编号的数字 }
我们要找一个文件,只要找到文件的inode编号,就可以在它的inode表里面找到它的inode,就可以找到block,再根据块号就可以知道到文件的内容。
当文件特别大的时候,我们不可能将文件使用的block块的数量全都放在inode中,因此,系统将inode记录block号码的的区域分为12个直接、1个间接、1个双间接、1个三间接记录区。
Data blocks:存文件内容的区域,以块的形式给我们呈现出来。常见的是4KB大小-----文件系统的块大小。在磁盘当中新建一个文件,哪怕只写一个字节,在文件系统中都要在某一个分区里面找到某一个块组,在这个块组里面申请一个块,这个块的大小必须是4KB,8个扇区。文件系统在先进行读文件或者写文件时,文件系统访问的最小单位是512,字节进行块级别的访问。一般而言,每个块只有自己的数据。 前12是直接索引,也就是直接是文件的内容。
每一个分区再被使用之前,都必须提前先将文件系统的属性信息提前设置进对应的分区中,方便我们后续使用这个分区或者分组。
Linux系统中,一个文件,一个inode。每一个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区) inode表示文件的所有属性,文件名,并不属于inode内的属性。
新建一个文件,系统要做什么?
新建文件首先要确认在哪个分区的哪个分组里面,也就是可以知道路径。首先查GDT,发现inode还有很多,然后再查inode bitmap扫描它的位图结构,扫描到最近一个没有被使用的inode编号,将找的的哪个位图 由0置1 然后找到这个编号的inde将文件属性填进去。当要写入数据的时候,首先确定要写入的数据的大小,确定你需要几个块,在inode bitmap里找到没有被使用的块,将对应的块号填充到inode属性对应的特定的下标里,然后直接跳转到data block将内容写道对应的块里面。
删除一个文件,系统要做什么?
根据地址知道此文件属于哪个分区,根据inode范围知道属于哪个分组。 删一个文件的时候,拿到文件编号,到inode Bitmap里找到文件的inode编号,看它的位图是1说明他是有效的,然后再去inode Table读取它的属性,获得对应的块的块号,在Block Bitmap中将所有块号全部清零,然后再去inode Bitmap里将对应的清0,就完成了文件的删除。 删除文件时,只需要修改Block Bitmap、inode Bitmap 和属性与内容没有关系。
查找一个文件,系统要做什么?
拿到inode,在inode bitmap里面查看属性 是1代表有效,在inode tbale里面拿到文件属性,就可以找到这个文件对应的块,就可以拿到文件的内容。
修改一个文件,系统要做什么?
修改文件属性,根据inode 在inode table里面拿到文件属性,修改文件属性。修改文件内容的时候,在属性里面就可以知道文件所占用的块,找到之后对文件内容进行就该就好了。
那么,我们怎么知道一个文件的inode编号??? 使用者从来没有关心过inode,用的都是文件名!! 其实是从根目录往下找的。
目录也是文件,也有自己对应的inode。 文件=内容+属性 因此,目录有属性,目录也有数据块。数据块里放的是:该目录下,文件的文件名 和 对应文件的inode的映射关系!!
1、为什么同一个目录下不能有同名文件:因为文件名是一个key值,要找到对应的inode,要是同名冲突了,就无法找到指定文件了。
2、目录下,没有写权限(w权限),我们无法创建文件:如果没有w权限,那么该文件的文件名和inode的映射关系无法写到对应的数据块里。
3、目录下,没有r权限,无法查看文件:无法拿到目录和文件名的映射关系,就没有inode,就读不了文件。
总结:目录也是文件,因为Linux下一切皆文件,那么目录也有它对应的属性。 目录的data block该目录下的文件名和它所对应的inode的映射关系,这就意味着不分目录和普通文件,只分inode和data block, 我们要拿文件内容还是要提取文件名和inode的映射关系, 只取决于文件类型( ll显示的第一列的字母) 如果没有写权限,就不能对文件进行修改和删除,因为如果进行修改和删除就要对data block文件和inode做修改,没有写权限就不能进行修改。
3、软链接&&硬链接
ln -s file.txt soft-link 建立软链接 -s是代表建软链接 由后者指向前者
软连接是一个独立的文件 因为它具有独立的inode,有自己的数据块。 建立软连接,引用计数不变,还是1。软连接并不影响目标文件。软连接有自己的inode属性和数据块,它这个数据块里面放的是所指向文件的路径。删软链接并不影响这个目标文件,但是删掉目标文件,软链接就没有指向了,就会出错。软连接,就像windows里面的快捷方式。
软链接应用场景:当一个文件的路径在很深处时,我们要在当前路径下执行程序,我们就可以创建一个软连接。 然后我们不带路径就可以执行了。
ln test.txt hard-link 建立硬链接 由后者指向前者
硬链接不是一个独立的文件,因为它没有独立的inode。 它是在指定目录下,对它所指向的文件构建了一个别名。因为它只需要在数据块中添加一个文件名和它所指向文件的映射关系。 建立一个硬链接,引用计数加一。其实,所谓的建立硬链接,本质就是在特定目录的数据块中新增 文件名 和 指向文件的inode编号 的映射关系。 任意一个文件都有inode,每一个inode内部都有引用计数器(这个数字代表有多少个文件名指向我这个inode)。 目录里面保存的是文件名:inode编号 的映射关系 eg:文件1 文件2 文件3 都指向同一个inode 如果删除一个文件 这个inode还存在 引用计数减一 直到引用计数为0 文件才被删除。 磁盘文件的硬链接数减到0才会被删除
硬链接应用场景:
dir是一个目录,这个目录刚创建出来的时候,它的引用计数就是2,因为在这个目录里面有一个"." 表示的是当前目录,他们两个的inode是一样的,也就是说 这个 “.”就是dir的硬链接
".."表示上级目录
我们可以看到,在dir目录下创建一个dir1目录,就会使dir的引用计数由2变为3,那是因为 dir目录中的“ . " 是dir的硬链接,dir1目录中的” . . " 也是dir的硬链接 因此它的引用计数就是3。 硬链接的存在要维持Linux目录的整体结构!! Linux是个多叉树,每个目录都有
” . " 和 ” . . " 可以回指向父目录,因此我们可以采用相对和绝对路径进行自由的定位。
总而言之,通常用来进行路径定位,采用硬链接,可以进行目录间切换。
Linux系统不允许普通用户对目录建立硬链接:系统 ”只许州官放火,不许百姓点灯“ 因为会出现环路问题。虽然说系统中本来就存在环路问题,因为每个目录中都有 ". "和 ". ." 这个会指向上级目录。但是在系统做搜索时,不会对 ". "和 ". ." 这种隐藏路径做搜索,也就是说系统不用这个 只是在找目录的时候用一下,因此是不影响的!