我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Linux】基础IO——文件系统

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【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

【Linux】基础IO——文件系统

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Linux】基础IO——文件系统

文章目录 1.了解磁盘的物理结构磁盘的具体物理存储结构在一面上,如何在硬件上定位一个扇区? 2.逻辑抽象磁盘只认CHS,LBA如何跟磁盘地址互相转化? 3.文件系统一个组的结构细节问题 4.软硬链接1. 制作软硬链
2023-08-19

【Linux】 基础IO——文件(下)

文章目录 1. 文件描述符为什么从3开始使用?2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件?4. FILE是什么,谁提供?和内核的struct有关系么?证明struct FILE结构体中存在文件描述符fd 5
2023-08-19

【Linux】基础IO——系统文件IO&&fd&&重定向

大家好我是沐曦希💕 文章目录 一、前言1.重新谈论文件2.重新谈论文件操作 二、回归C文件接口1.打开和关闭2.读写文件3.扩展 三、系统文件1.open和close2.write和read3.总结
2023-08-19

Linux基础IO【文件理解与操作】

✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Great minds discuss ide
2023-08-18

Linux系统文件系统及文件基础是怎么样的

这篇文章将为大家详细讲解有关Linux系统文件系统及文件基础是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。学习Linux,重难点在于掌握不同类别的文件系统及其作用。通过对Linux
2023-06-05

【创作赢红包】| 【Linux】 基础IO——自己实现文件接口FILE

文章目录 1. 创建makefile2. mystdio.h ——接口的声明3. mystdio.c —— 接口的实现1. MY_fopen的实现1.识别标志位2. 尝试打开文件3. 给用户返回MY_FILE对象,需要先创建对象4.
2023-08-20

Linux磁盘与文件系统的基础命令指的是哪些

Linux磁盘与文件系统的基础命令指的是哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。这里讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬
2023-06-16

【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接

🍎作者:阿润菜菜 📖专栏:Linux系统编程 这是目录 理解缓冲区1.观察调用C库接口的现象2.理解缓冲区存在的意义(节省进程IO数据的时间)3.调用系统接口对文件进行封装 --- 模仿C库设
2023-08-18

优化操作系统文件系统缓存:从基础到实践

操作系统文件系统缓存是一项关键的技术,它可以帮助提高文件系统的性能。本文将介绍文件系统缓存的基础知识,并演示如何优化文件系统缓存。
优化操作系统文件系统缓存:从基础到实践
2024-02-27

Linux基础命令---lpr打印文件

lprlpr指令用来打印文件,如果没有指定文件名,那么从标准输入读取内容。CUPS提供了许多设置默认目标的方法。首先查询“LPDEST”和“PRINTER”环境变量。如果没有设置,则使用lpoptions(1)命令的当前默认集,然后使用lp
2023-06-05

编程热搜

目录