[基础IO]文件描述符{重定向/perror/磁盘结构/inode/软硬链接}

文章目录

1. 再识重定向




图解./sf > file.txt 2>&1

1中内容拷贝给2 使得2指向file

再学一个

把file的内容传给cat cat拿到后再给file2

2.浅谈perror()



open()接口调用失败返回-1,并且错误码errno被适当的设置,如果在调用perror前显示设置errno,perror会输出对应的错误信息(for debug,Meaningless)

模拟实现perror()

3.初始文件系统

  1. 文件分为被打开的文件(内存文件)和未被打开的文件(磁盘文件)
  • 内存文件:被进程打开的文件,文件被加载到内存中供进程快速读写。
  • 磁盘文件:没有被打开的文件,保存在磁盘上。磁盘文件被分门别类的存储和管理,用于支持更好的存取。
  1. 学习磁盘文件的重点:
  • 单个文件角度: 文件的位置 大小 属性...
  • 系统角度: 文件的个数 每个文件的属性存储在哪里 如何快速找到 还可以存储多少文件 如何快速找到指定文件
  • 了解对磁盘文件进行分门别类的存储方式 支持更好更快的存取

了解磁盘文件

  1. 已知内存(Random Access Memory)是一种掉电易失存储介质 而磁盘(Hard Disk Drive)是一种永久性存储介质(除了磁盘还有 SSD[Solid State Drive]/U盘/flash卡/光盘/磁带)[速度内存>SSD>磁盘]
  2. 磁盘是一个外设 是计算机中唯一一个机械设备 速度慢(相比之下) OS有提速方式(后期讲)

磁盘的物理结构(笔记本不要在开机状态下来回移动 以免损坏磁盘)

  • actuator:伺服电机(音圈马达,包括永磁铁和线圈)
  • spindle:主轴(包括轴承与马达)
  • read/write heads:磁头(读写头)
  • platters(disks):磁盘盘片
  • logic board:磁盘主板(逻辑板)
  • connections:接口


  1. 磁盘盘面上存储二进制数据(通过磁头改变磁盘上的正负性)
  2. 利用磁性材料在磁场作用下的磁化性质,在磁盘表面上划分成许多小区域,根据不同的磁化方向来表示0和1的二进制数据,读写磁头在磁盘上移动实现数据的读写

磁盘的存储结构

  1. 一个盘面有两面,两面都可以读写数据,一个磁盘有多个盘面
  2. 盘片中有很多微小的磁块。磁头对磁块进行放磁,用南北极来标识0或1
  3. 在盘面上,每一圈对应着一个磁道,磁道又分为多个扇区。磁头在定位对应盘面的时候,整体共进退的,磁头共同在同一个磁道上找,整体形成柱面。
  4. 对于扇区来说,靠近圆心的扇区面积小,远离圆心的扇区面积大,每个扇区都是512byte,密度不一样。靠近圆心的密度大
  5. 扇区(Sector):扇区是磁盘上最小的存储单位 。它是一个固定大小的数据块,通常为512字节或4KB。磁盘上的数据以扇区为单位进行读写
  6. 磁道(Track):磁盘上的一个圆形轨道,位于磁盘的表面上。磁盘由多个同心圆组成,每个同心圆上都有一个磁道。磁道是磁盘上的物理结构,用于存储数据。磁道上的扇区可以被读写
  7. 柱面(Cylinder):柱面由多个磁盘盘片(Platter)上的相同磁道组成的垂直堆叠。每个盘片上的相同编号磁道构成一个柱面。柱面是磁盘存储系统中的逻辑概念,用于组织和寻址数据。操作系统和磁盘控制器使用柱面号来定位和访问磁盘上的数据
  8. 扇区是磁盘上最小的存储单位,磁道是磁盘上的一个圆形轨道,柱面是由多个磁盘盘片上的相同磁道组成的垂直堆叠。chs在磁盘存储系统中用于组织和管理数据,提供对数据的读写

扇区是一个相对独立的存储单元,扇区容量的存储大小通常是固定的。一个扇区可以存储512Byte的有效数据。(目前已存在能存储4kb的扇区).扇区的标号从1开始

