当前位置: 首页 > news >正文

Linux操作系统之文件系统上

文章目录

  • 1. 理解硬件
    • 1.1 磁盘
    • 1.2 磁盘的物理结构
    • 1.3 磁盘的存储结构
    • 1.4 CHS地址定位
    • 1.5 磁盘的逻辑结构
    • 1.5.1 理解过程
    • 1.5.2 真实过程
    • 1.6 CHS && LBA地址
  • 2. 引入文件系统
    • 2.1 引入“块”概念
    • 2.2 引入“分区”概念
    • 2.3 引入“inode”概念

1. 理解硬件

1.1 磁盘

  • 机械硬盘是计算机中唯一的一个机械设备
  • 磁盘是块设备,属于外设
  • 磁盘的读取相对内存及CPU来说是很慢的
  • 但磁盘的容量大,价格便宜

如下图所示:
在这里插入图片描述
在这里插入图片描述

1.2 磁盘的物理结构

在这里插入图片描述

1.3 磁盘的存储结构

在这里插入图片描述
扇区:是磁盘存储数据的基本单位,容量一般为512字节,即块设备

磁道:由一个个的扇区组成,每个磁道的扇区数相同,越靠近内圈的磁道,其扇区存储密度越大

柱面:由各个扇面上半径相同的磁道组成,同样每个柱面的扇区数也是相同的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何定位一个扇区?
①先确定磁头要访问哪一个柱面(cylinder)
②再确定是哪一个磁头,即定位磁头(header)
③最后确定是哪个扇区(sector)

1.4 CHS地址定位

文件=内容+属性,这些都是数据,即都是存放在扇区中的,而在磁盘中,是通过CHS地址定位的方式来查找扇区。

  • 扇区数(Sector):扇区是磁盘读出和写入信息的最小单位,通常大小为512字节,每个磁道都被切分成很多扇区,每道的扇区数相同
  • 磁头数(Head):每个盘片一般有上下两面,分别对应1个磁头,总计两个磁头
  • 磁道数:磁道是从盘片外圈往内圈编号,从0开始,靠近主轴的同心圆用于停靠磁头,不存储数据
  • 柱面数(Cylinder):磁道构成柱面,数量上等同于磁道个数
  • 圆盘数:就是盘片的数量
  • 磁盘容量=磁头数 * 磁道(柱面)数 * 每道扇区数 * 每扇区字节数
  • 细节:传动臂上的磁头是共进退的

1.5 磁盘的逻辑结构

1.5.1 理解过程

磁带上可以存储数据,于是我们把磁带“拉直”,形成了线性结构,如下:
在这里插入图片描述
虽然磁盘本质上是硬质的,但是逻辑上我们可以把磁盘想象成为卷在一起的磁带,于是磁盘的逻辑结构类似如下:
在这里插入图片描述
这样每一个扇区,就有了一个线性地址(其实就是数组下标),这种地址叫做LBA
在这里插入图片描述

1.5.2 真实过程

重复细节:传动臂上的磁头是共进退的
在这里插入图片描述
柱面是一个逻辑上的概念,其实就是每一面上,相同半径的磁道在逻辑上构成柱面。所以,磁盘物理上分了很多面,但是在我们看来,逻辑上,磁盘整体是由“柱面”卷起来的。

所以,磁盘的真实情况是:

磁道——某一盘面的某一个磁道展开(一维数组):
在这里插入图片描述
柱面——整个磁盘所有盘面的同一个磁道,即柱面展开(二维数组):
在这里插入图片描述
整个磁盘——多张二维的扇区数组表(三维数组):
在这里插入图片描述
所以,寻址一个扇区,就是先找到哪一个柱面(Cylinder),再确定柱面内哪一个磁道(实则为磁头位置,Head),最后确定扇区(Sector),这就是CHS寻址的真实过程

每一个扇区都有一个下标,叫做LBA(Logical Block Address)地址,其实就是线性地址。OS只需使用LBA就可,LBA与CHS之间的互转是由磁盘来做的!

1.6 CHS && LBA地址

CHS转成LBA:

  • 磁头数 * 每磁道扇区数=单个柱面的扇区总数
  • LBA=C(柱面号) * 单个柱面的扇区总数 +H(磁头号) * 每磁道扇区数+S(扇区号)-1
  • 扇区号通常是从1开始的,而在LBA中,地址是从0开始的
  • 柱面和磁道都是从0开始编号的

