Linux:Ext系列文件系统

文章目录

一、理解硬件

1、磁盘

速度慢、容量大、价格偏移

磁盘的存储结构

磁盘的基本单位是:扇区(512字节)

每一个盘面都对应两个磁头

所有磁头共进退,因为只有一个传动臂

所有磁头所在磁道共同构成一个柱面

磁盘写入的时候,是向柱面进行批量写入的!

2、定位一个扇区
  • 可以先定位磁头(header)
  • 确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
  • 定位⼀个扇区(sector)
  • CHS地址定位

⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!

• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。

• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头

• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁头,不存储数据

• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数

• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同

• 圆盘(platter)数:就是盘⽚的数量

• 磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数

3、磁盘的逻辑结构

磁带上⾯可以存储数据,我们可以把磁带"拉直",形成线性结构

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA

磁道:

某⼀盘⾯的某⼀个磁道展开:

柱⾯:

整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:

所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder),在确定柱⾯内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。

每⼀个扇区都有⼀个下标,我们叫做LBA(Logical Block Address)地址,其实就是线性地址。

4、CHS 和 LBA地址 互相转换

CHS 转成 LBA:

  • 磁头数*每磁道扇区数 = 单个柱⾯的扇区总数
  • LBA = 柱⾯号C单个柱⾯的扇区总数 + 磁头号H每磁道扇区数 + 扇区号S - 1
  • 即:LBA = 柱⾯号C*(磁头数每磁道扇区数) + 磁头号H每磁道扇区数 + 扇区号S - 1
  • 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的
  • 柱⾯和磁道都是从0开始编号的
  • 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数。

LBA转成CHS:

  • 柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
  • 磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
  • 扇区号S = (LBA % 每磁道扇区数) + 1
  • "//": 表⽰除取整

二、引入文件系统

1、引入"块"概念

OS 文件系统访问磁盘,不以扇区为单位,而是以"块"为单位

其实硬盘是典型的"块"设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)。

硬盘的每个分区是被划分为⼀个个的"块"。⼀个"块"的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 "块"。"块"是⽂件存取的最⼩单位。

stat 任何一个文件,它的 IO Block 为 4KB

• 知道LBA:块号 = LBA/8

• 知道块号:LAB=块号*8 + n. (n是块内第⼏个扇区)

2、引⼊"分区"概念

其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的⼀种格式化。但是Linux的设备都是以⽂件形式存在,那是怎么分区的呢?

柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。 此时我们可以将硬盘上的柱⾯(分区)进⾏平铺,将其想象成⼀个⼤的平⾯,如下图所⽰:

在Linux中分区还是太大了,会继续分组

三、ext2 ⽂件系统

1、超级块 Super Block
2、GDT(Group Descriptor Table)
3、块位图(Block Bitmap)
4、inode位图(Inode Bitmap)
5、目录与文件名
c 复制代码
// readdir.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
#include <dirent.h> 
#include <sys/types.h> 
#include <unistd.h> 
 
int main(int argc, char *argv[]) { 
 if (argc != 2) { 
 fprintf(stderr, "Usage: %s <directory>\n", argv[0]); 
 exit(EXIT_FAILURE); 
 } 
 
 DIR *dir = opendir(argv[1]); // 系统调⽤,⾃⾏查阅 
 if (!dir) { 
 perror("opendir"); 
 exit(EXIT_FAILURE); 
 } 
 
 struct dirent *entry; 
 while ((entry = readdir(dir)) != NULL) { // 系统调⽤,⾃⾏查阅 
 // Skip the "." and ".." directory entries 
 if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { 
 continue; 
 } 
 
 printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino); 
} 

 closedir(dir); 
 return 0; 
}
6、路径解析



7、路径缓存


8、挂载分区


c 复制代码
$ dd if=/dev/zero of=./disk.img bs=1M count=5 #制作⼀个⼤的磁盘块,就当做⼀个分区 
$ mkfs.ext4 disk.img # 格式化写⼊⽂件系统 
$ mkdir /mnt/mydisk # 建⽴空⽬录 
$ df -h # 查看可以使⽤的分区 
$ sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 将分区挂载到指定的⽬录 
$ sudo umount /mnt/mydisk # 卸载分区 



9、inode和datablock映射(弱化)



四、软硬链接

1、软链接
c 复制代码
ln -s

软链接是一个独立的文件!因为他有独立的 inode number !

软链接起始就是Windows下的快捷方式!

c 复制代码
unlink //删除软链接
2、硬链接
c 复制代码
ln //硬链接

对文件进行备份

硬链接只能给普通文件进行建立,Linux系统不支持给目录建立硬链接!

容易形成路径环问题,不允许用户给目录建立硬链接

相关推荐
maosheng11463 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken4 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2914 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C4 小时前
CPU Cache
linux·cache
Hoshino.415 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源6 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry7 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu7 小时前
Linux安装redis
linux·运维·redis
寂柒8 小时前
序列化与反序列化
linux·网络
lay_liu9 小时前
ubuntu 安装 Redis
linux·redis·ubuntu