寻址方式[磁盘的寻址方式按512byte(一个扇区)]

  1. CHS(Cylinder-Head-Sector)寻址方式是一种早期的磁盘寻址方式,用于定位和访问磁盘上的数据。它将磁盘的物理结构抽象为柱面、磁头和扇区的组合。将磁盘划分成多个柱面,每个柱面有多个磁头,每个磁头上有多个扇区。通过指定柱面、磁头和扇区的地址,可以定位到磁盘上的特定位置。
  2. CHS寻址方式使用柱面号、磁头号和扇区号来定位和访问磁盘上的数据。 通过指定柱面号、磁头号和扇区号,操作系统或磁盘控制器可以精确地定位到磁盘上的特定数据位置。
  3. CHS寻址方式存在一些问题,比如柱面、磁头和扇区数的限制以及寻址的不规则性 ,导致对于大容量磁盘的支持较为困难
  4. LBA寻址方式使用逻辑块号来定位和访问磁盘上的数据,更加简单和灵活,能够支持更大容量的磁盘 LBA寻址方式是一种依据逻辑块号对磁盘进行寻址的方式。逻辑块号是磁盘上每个扇区的唯一标识,通过逻辑块号可以直接寻址到磁盘上的特定扇区
  5. CHS寻址方式是使用柱面、磁头和扇区三个参数来确定磁盘上的数据位置。这种方式的优点是寻址方式简单,寻址速度快,但缺点是只能用于容量较小的硬盘,并且由于物理参数的限制,寻址范围有限
  6. 随着硬盘容量的增长,CHS寻址方式的局限性越来越明显。为了解决这个问题,LBA寻址方式被引入。LBA将磁盘上的数据位置表示为一个逻辑块地址,这个地址是一个线性地址,与实际的物理参数(柱面、磁头和扇区)无关。这种方式使得硬盘容量可以更大,寻址范围更广,并且简化了操作系统对磁盘的管理。
  7. 在LBA寻址方式中,磁盘被抽象为逻辑块的序列,每个逻辑块都有一个唯一的逻辑块号(LBA)。逻辑块是磁盘上的最小可寻址单位,对应磁盘上的扇区,通常为512字节或4KB。LBA寻址方式不需要考虑磁盘的物理结构,如柱面、磁头和扇区。通过指定逻辑块号,操作系统或磁盘控制器可以直接定位到磁盘上的特定逻辑块,无需关心磁盘的物理布局。LBA寻址方式的优点是简单和灵活。它可以支持更大容量的磁盘,并且不受物理结构的限制。此外,LBA寻址方式还可以提供更高的数据传输速率和更好的数据可靠性。
  8. 相比于CHS,LBA有以下优点:
    更大的硬盘容量:由于LBA使用线性地址,可以轻松管理大容量硬盘。
    更简单的寻址方式:LBA只需要一个逻辑块地址即可找到数据,比CHS的三个物理参数更简单。
    更快的寻址速度:由于LBA的线性地址结构,寻址计算更简单,寻址速度更快。
    更好的兼容性:LBA可以用于不同类型的磁盘,包括固态硬盘和网络存储设备等。
    从技术角度看,LBA比CHS更先进,更适合现代计算机系统对大容量存储的需求。

磁盘的逻辑存储结构

  1. 将磁盘盘片抽象为线性结构(类似于数组),扇区抽象为逻辑块(数组元素),每个逻辑块都有逻辑块号(数组下标)
  2. 磁盘在物理上的存储结构是圆形的,将其抽象成数组进行认识。数组含多个磁道,磁道含多个扇区.

将逻辑块序列当成数组,逻辑块号作为数组下标

  • 将数据存储到磁盘 ⇒ 将数据存储到数组
  • 找到磁盘特定扇区的位置 ⇒ 找到数组特定的位置
  • 对磁盘的管理 ⇒ 对该数组的管理 ⇒ 对一个小分区的管理

