【Linux】基础IO——文件系统
文章目录
1.了解磁盘的物理结构
磁盘计算机上唯一的一个机械设备,同时它还是外设
机械磁盘很便宜,虽然效率会慢一些,所以企业一般使用机械磁盘,因为便宜
磁盘不仅仅外设,还是一个机械设备(盘片、磁头),所以磁盘一定非常慢
盘片:一片两面,有一摞盘片
磁头:一面一个磁头
一个磁头负责一面的读取
马达比如说剃须刀,或者手机的震动等
所以盘片就可以 以顺时针的方式高速旋转
同时在磁头位置也存在一个马达,控制磁头左右来回摆动
磁头是共进退的,要不一块过去,要不就一块不去
磁盘盘片上有无数个基本单元,每一个基本单元按照特定的空间排布好的,每一个单元就是磁铁
南极表示1,北极表示0,
向磁盘写入:把北极改成南极 (N->S)对内容做磁化
删除磁盘数据:把数据从南极设置为北极 (S->N)
这样就可以完成微观上 一个比特位的读和写
磁头本质上 是对数据做写入和读取,更改基本元素的南北极,读取南北极
磁盘的具体物理存储结构
整体结构
抽象的一面结构
磁盘中存储的基本单元是扇区,一般扇区的大小为512字节或者4KB字节
一般磁盘所有的扇区都是512字节大小
同半径的所有的扇区即为磁道
在一面上,如何在硬件上定位一个扇区?
1.先定位在哪一个磁道—由半径决定
2.再确定在该磁道,在哪一个扇区,根据扇区的编号,来定位一个扇区
所以首先要定位哪一个面
磁头是共进退的,半径相同的每一个面上的磁道共同在抽象上就会形成一个柱面
只需要确定用哪一个磁头读取,磁头的编号就表示哪一个面
所以定位任意一个扇区,需要确定 磁头head 、柱面 cylinder、扇区 sector 即CHS定位法
普通文件中包含属性和数据,都可以看做数据(0,1),占用一个或者多个扇区,来进行自己的数据存储
既然能用CHS定位为任意一个扇区,就能定位任意多个扇区,从而将文件从硬件角度进行读取或者写入
2.逻辑抽象
OS内部是不是直接使用CHS地址?不是
第一点:因为OS是软件,磁盘是硬件,硬件定位一个地址,用的是CHS,但是如果OS直接用了这个地址,万一硬件改变,OS也要发生变化,所以OS要和硬件做好解耦工作
第二点:即便是扇区512字节,单位IO的基本数据量也是很小的,所以硬件是按照512字节处理,
操作系统实际进行IO,基本单位是4KB
操作系统和磁盘进行交互时,基本以4KB为单位,
基本大小:进行磁盘读取和磁盘写入时,必须以基本单位为基本大小,来与外设进行交互
哪怕只修改一个比特位,也要把一个比特位所在的4KB全部读到内存,
把一个比特位改完,再把4KB内容全部写到目标文件中,要以块的方式整体与外设进行交互
所以一般把磁盘称为 块设备
所以OS需要有一套新的地址,来进行块级别的访问
把盘面抽象成一种线性结构
以一个盘面举例
相同磁道的东西一定放在一起的
整体可以看作是数组,设置数组名为 sector_disk1
初步完成了从物理逻辑到线性逻辑抽象的过程
因为看作是一个数组,而数组都是有下标的
假设数组下标为n,定位一个扇区,只需要数组下标就可以定位一个扇区了
OS是以4KB为单位进行IO的,一个操作系统对应的文件块要包括8个扇区
计算机常规访问方式:采用起始地址+偏移量的方式
只需要知道数据块起始位置的地址,即第一个扇区的下标地址 + 4KB(块的类型)
可以把数据块看作一种类型
所以块的地址本质就是数组的一个下标N
N的地址在OS中被叫做LBA,即逻辑块地址
磁盘只认CHS,LBA如何跟磁盘地址互相转化?
假设LBA地址为6500 ,单片大小为5000
首先确定在那一面,也就相当于在哪一个磁头上
H(磁头): int n=6500/5000=1 说明H的地址在第2面上
C(柱面):6500/1000=6 1000为磁道的大小,对应的H就在6号磁道上
S(扇区): 6500 %1000=500
所求扇区 就在 2号面中的6号磁道的第500个扇区
连续读取8个扇区,就能得到块
3.文件系统
为了方便管理,就把数组拆分为一个个的区域
若感觉管理500GB太难了,就减少管理,从而管理150GB,将管理小的经验复制,从而使每一个小的都管理好
从而使500GB整体管理好 ,这种思想就叫做分区
虽然分完区小了很多,但依旧很大,所以操作系统对整个分区还会在做分组
假设每个区为150GB,就把15GB为一组,把其中一个组管理好了,按照一个组的管理方式就把所有组管理好了
由于每个区都可以分组,就有了 Block group
一个分区当中最开始有一个Boot Block
会保存与操作系统启动相关的内容,如分区表和操作系统镜像地址
一个组的结构
一个组中分为 Super Block(超级块) 、Group Descriptor Table(组描述符)、Block Bitmap、inode Bitmap(位图)、inode Table (inode表)、Data blocks(数据块)
Super Block 保存的是文件系统的所有属性信息 如文件系统的类型、整个分组的情况
Super Block在各个分组里面可能都会存在,而且是统一更新的
为了防止Super Block区域坏掉,如果出现故障,整个分区不可以被使用,所以要做好备份
Group Descriptor Table
GDT:组描述符 – 改组内的详细统计等属性信息,用来描述整个
一般而言,一个文件内部所有属性的集合,被称为inode节点 ,大小一般为128字节
一个文件,一个inode,一个分区内部也会存在大量的文件即会存在大量的inode节点,一个group,需要有一个区域专门保存该group的所有文件的inode节点 即 inode table -----inode表
文件的内容是变化的,用数据块对文件内容保存的,所以一个有效文件要保存内容就需要1/n数据块
若有多个文件就需要更多的数据块,数据块称为 Data blocks
linux查找一个文件,是要根据inode编号,来进行文件查找到,包括读取内容
一个inode对应一个文件,而该文件inode属性和该文件的数据块是由映射关系的
inode Bitmap
共有4096*8个比特位,按照从低向高扫描位图时,比特位的位置对应inode表中的inode
为1表示inode正常工作,为0表示inode不正常工作
每一个比特位表示 一个inode是否空闲可用
Block Bitmap
每一个bit位表示data block是否空闲可用
细节问题
1.inode与文件名
Linux系统只认inode编号,文件的inode属性中,并不存在文件名
文件名是给用户用的
2.目录是文件么?
是的,目录有inode和内容
3.任何一个文件,一定在目录内部,所以目录的内容是什么?
目录要有内容就需要数据块,目录的数据块里面保存的是该目录下 文件名和inode编号对应的映射关系
在目录内,文件名和inode编号互为key值
4.当我们访问一个文件的时候,是在特定目录下访问的 cat log.txt
1.先要在当前目录下,找到log.txt 的 inode编号
2.一个目录也是一个文件,也一定属于 一个分区,在该分区中找到分组,在该分组中对应的inode table中,找到文件的inode
3. 通过inode与 对应的data block的映射关系,找到该文件的数据块 ,并加载到OS,并完成到显示器
4.软硬链接
1. 制作软硬链接,对比差别
创建文件myfile.tx,并向文件中一直追加 hello world
[yzq@VM-8-8-centos lesson1]$ touch myfile.txt[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt
[yzq@VM-8-8-centos lesson1]$ ls -litotal 41311370 -rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
查询当前myfile.txt文件的 inode编号为1311370
建立软链接
建立软链接 ln -s
[yzq@VM-8-8-centos lesson1]$ ln -s myfile.txt my-soft[yzq@VM-8-8-centos lesson1]$ lltotal 4-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txtlrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
对myfile.txt文件进行软链接,并命名为my-soft
当前文件链接数为1,并以l开头说明
[yzq@VM-8-8-centos lesson1]$ ls -litotal 41311370 -rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt1311371 lrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
输入 ls - i, 发现两者的inode编号不同
说明软链接是一个独立的链接文件,有自己的inode编号,必有自己的inode属性和内容
软链接内部放的是自己所指向的文件的路径
可以认为保存的是一个字符串,保存的是当前myfile文件的路径
建立硬链接
建立硬链接 ln
[yzq@VM-8-8-centos lesson1]$ ln myfile.txt my-hard[yzq@VM-8-8-centos lesson1]$ lltotal 8-rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 myfile.txt-rw-rw-r-- 2 yzq yzq 48 Apr 2 22: my-hardlrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
对myfile.txt文件进行硬链接,并命名为my-hard
发现 myfile.txt文件的链接数变为2
[yzq@VM-8-8-centos lesson1]$ ls -litotal 81311370 -rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 myfile.txt1311370 -rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 my-hard
输入 ls-li 后,发现硬链接my-hard和myfile.txt文件的inode编号相同
硬链接和目标文件公用同一个inode编号,意味着一定是和目标文件使用同一个inode
硬链接没有独立的inode
硬链接建立了新的文件名和老的inode的映射关系
若此时将myfile.txt文件删除,就会发现my-hard依旧可以运行 ,并为之前myfile.txt文件的内容
[yzq@VM-8-8-centos lesson1]$ rm myfile.txt[yzq@VM-8-8-centos lesson1]$ lltotal 4-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 my-hard[yzq@VM-8-8-centos lesson1]$ cat my-hardhello worldhello worldhello worldhello world
硬链接中的引用计数
ref count默认为1 ,若有新的指向过来,执行++ 变为2
ref count称为 硬链接数 本质是一种引用计数
代表有多少个文件名指向我,默认情况下有一个文件名和inode映射关系就为1,若再建立一个文件名和inode的映射关系就增加为2,若删除一个文件,则ref count-- ,直到计数为0对应的文件才真的会删掉
2.提出软硬链接的应用场景
软链接的使用
若可执行程序在多级目录中,正常来说想要调用多级目录只能一层一层就写
通过使用软链接,将需要调用的可执行程序命名为mytest
此时直接调用mytest 即可达到调用多级目录下的可执行程序的目的
硬链接的使用
创建多个文件 ,硬链接数都为1
创建一个目录 dir ,硬链接数为2
- 普通文件是硬链接数为1,因为只有一组文件名和inode的映射关系
- 目录的硬链接数为2,说明被其他文件名对应的inode的映射关系指向了
一个目录也是一个文件,所以dir目录算一个
进入目录dir中,. 作为隐藏文件 inode编号与目录dir相同,所以硬链接数为2
. 与 dir 目录的inode编号相同
… 与上一级目录的inode编号相同
在dir目录下再次创建一个子目录d1
d1中的. 的inode编号与d1目录相同
d1中…与上一级目录dir的inode编号相同
dir目录的硬链接数变为 3 ,
除了dir目录本身与目录中的 . 以外 ,在子目录d1下的 … inode编号也与dir目录相同
不能给目录建立硬链接
当给目录dir建立硬链接时,发现并不能成功
若给目录建立硬链接,容易造成环路路径问题
若在lesson1目录找一个文件,依次向下到达dir-link ,而dir-link又相当于是lesson1,所以又会重新在lesson1目录找文件
5. 解释文件的三个时间
Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间
change代表对一个文件的属性做修改
chmod+x 对myfile.txt文件的属性做修改,此时change的时间更新成为最新了
modify 代表对文件的内容做修改
使用重定向 往myfile.txt文件中追加内容 ,此时modify的时间更新为最新了,而一般改内容 属性也会跟着变化
Access 文件的访问时间
使用vim通过进入文件中,但不修改 ,而再次使用stat时,Access的时间更新为最新了
来源地址:https://blog.csdn.net/qq_62939852/article/details/129920884
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341