LBA转成CHS:

  • 柱面号C=LBA//单个柱面的扇区总数
  • 磁头号H=(LBA%单个柱面的扇区总数)//每磁道扇区数
  • 扇区号S=(LBA%每磁道扇区数)+1
  • 其中//表示除后向下取整

有了上述的转换,对磁盘使用者来说,根本不需要关心CHS地址,而是直接使用LBA地址,磁盘内部会自己转换。即,磁盘就是一个元素为扇区的一维数组,数组下标就是每一个扇区的LBA地址。OS使用磁盘,就可以用一个数字访问磁盘扇区了。

2. 引入文件系统

2.1 引入“块”概念

  • 磁盘是典型的“块”设备,OS读取硬盘数据的时候,其实是不会一个一个扇区去读取,这样的效率过低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)
  • 磁盘的每个分区是被划分为一个一个的“块”。一个“块”的大小是由格式化的时候确定的,并且不可以更改,最常见的是4KB,即连续八个扇区组成一个“块”。“块”是文件存取的最小单位

注意:

  • 磁盘就是一个三维数组,我们把它看待成为一个“一维数组”,数组下标就是LBA,每个元素都是扇区
  • 每个扇区都有LBA,那么8个扇区是一个块,每一个块的地址我们也能算出来
  • 知道LBA:块号=LBA/8
  • 知道块号:LAB=块号*8+n(n是块内第几个扇区)

在这里插入图片描述

2.2 引入“分区”概念

  • 磁盘可被分成多个分区,从Windows观点来看,计算机中的一块磁盘可将其分为C,D,E盘。这里C,D,E就是分区。分区从实质上说就是对硬盘的一种格式化
  • 柱面是分区的最小单位,我们可以利用参考柱面号码的方式来进行分区,其本质就是设置每个区的起始柱面和结束柱面号码。将硬盘上的柱面进行平铺,将其想象成一个大的平面,如下所示:
    在这里插入图片描述

2.3 引入“inode”概念

文件=内容+属性,在Linux机器上使用ls -l命令时除了可以看到文件名,还可以看到文件属性。

shuaiming@iZbp175p82nv3n4e7j59elZ:~$ ls -l
total 16
drwxrwxr-x  2 shuaiming shuaiming 4096 Feb 24 11:49 make
-rw-rw-r--  1 shuaiming shuaiming  484 Feb 27 10:01 Makefile
drwxrwxr-x 18 shuaiming shuaiming 4096 Jun  5 21:31 operating-system---linux
drwxrwxr-x  9 shuaiming shuaiming 4096 Feb 17 11:46 vimplus

每行包含7列:

  • 模式
  • 硬链接数
  • 文件所有者
  • 所属组
  • 文件当前大小
  • 最后修改时间
  • 文件名

ls -l读取存储在磁盘上的文件信息,然后显示出来

在这里插入图片描述
文件数据都存储在“块”中,显然,还需找一个地方存储文件属性,如文件创建者,创建日期,内容大小等。这种存储文件属性的区域就叫做inode,即“索引节点”。通过命令ls -li可以查看文件索引节点号。

shuaiming@iZbp175p82nv3n4e7j59elZ:~$ ls -li
total 16
396811 drwxrwxr-x  2 shuaiming shuaiming 4096 Feb 24 11:49 make
397376 -rw-rw-r--  1 shuaiming shuaiming  484 Feb 27 10:01 Makefile
397546 drwxrwxr-x 18 shuaiming shuaiming 4096 Jun  5 21:31 operating-system---linux
397002 drwxrwxr-x  9 shuaiming shuaiming 4096 Feb 17 11:46 vimplus

此时第一列的数字就是文件索引节点号,每一个文件都有对应的inode,里面包含了与该⽂件有关的⼀些信息。

注意:

  • Linux下文件的存储是属性和内容分离存储的
  • Linux下,保存文件属性的集合叫做inode,一个文件对应一个inode,inode内有一个唯一的标识符,叫做inode号

在Linux下,文件属性节点inode长这样:

/** Structure of an inode on the disk*/
struct ext2_inode {__le16 i_mode; /* File mode */__le16 i_uid; /* Low 16 bits of Owner Uid */__le32 i_size; /* Size in bytes */__le32 i_atime; /* Access time */__le32 i_ctime; /* Creation time */__le32 i_mtime; /* Modification time */__le32 i_dtime; /* Deletion Time */__le16 i_gid; /* Low 16 bits of Group Id */__le16 i_links_count; /* Links count */__le32 i_blocks; /* Blocks count */__le32 i_flags; /* File flags */union {struct {__le32 l_i_reserved1;} linux1;struct {__le32 h_i_translator;} hurd1;struct {__le32 m_i_reserved1;} masix1;} osd1; /* OS dependent 1 */__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */__le32 i_generation; /* File version (for NFS) */__le32 i_file_acl; /* File ACL */__le32 i_dir_acl; /* Directory ACL */__le32 i_faddr; /* Fragment address */union {struct {__u8 l_i_frag; /* Fragment number */__u8 l_i_fsize; /* Fragment size */__u16 i_pad1;__le16 l_i_uid_high; /* these 2 fields */__le16 l_i_gid_high; /* were reserved2[0] */__u32 l_i_reserved2;} linux2;struct {__u8 h_i_frag; /* Fragment number */__u8 h_i_fsize; /* Fragment size */__le16 h_i_mode_high;__le16 h_i_uid_high;__le16 h_i_gid_high;__le32 h_i_author;} hurd2;struct {__u8 m_i_frag; /* Fragment number */__u8 m_i_fsize; /* Fragment size */__u16 m_pad1;__u32 m_i_reserved2[2];} masix2;} osd2; /* OS dependent 2 */
};
/** Constants relative to the data blocks*/
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

强调

文件名这个属性并未纳入到inode内部
inode的大小一般是128或256字节
任何文件的内容大小可以不同,但是属性大小一定相同

遗留两个问题:

    1. 已知硬盘是典型的“块”设备,OS读取硬盘数据的时候,读取的基本单位是“块”。“块”又是硬盘的每个分区下的结构,其必然是受到某种排布关系的制约,那这种关系是什么,通过这种关系怎么找到“块”呢?
    1. 上面提及的存储文件属性的inode是如何放置的呢?

敬请期待下节……

http://www.xdnf.cn/news/968131.html

相关文章:

  • 编程风格良好的条件比较语句
  • 基于NOMP和降维字典的杂波空时功率谱稀疏恢复算法matlab仿真
  • PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
  • 解决helm Doris重启后由于root密码修改导致加入集群不成功的问题
  • python数据结构和算法(3)
  • 智慧医疗能源事业线深度画像分析(上)
  • 项目四.高可用集群_ansible
  • 【OSG学习笔记】Day 18: 碰撞检测与物理交互
  • opencv RGB图像转灰度图
  • yolo11-seg 推理测试infer
  • Java正则表达式:贪婪、懒惰与独占模式解析
  • Tunna工具实战:基于HTTP隧道的RDP端口转发技术
  • java 数据结构-HashMap
  • 睡岗检测算法AI智能分析网关V4全场景智能守护,筑牢安全效率防线
  • golang -- unsafe 包
  • gitlab-runner 如何配置使用 Overwrite generated pod specifications
  • 图注意力卷积神经网络GAT在无线通信网络拓扑推理中的应用
  • 第四章 软件需求工程
  • 上位机开发:C# 读写 PLC 数据块数据
  • CppCon 2015 学习:Racing the File System
  • “详规一张图”——上海土地利用数据
  • 《大模型RAG进阶实战训练营毕业总结》
  • 多模态2025:技术路线“神仙打架”,视频生成冲上云霄
  • 雷卯针对易百纳海鸥派海思SD3403 SS928智能视觉AI视觉国产化4K视频开发板防雷防静电方案
  • 香橙派3B学习笔记9:Linux基础gcc/g++编译__C/C++中动态链接库(.so)的编译与使用
  • Vim 匹配跳转与搜索命令完整学习笔记
  • ArcGIS Pro 3.4 二次开发 - 任务
  • word的目录和正文之间存在一张空白纸,目录后面的分节符为什么调不上去?
  • 《函数之恋》
  • STL 4函数对象