内存访问磁盘

  1. 磁盘在读取时基本单位是512Byte,OS一次读取多个扇区(512Byte太小了),比如1KB、2KB、3KB、4KB(主要)
  2. 一次读多个扇区,访问一个字节时,也要将4kb空间加载到到内存。
  3. 当访问数据A时,A附近的数据也可能被访问到。加载更多的数据到内存一定程度上减少了IO次数,本质是一种数据预加载,空间换时间!
  4. 内存也被划分成了多个4KB大小的空间,这个空间称为页框,一个4KB大小的块被称为页帧。

文件系统[文件 =内容 +属性]

  1. Linux管理磁盘文件,是将文件内容和文件属性分开管理的 Linux在磁盘上存储文件的时候,将内容和属性是分开存储的
  2. 虽然磁盘的基本单位是扇区(512字节),但是操作系统(文件系统)和磁盘进行I0的基本单位是4KB(8*512byte) 4kb ⇒ block大小 磁盘⇒ 块设备
  3. 磁盘存储数据的基本单位是扇区(512B~4KB),一个block是4KB(8*512B)大小。为什么不以扇区大小作为IO操作的基本单位呢?
  • 太小了,导致多次I0,导致效率的降低
  • 如果操作系统使用和磁盘一样的大小,当磁盘基本大小改变,0S的源代码也得改呢 ⇒ 硬件和软件(0S)进行解耦

文件系统与磁盘分区

  1. 磁盘分区是将一个物理硬盘分成多个逻辑区域的过程。每个分区可以看作是一个独立的硬盘,可以分别安装操作系统和存储数据。磁盘分区可以提高磁盘的利用率,提高系统的性能和安全性。
  2. 文件系统是操作系统用来管理磁盘上文件和目录的一种机制。文件系统定义了文件和目录的命名规则、存储方式、访问权限等信息。常见的文件系统有FAT、NTFS、EXT4等。
  3. 磁盘分区和文件系统密切相关,每个分区都需要使用一种文件系统来管理其中的文件和目录。Windows系统通常使用NTFS文件系统,Linux系统则通常使用EXT4文件系统。
  4. EXT是Linux系统中最常用的文件系统之一,它是一种基于磁盘块的文件系统,支持文件和目录的权限控制、硬链接和软链接等功能。EXT系列的文件系统在Linux系统中广泛使用,是Linux系统的重要组成部分。
  5. EXT:最早的EXT文件系统,已经很少使用。
    EXT2:EXT2是Linux系统中最常用的文件系统之一,支持文件和目录的权限控制、硬链接和软链接等功能。
    EXT3:增加了日志功能,可以更好地保护文件系统的完整性和稳定性。
    EXT4:增加了一些新的特性,如更快的文件系统检查和修复、更大的文件和分区支持、更好的性能和可靠性等。

磁盘文件系统图


Boot Block :引导块,磁盘分区中的引导块是存储引导加载程序、引导信息和分区表 的特殊区域。引导加载程序和引导信息用于启动操作系统和提供必要的配置信息;分区表中记录了磁盘上的分区布局和分区的起始位置、大小等信息。boot block有多份拷贝,防止一份损坏,全盘皆失 启动块(Boot Block)的大小是确定的
Block group :块组,一个磁盘分区可以再划分为多个块组。
block :数据块,操作系统和磁盘进行IO操作的基本单位是4KB,即1个block大小,因此磁盘又叫做块设备。block用于保存文件内容,一个文件可能包含多个block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设

