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

这篇具有很好参考价值的文章主要介绍了【Linux】基础IO——文件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.了解磁盘的物理结构

磁盘计算机上唯一的一个机械设备,同时它还是外设
机械磁盘很便宜,虽然效率会慢一些,所以企业一般使用机械磁盘,因为便宜
磁盘不仅仅外设,还是一个机械设备(盘片、磁头),所以磁盘一定非常慢

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

盘片:一片两面,有一摞盘片


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

磁头:一面一个磁头
一个磁头负责一面的读取


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

马达比如说剃须刀,或者手机的震动等
所以盘片就可以 以顺时针的方式高速旋转
同时在磁头位置也存在一个马达,控制磁头左右来回摆动
磁头是共进退的,要不一块过去,要不就一块不去


磁盘盘片上有无数个基本单元,每一个基本单元按照特定的空间排布好的,每一个单元就是磁铁
南极表示1,北极表示0,
向磁盘写入:把北极改成南极 (N->S)对内容做磁化
删除磁盘数据:把数据从南极设置为北极 (S->N)
这样就可以完成微观上 一个比特位的读和写
磁头本质上 是对数据做写入和读取,更改基本元素的南北极,读取南北极

磁盘的具体物理存储结构

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

整体结构


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

抽象的一面结构


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

磁盘中存储的基本单元是扇区,一般扇区的大小为512字节或者4KB字节
一般磁盘所有的扇区都是512字节大小
同半径的所有的扇区即为磁道


在一面上,如何在硬件上定位一个扇区?

1.先定位在哪一个磁道—由半径决定

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

2.再确定在该磁道,在哪一个扇区,根据扇区的编号,来定位一个扇区

所以首先要定位哪一个面

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

磁头是共进退的,半径相同的每一个面上的磁道共同在抽象上就会形成一个柱面
只需要确定用哪一个磁头读取,磁头的编号就表示哪一个面
所以定位任意一个扇区,需要确定 磁头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——文件系统

把盘面抽象成一种线性结构
以一个盘面举例
相同磁道的东西一定放在一起的
整体可以看作是数组,设置数组名为 sector_disk1


初步完成了从物理逻辑到线性逻辑抽象的过程
因为看作是一个数组,而数组都是有下标的
假设数组下标为n,定位一个扇区,只需要数组下标就可以定位一个扇区了

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

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——文件系统

为了方便管理,就把数组拆分为一个个的区域
若感觉管理500GB太难了,就减少管理,从而管理150GB,将管理小的经验复制,从而使每一个小的都管理好
从而使500GB整体管理好 ,这种思想就叫做分区


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

虽然分完区小了很多,但依旧很大,所以操作系统对整个分区还会在做分组
假设每个区为150GB,就把15GB为一组,把其中一个组管理好了,按照一个组的管理方式就把所有组管理好了
由于每个区都可以分组,就有了 Block group


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

一个分区当中最开始有一个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——文件系统

ref count默认为1 ,若有新的指向过来,执行++ 变为2
ref count称为 硬链接数 本质是一种引用计数
代表有多少个文件名指向我,默认情况下有一个文件名和inode映射关系就为1,若再建立一个文件名和inode的映射关系就增加为2,若删除一个文件,则ref count-- ,直到计数为0对应的文件才真的会删掉

2.提出软硬链接的应用场景

软链接的使用
【Linux】基础IO——文件系统

若可执行程序在多级目录中,正常来说想要调用多级目录只能一层一层就写

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


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

通过使用软链接,将需要调用的可执行程序命名为mytest


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

此时直接调用mytest 即可达到调用多级目录下的可执行程序的目的

硬链接的使用

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

创建多个文件 ,硬链接数都为1


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

创建一个目录 dir ,硬链接数为2


  • 普通文件是硬链接数为1,因为只有一组文件名和inode的映射关系
  • 目录的硬链接数为2,说明被其他文件名对应的inode的映射关系指向了
    一个目录也是一个文件,所以dir目录算一个

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

进入目录dir中,. 作为隐藏文件 inode编号与目录dir相同,所以硬链接数为2


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

. 与 dir 目录的inode编号相同


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

… 与上一级目录的inode编号相同


在dir目录下再次创建一个子目录d1

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

d1中的. 的inode编号与d1目录相同
d1中…与上一级目录dir的inode编号相同


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

dir目录的硬链接数变为 3 ,
除了dir目录本身与目录中的 . 以外 ,在子目录d1下的 … inode编号也与dir目录相同


不能给目录建立硬链接
【Linux】基础IO——文件系统

当给目录dir建立硬链接时,发现并不能成功


