1.了解磁盘的物理结构
磁盘计算机上唯一的一个机械设备,同时它还是外设
机械磁盘很便宜,虽然效率会慢一些,所以企业一般使用机械磁盘,因为便宜
磁盘不仅仅外设,还是一个机械设备(盘片、磁头),所以磁盘一定非常慢
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-1.png)
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-2.png)
盘片:一片两面,有一摞盘片
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-3.png)
磁头:一面一个磁头
一个磁头负责一面的读取
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-4.png)
马达比如说剃须刀,或者手机的震动等
所以盘片就可以 以顺时针的方式高速旋转
同时在磁头位置也存在一个马达,控制磁头左右来回摆动
磁头是共进退的,要不一块过去,要不就一块不去
磁盘盘片上有无数个基本单元,每一个基本单元按照特定的空间排布好的,每一个单元就是磁铁
南极表示1,北极表示0,
向磁盘写入:把北极改成南极 (N->S)对内容做磁化
删除磁盘数据:把数据从南极设置为北极 (S->N)
这样就可以完成微观上 一个比特位的读和写
磁头本质上 是对数据做写入和读取,更改基本元素的南北极,读取南北极
磁盘的具体物理存储结构
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-5.png)
整体结构
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-6.png)
抽象的一面结构
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-7.png)
磁盘中存储的基本单元是扇区,一般扇区的大小为512字节或者4KB字节
一般磁盘所有的扇区都是512字节大小
同半径的所有的扇区即为磁道
在一面上,如何在硬件上定位一个扇区?
1.先定位在哪一个磁道—由半径决定
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-8.png)
2.再确定在该磁道,在哪一个扇区,根据扇区的编号,来定位一个扇区
所以首先要定位哪一个面
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-9.png)
磁头是共进退的,半径相同的每一个面上的磁道共同在抽象上就会形成一个柱面
只需要确定用哪一个磁头读取,磁头的编号就表示哪一个面
所以定位任意一个扇区,需要确定 磁头head 、柱面 cylinder、扇区 sector 即CHS定位法
普通文件中包含属性和数据,都可以看做数据(0,1),占用一个或者多个扇区,来进行自己的数据存储
既然能用CHS定位为任意一个扇区,就能定位任意多个扇区,从而将文件从硬件角度进行读取或者写入
2.逻辑抽象
OS内部是不是直接使用CHS地址?不是
第一点:因为OS是软件,磁盘是硬件,硬件定位一个地址,用的是CHS,但是如果OS直接用了这个地址,万一硬件改变,OS也要发生变化,所以OS要和硬件做好解耦工作
第二点:即便是扇区512字节,单位IO的基本数据量也是很小的,所以硬件是按照512字节处理,
操作系统实际进行IO,基本单位是4KB
操作系统和磁盘进行交互时,基本以4KB为单位,
基本大小:进行磁盘读取和磁盘写入时,必须以基本单位为基本大小,来与外设进行交互
哪怕只修改一个比特位,也要把一个比特位所在的4KB全部读到内存,
把一个比特位改完,再把4KB内容全部写到目标文件中,要以块的方式整体与外设进行交互
所以一般把磁盘称为 块设备
所以OS需要有一套新的地址,来进行块级别的访问
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-10.png)
把盘面抽象成一种线性结构
以一个盘面举例
相同磁道的东西一定放在一起的
整体可以看作是数组,设置数组名为 sector_disk1
初步完成了从物理逻辑到线性逻辑抽象的过程
因为看作是一个数组,而数组都是有下标的
假设数组下标为n,定位一个扇区,只需要数组下标就可以定位一个扇区了
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-11.png)
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.文件系统
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-12.png)
为了方便管理,就把数组拆分为一个个的区域
若感觉管理500GB太难了,就减少管理,从而管理150GB,将管理小的经验复制,从而使每一个小的都管理好
从而使500GB整体管理好 ,这种思想就叫做分区
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-13.png)
虽然分完区小了很多,但依旧很大,所以操作系统对整个分区还会在做分组
假设每个区为150GB,就把15GB为一组,把其中一个组管理好了,按照一个组的管理方式就把所有组管理好了
由于每个区都可以分组,就有了 Block group
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-14.png)
一个分区当中最开始有一个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 -li
total 4
1311370 -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]$ ll
total 4
-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
lrwxrwxrwx 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 -li
total 4
1311370 -rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
1311371 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]$ ll
total 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-hard
lrwxrwxrwx 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 -li
total 8
1311370 -rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 myfile.txt
1311370 -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]$ ll
total 4
-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 my-hard
[yzq@VM-8-8-centos lesson1]$ cat my-hard
hello world
hello world
hello world
hello world
硬链接中的引用计数
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-15.png)
ref count默认为1 ,若有新的指向过来,执行++ 变为2
ref count称为 硬链接数 本质是一种引用计数
代表有多少个文件名指向我,默认情况下有一个文件名和inode映射关系就为1,若再建立一个文件名和inode的映射关系就增加为2,若删除一个文件,则ref count-- ,直到计数为0对应的文件才真的会删掉
2.提出软硬链接的应用场景
软链接的使用
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-16.png)
若可执行程序在多级目录中,正常来说想要调用多级目录只能一层一层就写
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-18.png)
通过使用软链接,将需要调用的可执行程序命名为mytest
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-19.png)
此时直接调用mytest 即可达到调用多级目录下的可执行程序的目的
硬链接的使用
创建多个文件 ,硬链接数都为1
创建一个目录 dir ,硬链接数为2
- 普通文件是硬链接数为1,因为只有一组文件名和inode的映射关系
- 目录的硬链接数为2,说明被其他文件名对应的inode的映射关系指向了
一个目录也是一个文件,所以dir目录算一个
进入目录dir中,. 作为隐藏文件 inode编号与目录dir相同,所以硬链接数为2
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-23.png)
. 与 dir 目录的inode编号相同
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-24.png)
… 与上一级目录的inode编号相同
在dir目录下再次创建一个子目录d1
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-25.png)
d1中的. 的inode编号与d1目录相同
d1中…与上一级目录dir的inode编号相同
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-26.png)
dir目录的硬链接数变为 3 ,
除了dir目录本身与目录中的 . 以外 ,在子目录d1下的 … inode编号也与dir目录相同
不能给目录建立硬链接
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-27.png)
当给目录dir建立硬链接时,发现并不能成功
若给目录建立硬链接,容易造成环路路径问题
![【Linux】基础IO——文件系统](https://imgs.yssmx.com/Uploads/2023/04/407551-28.png)
若在lesson1目录找一个文件,依次向下到达dir-link ,而dir-link又相当于是lesson1,所以又会重新在lesson1目录找文件
5. 解释文件的三个时间
Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间
change代表对一个文件的属性做修改
chmod+x 对myfile.txt文件的属性做修改,此时change的时间更新成为最新了
modify 代表对文件的内容做修改
使用重定向 往myfile.txt文件中追加内容 ,此时modify的时间更新为最新了,而一般改内容 属性也会跟着变化
Access 文件的访问时间文章来源:https://www.toymoban.com/news/detail-407551.html
使用vim通过进入文件中,但不修改 ,而再次使用stat时,Access的时间更新为最新了文章来源地址https://www.toymoban.com/news/detail-407551.html
到了这里,关于【Linux】基础IO——文件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!