定block大小为1024、2048或4096字节
Super Block :存储文件系统的属性信息 存放文件系统本身的结构信息,有属性信息、磁盘布局和资源使用情况等信息。超级块属于整个分区,分区有许多分组都有对应的超级块,多个意味着备份,保存在不同分组,若某一个分组的文件系统坏了,可以用其它分组的超级块恢复。存储了该分区文件系统的元数据信息。包括文件系统的大小、块大小、inode数量等,以及文件系统的状态和配置信息。
Data blocks :多个4KB(扇区*8)大小的集合 ,保存的都是特定文件的内容
inode :索引节点,是一个大小为128字节的空间,用于保存对应文件的属性。每个inode节点都有一个唯一的inode编号。一个文件只有一个inode。 一般而言一个文件,一个inode,一个inode编号
inode Table :该块组内,所有文件的inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号 索引节点表,多个文件的inode节点的集合,用于保存对应文件的属性。每个分区都有自己的inode table,用于存储该分区中所有文件和目录的inode信息。在同一分区中,通过inode编号,可以唯一地标识和定位一个文件或目录。
Block Bitmap :比特位和特定的block一一对应,比特位为1代表该block被占用
inode Bitmap :比特位和特定的inode是一一对应的。比特位为1,代表该inode被占用
GDT: [快组描述符,这个快组多大,已经使用了多少了,有多少个inode,已经占用了多少个,还剩多少,一共有多少个block,使用了多少... ] 用于存储该块组的元数据信息。包括块组的起始位置,块组的大小,块位图的位置,索引节点位图的位置,索引节点表的位置,块组中可用空间的大小,块组中可用索引节点的数量,其他块组特定的信息等,以便操作系统能够快速定位和管理文件系统中的数据块和索引节点。
元数据 : 描述数据的数据,它提供了关于数据的属性、结构、格式、位置和其他相关信息,帮助系统理解和管理数据。对于文件来说,元数据信息可能包括文件的名称、大小、创建时间、修改时间、访问权限等。对于分区文件系统来说,不单单只是保存文件信息,还有一批元数据结构专门负责管理信息,如Bitmap,用于管理Data blocks和inode Table;GDT,用于描述和管理整个块组;super block,用于描述和管理整个分区文件系统;元数据结构的存在才能够让文件的信息可追溯,可管理。
格式化: 磁盘格式化通常包括以下步骤:分区,创建文件系统(创建元数据结构,初始化元数据结构),完成格式化。实际上就是在写入文件系统。磁盘格式化是一个重要的步骤,确保磁盘上的文件系统结构正确创建,为文件和数据的存储提供了必要的基础。

  1. 能够让一个文件的信息可追溯,可管理
  2. 文件 = 内容 + 属性 文件内容保存在数据块中(Data Blocks),文件属性保存在Inode中。
  3. Inode(ext3-128byte ext4-256byte)包括一个文件的几乎所有属性(文件名不在Inode中)每个文件都有一个Inode
  4. 将块组分割成为上面的内容,写入相关的管理数据 每一个块组都这么搞 整个分区就被写入了文件系统信息 ⇒ 格式化

如何查找指定文件

一个文件"只"对应一个inode属性节点,inode编号但是一个文件可以有多个block

目录结构 -- inode编号 -- 某一个分区下的某一个块组 -- inode区域 -- 属性 -- 内容

如何找到同一个文件的多个block?想要找到文件,只要找到文件对应的inode编号,就能找到该文件的inode属性集合,如何找到文件的内容?⇒ blocks[]

c 复制代码
struct inode{
	int size;
	mode_t mode;
	...
	int blocks[15];
    blocks[0]  blocks[1]  blocks[2]
}
  1. 在inode中有一个blocks数组,0-11一般指向一个数据块,如果文件只占少量数据块,下标定位即可
  2. 12-13-14指向的数据块,里面可以保存其它数据块的块号,可以指向很多给数据块

inode中有文件名吗?

  1. inode属性中没有文件名。
  2. 目录也是文件,有自己的inode和data block。
  3. inode保存目录文件的属性;data block保存目录文件的内容 ⇒ 文件名和inode编号的映射关系。
  4. 进入目录需要x权限
    在目录下创建文件需要w权限: 向目录的data block中写数据 ⇒ 即文件名和inode的映射关系
    显示文件名与属性需要r权限 : 从目录的data block中读数据 ⇒ 即文件名和inode的映射关系
  5. 在同一目录下,不能创建同名文件。因为要保持文件名和inode编号的一一映射关系。