若给目录建立硬链接,容易造成环路路径问题

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

若在lesson1目录找一个文件,依次向下到达dir-link ,而dir-link又相当于是lesson1,所以又会重新在lesson1目录找文件

5. 解释文件的三个时间

Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间

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


change代表对一个文件的属性做修改

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

chmod+x 对myfile.txt文件的属性做修改,此时change的时间更新成为最新了


modify 代表对文件的内容做修改

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

使用重定向 往myfile.txt文件中追加内容 ,此时modify的时间更新为最新了,而一般改内容 属性也会跟着变化


Access 文件的访问时间
【Linux】基础IO——文件系统

使用vim通过进入文件中,但不修改 ,而再次使用stat时,Access的时间更新为最新了文章来源地址https://www.toymoban.com/news/detail-407551.html

到了这里,关于【Linux】基础IO——文件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    大家好我是沐曦希💕 空文件,也要在磁盘占据空间,因为文件也有属性,属性也属于数据,需要空间进行存储。所以 文件包括内容和属性 所以 对文件操作就是对内容或者对属性进行操作,或者对内容和属性进行操作。 文件具有唯一性,所以在 标定一个文件时候,必须使用

    2024年02月02日
    浏览(33)
  • Linux之基础IO文件系统讲解

    在C语言中,读文件和写文件是常见的操作,用于从磁盘读取数据到内存或将数据从内存写入磁盘文件中。这些操作需要使用标准库中的文件I/O函数。下面我将详细解释如何在C语言中进行读文件和写文件操作,并举例说明。 在C语言中,读取文件的过程涉及以下步骤: 打开文

    2024年02月11日
    浏览(29)
  • 【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】

    继上一篇 【Linux上创建一个LVM卷组,将多个物理卷添加到卷组中使用】 创建一个卷组,并将多个物理卷添加到该卷组中。 在卷组上创建一个逻辑卷,并进行文件系统格式化。 将逻辑卷挂载到指定目录并自动挂载。 扩展逻辑卷的大小,并调整文件系统以适应扩容后的存储空间

    2024年01月22日
    浏览(31)
  • 【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 我们所有的文件都是与进程相关的文件–进程打开的文件 系统中是不是所有的文件都被打开了呢?如果没

    2024年04月11日
    浏览(34)
  • 【Linux】基础IO——文件系统|软硬链接|动静态库

    基于上篇博客所写到的文件各种操作都是基于被打开文件所进行操作的,那么如果一个文件没有被打开它存在哪里呢?这个答案毫无疑问肯定是存在于磁盘上的。那么,对于一个没有打开的文件(也就是磁盘文件)我们应该如何理解呢? 这里我们所要讲的磁盘是机械硬盘、即

    2024年02月04日
    浏览(32)
  • 【Linux】基础 IO(文件系统 & inode & 软硬链接)-- 详解

    1、前言 我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,

    2024年03月21日
    浏览(34)
  • 【Linux后端服务器开发】基础IO与文件系统

    目录 一、基础IO 1. C语言文件读写 2. 标志位传参 3. C语言与系统调用关系 二、文件系统 1. 文件描述符 2. 输入输出重定向 文件调用 库函数接口: fopen、fclose、fwrite、fread、fseek 系统调用接口:open、close、write、read、lseek r/w/a :读/写/追加 若打开的文件不存在,“r”报错,“

    2024年02月15日
    浏览(49)
  • [Linux]基础IO详解(系统文件I/O接口、文件描述符、理解重定向)

            hello,大家好,这里是bang___bang_ ,今天和大家谈谈Linux中的基础IO,包含内容有对应的系统文件I/O接口,文件描述符,理解重定向。    目录 1️⃣初识文件 2️⃣ 系统文件I/O接口 🍙open 🍙write 🍙read 🍙close 3️⃣文件描述符 🍙012 🍙内核中文件描述符的探究 🍙分配

    2024年02月12日
    浏览(24)
  • Linux系统资源分析手段:CPU,内存,磁盘与网络IO的瓶颈定位

    用于优化: 在程序编码完成后,我们通常要对自己编写的工具进行功能测试与性能分析。 用于监控: 在观察某个系统的运行情况时,需要观察系统内多个中间件及组件的资源占用情况。 用于测试: 在开启某个服务时,我们需要拥有对于该服务运行时资源占用的量化手段。

    2024年01月18日
    浏览(68)
  • 【Linux进行时】磁盘文件结构

    上篇文章,我们提及文件是存放在磁盘当中,本篇文件我们来了解一下磁盘的结构!!! ❓什么是磁盘? 💡磁盘(disk)是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包