Linux:文件系统

发布于:2025-03-03 ⋅ 阅读:(12) ⋅ 点赞:(0)

1.对于前面知识的一些复习:

系统调用有哪些:系统调用有哪些函数-CSDN博客 

重定向的本质:就是堆文件描述符里面下标的内容进行拷贝。

标准输入,输出,错误,典型的重定向。

标志位:O_APPEND,O_RDONLY。

一切皆文件的理解:

功能方法实现是不一样的,但是接口种类一样。
读写都是read和write
对某种设备进行读写访问的时候,看到的都是read或者write
在进程角度:操作系统看到一个file就等同于看到一个文件,操作系统了进程
让进程以为,所有东西都是文件

缓冲区:

大部分都是语言层面的缓冲区。

显示器:行刷新
向文件:全缓冲

用一次系统调用来进行多次写入。

2.对前面_gblic的完善usercode.c调用函数实现系统调用

 

2.1不带\n--->不做刷新

 由于写入文件是全缓冲,当取消\n的时候,那么就不会进行刷新,只有当程序结束的时候,close(filep),就会自动进行刷新,刷新到内核,然后在刷新到文件当中去,这样就会把缓冲区内部的全部写入到一起文件当中去。

2.2写完之后,立马刷新

 2.3 fsync数据立即刷新

 

把数据立马刷新到外设力:fsync
把该文件表舒服所对应的内容反应到外设上。

3.Ext系列文件系统 

3-1磁盘

引入

文件 = 内容+属性

被打开的文件 ->基础IO->内存

没被打开的文件->在磁盘上->把文件放在磁盘上,被我们找到???

文件是一种树状的目录结构,
分有多个路径(绝对和相对)

最终目的:保存到磁盘上,最基本的诉求就是被我们找到。 -->文件系统的工作。

 了解磁盘

         

磁盘分为企业级磁盘和桌面型磁盘。现在基本上就是固态磁盘。

特点:
1.机械磁盘是计算机中唯一的一个机械设备
2.磁盘属于外设
3.慢
4.容量大,价格便宜

服务器:里面都是磁盘

机柜:放服务器的

所有的机柜链接起来也就是机房。

不同的机柜执行不同的功能。

机房:
大公司,很大,很贵,大公司才具备。

磁盘工作原理 

磁盘:表面很光滑。
想像:有很多的小磁铁组成

比如说:
南极是1,北极是0
磁盘用南北极表示二进制。就像网络用波形图的高低表示01

用南北极表示二进制的写入,改变南北极来改变01.

磁盘组成 

磁道:磁盘由一系列的同心圆组成。
扇区:把磁道分割成一小节节。

一个小扇区可以储存512字节

磁盘存储的基本单位:一扇区(512字节)。

修改:改一个比特位,加载512字节,修改,再返回给该扇区。

磁盘分有多层。

3-2如何定位⼀个扇区呢?

CHS定址法:柱面 磁头 扇区,Cylind Head Sector

• 可以先定位磁头(header)

• 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)

• 定位⼀个扇区(sector)

具体:

⽂件=内容+属性都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇 区呢?

• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。

• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头

• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁 头,不存储数据

• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数

• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同

• 圆盘(platter)数:就是盘⽚的数量

• 磁盘容量=磁头数×磁道(柱⾯)数×每道扇区数×每扇区字节数

• 细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)


 

扇区长短不会影响容量(暂不做考略)

fdisk -l

3-3磁盘逻辑结构

1.理解过程

就像卷起来的山楂条,每一小条也就可以看做是储存的扇区。

 

而这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA。数组下标。

 2.真实过程(逻辑抽象)

磁盘,也就是线性结构,定位一个扇区用1个数字,使用数组下标。

操作系统管理变成对数组的管理。

⼀个细节:传动臂上的磁头是共进退的

柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱⾯。 所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。 

所以,磁盘的真实情况是: 磁道: 某⼀盘⾯的某⼀个磁道展开: 即:⼀维数组

柱⾯: 整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:

• 柱⾯上的每个磁道,扇区个数是⼀样的

• 这不就是⼆维数组吗

 整盘:

所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder),在确定柱⾯内哪⼀个磁道(其实就是磁头位置, Head),在确定扇区(Sector),所以就有了CHS。 我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组。 

每个扇区都有一个下标,这个叫做LBA

LBA地址转成CHS地址,CHS如何转换成为LBA地址。

 4.引入文件系统

4-1引入块设备

为什么要引入块?

字符设备不支持随机读取

硬盘是典型的块设备。

依次读取一个扇区效率太低了。
OS访问磁盘不易扇区为单位而是以块为单位->块是文件取的最小的单位。

一个块对应8个扇区,一个扇区512字节,一个块就对应4096字节。

怎么计算块

• 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇 区

• 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。

• 知道LBA:块号=LBA/8

• 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)

块*8+【0~7】 = 任意扇区的LBA

文件系统,使用磁盘块,事宜4KB为单位,对文件的管理转化成对块的管理。 

引入分区概念

柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起 始柱⾯和结束柱⾯号码。此时我们可以将硬盘上的柱⾯(分区)进⾏平铺,将其想象成⼀个⼤的平 ⾯,如下图所⽰

比如说:

把对800GB的管理,转化成对300GB管理,这就叫分区。
再把300GB分成30GB,管理后,后序直接拷贝管理

引入inode概念:属性结构体

属性结构体:
属性都是innode节后提,大小是固定的。128字节。

文件系统的载体是分区 ?什么意思

Linux下内容和属性是分开存储的。

每个文件有大小,字段,类型,
一个文件属性就是一个struct inode对象。
所有文件的属性大小都是一样的----128字节