重新认识文件的操作

  1. 创建文件:
  • 在分区中找一块大小合适的块组;
  • 遍历inode Bitmap找到第一个为0的比特位将该位置1,创建文件inode。获得文件的inode编号。
  • 初始化文件inode,将文件的初始属性信息填入到inode中。若为空文件则清空和data blocks的映射关系
  • 向当前目录的data block中写入文件名(用户)和inode编号(文件系统)的映射关系。
  1. 删除文件:
  • 通过文件名,在目录文件的block中找到对应的inode编号。

  • 通过inode编号,找到文件的inode。其中包含一部分属于该文件的block编号。

  • 在block bitmap中将文件所属的block位,置0。在inode bitmap中将文件的inode位,置0。

  • 删除目录文件中记录的文件名和inode编号的映射关系。

  • 删除文件时,不需要将数据清空,只需要将文件所占的空间标定无效即可。⇒ 删除文件要比拷贝文件要快。

  • 系统会记录文件的删除日志,包括删除文件的文件名及inode编号。如果对应空间没有被覆盖写入的话,是可以利用工具恢复已经删除的文件的(将inode/block bitmap中的对应位置1)。

  1. 查看文件(ls -l):
  • 通过文件名,在目录文件的block中找到对应文件的inode编号。
  • 通过inode编号,找到文件的inode。inode中包含文件的属性信息。
  • 格式化输出文件名及各种属性。
  1. 修改文件:
  • 打开文件,将文件加载到内存,获取对应的文件描述符。

  • 进程将数据拷贝到缓冲区,根据刷新策略将缓冲区中的数据刷新到文件描述符对应的磁盘文件。

  • 通过文件名,在目录文件的block中找到对应文件的inode编号。

  • 通过inode编号,找到文件的inode。将数据刷新到文件的data block。

  • 为什么分区/块组有剩余空间但无法创建新文件?

    块组中的inode和data block的大小和个数是固定的,当inode有空余但data block占满,或data block有空余但inode占满 ⇒ 该分区/块组有剩余空间,但无法创建新文件(inode占满),或文件无法进行写入(data block占满)。

ls -l显示的信息都是什么?

权限 硬链接数 拥有者 所属组 大小 最后修改时间 文件名

stat + 文件名

acm

Access 最后访问时间

Modify 文件内容最后修改时间

Change 属性最后修改时间

4.软硬链接

如何创建?

创建软链接的命令:ln -s 路径+文件名 soft.link [-s: soft]

创建硬链接的命令:ln 路径+文件名 hard.link

有何区别?

  1. 软链接
    • 软链接有独立的inode,是一个独立的文件。
    • 软链接的文件内容是目标文件的路径。
    • 软链接相当于Windows系统下文件的快捷方式。
  2. 硬链接
    • 硬链接没有独立的inode,不是一个独立的文件。
    • 与目标文件共享同一个inode,其内容,属性与目标文件完全相同。
    • 本质上是在指定目录下建立了文件名和目标文件inode编号的映射关系,并没有创建新文件 ⇒ 起别名
    • 文件属性中的硬链接数表示与文件inode关联的文件名的数量。每创建一个硬链接,硬链接数就+1
    • 当删除文件时,如果文件的硬链接数大于1,就将硬链接数-1。如果文件的硬链接数等于1,真正删除这个文件。

对硬链接的认识

新创建的普通文件只有1个文件名与其inode关联,硬链接数为1。

新创建的目录文件硬链接数为2。分别为: 当前目录名,目录中的当前目录即.

在目录中每创建一个子目录都会使硬链接数+1 ⇒ 每一个子目录中都有一个上级目录...

目录的硬链接数 -2 == 个数子目录

如何删除?

  1. unlink:用于删除普通文件的系统调用,实际是解除文件名和inode的链接关系
  2. 一般命令 rm

言外知识点

在linux下 . [ 也可以是文件名

相关推荐
龙鸣丿1 小时前
Linux基础学习笔记
linux·笔记·学习
耶啵奶膘2 小时前
uniapp-是否删除
linux·前端·uni-app
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410833 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.3 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
XMYX-04 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
芯盾时代4 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方5 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘5 小时前
NFS服务器
运维·服务器