“文件名不会保存在inode中,文件名是string对象,,大小不一,会导致inode大小发生变化”。

4-2块组的内部组成(Block group)

Data Block 

数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:

• 对于普通⽂件,⽂件的数据存储在数据块中。

• 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令 看到的其它信息保存在该⽂件的inode中。

• Block号按照分区划分,不可跨分区

inode Table

• 存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等

• 当前分组所有Inode属性的集合

• inode编号以分区为单位,整体划分,不可跨分区

 inode和数据块,都是跨组编号的。
inode和数据块,不能跨分区。
结论:在同一份分区内部,inode编号,和块号都是唯一的。

数据区:Data Block

数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:

• 对于普通⽂件,⽂件的数据存储在数据块中。

• 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls-l命令 看到的其它信息保存在该⽂件的inode中。

块位图(Block Bitmap)
*记录着Data Block中那个数据块已经被占用,那个数据没有被占用。
置为1,申请被占用,置为0,释放空间。

inode位图(inode Bitmap)
每个bit表示一个inode是否空闲可用

 

 GDT(group descriptoe table)
块组描述符表,

Super Block:超级块

 

4-3格式化:把Block Group里面的信息,写入到文件系统

 

操作系统需要管理信息加载到内存里,在内存里面操作完,再写入内存里面。


比如说:有10个super block那就把他们都加载到内存里面,进行执行。10个super block对应10个分区,链接起来链表,转化成对链表的管理

删除文件管理文件:两个bitmap,加载到内存里,进行操作

磁盘当中,管理信息加载到内存里面,在内存里面操作完,再写回内存里面。

4-4如何找文件?

拿到一个文件的inode,就可以找到该文件的所有信息

属性信息->数据块信息。

一个inode只能在对应分区有效。

 

访问一个文件就需要知道它的inode. 

先打开当前所在的路径,

要读取文件里面相应的内容,首先就先需要在data block 里面找到inode和文件名的对应关系,然后,再根据对应关系找到我们需要的inode,再根据inode可以得到文件信息的特性,实现对文件的查找。

 

但是由于我们访问任何文件都必须带有路径!!!

找任何文件,从根目录开始,进行路径解析(文件名->inode->在根据inode实现对文件查找。),找到相应的文件!!
默认路径,绝对路径,相对路径。

 ls 进程提供当前路径,code.c你提供的,两者一拼,绝对路径就有了。系统自动从根目录依次解析,最后找到对应的inode,实现找到文件。

4-5路径解析:

问题:

打开当前⼯作⽬录⽂件,查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗?

答案1:所以也要打开:当前⼯作⽬录的上级⽬录,额....,上级⽬录不也是⽬录吗??不还是上⾯的问 题吗?

我们访问 当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗?

答案2:所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录。

要访问它,不也得知道当前⼯作⽬录的inode 吗?

最终答案3:⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:

/home/whb/code/test/test/test.c

都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析。

所以说向上找到根目录就可以了。 

4-6路径缓存:struct dentry

磁盘上没有目录:

那tree是哪里的?为什么Linux会具有tree命令?

访问任何文件,都要从根目录下进行路径解析吗?
出现效率低下问题。

从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析


100次访问,100次解析吗?

|

解决:操作系统,在进行路径解析的时候,会把历史访问的所有目录(路径)形成一颗多叉树,进行保存--->Linux系统的树状目录结构。

路径记录在内存当中,dentry!!

  

 

 

访问的code.c的时候,叶子结点一定是空目录或者是文件。

code.c也挂在路径缓存上了。

例子:

第一次卡了一会 ,才出来

第二次,由于第一次,则已经创建了该文件的struct dentry结构体,那么再一次查找的时候,由于已经记录,所以一下就可以跑出来。

 第二次秒出

4-7 怎么确定inode是哪一个分区的?

 

磁盘

vda1:第一个分区 

 

把/dev/zero output放到./disk.img里面去,bs 大小等于1M,count = 5//???什么意思

#制作一个大文件

 

 

要访问一个分区,就要把分区和一个特定的目录进行挂在一起,

通过进去不同的目录->进入不同的分区


ls /dev/zero of(output)  = 

mkfs.ext:需要的文件系统 

df -h???:查看文件系统信息,
mount on:把分区挂在到哪个目录上。

sudo mount -t ext4 ./disk.img ./dir  把磁盘挂载到./dir上面

sudo unmont ./dir、解除挂载。

分区挂载后才可以使用。


该路径的前缀
不同的分区,挂载路径不一样
根据路径前缀,路径来区分不同的分区。
所有的分区和路径有关。

挂载:把一个分区挂载到一个目录下,可以根据该目录区分在那个分区,反过来也就是可以根据目录->路径前缀和来判断当前文件处于在哪一个分区。

5.软硬链接

5-1硬链接

硬链接本质不是一个独立的文件,它没有独立的inode。
本质是一组新的文件民和目标inode number的映射关系

功能:其实在linux中可以让多个⽂件名对应 于同⼀个inode。

[root@localhost linux]# touch abc

 [root@localhost linux]# ln abc def

 [root@localhost linux]# ls -li abc def

263466 abc

263466 def

用途:对文件进行备份。

• abc和def的链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode 263466的硬连接数为2。

• 我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则 将对应的磁盘释放。

5-2软连接

软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。

 [root@localhost linux]# ln -s abc.s abc
[root@localhost linux]# ls -li

263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 abc

261678 lrwxrwxrwx. 1 root root 3 9⽉ 15 17:53 abc.s -> abc

263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 def

 
软连接:是一个独立的文件,应为他有独立的inode.
文件内容+文件属性    软连接能干啥?
相当于windows下的快捷方式,保存目标文件的路径。