Linux

Linux存储基本认识

Linux 文件系统

文件系统

文件系统,就是操作系统对存储设备上的文件 进行管理和管理的机制;组织方式不同,就会形成不同的文件系统。常见的如:ext4 xfs zfs等。

不同的文件系统有不同的系统标准和接口,但开发者在开发应用时却很少关心系统调用一下的具体实现,只需要通过库函数 open read write close等方法来做对应的程序实现,不用去关注标准和接口,存储是什么介质等等。

之所以如此容易,是因为kernel为我们做了大量的有技术含量的脏活累活,也就是VFS,目的就是统一文件接口和标准,可以方便的让开发者使用相同的系统调用不同的文件系统。

VFS如何工作

Linux设计了两种数据结构来管理不同种类的文件

Inode:(index node )索引节点

dentry:(directory entry)目录项

inode和dentry

inode是用来记录文件的metadata,所谓metadata及时 data of data ,其实就是指文件的各种属性:inode编号 文件大小 访问权限 修改日期 数据位置 and so on

stat file

dentry用来记录文件的名字 inode指针以及其他相关信息

文件的名字:像dir file hardlink file_in_dir这些名字是记录在dentry里面的

inode指针:就是指向这个文件的inode

与其他dentry的关系:就是每个文件的层级关系,哪个文件夹有哪个文件,构成了文件系统的目录结构,不同于inode,dentry是由kernel维护的内存数据结构,所以通常也叫做dentry cache。

有点像是你这个文件所处在文件系统中的位置关系

文件如何存在磁盘上

Block

首先,磁盘在进行文件系统格式化的时候会初始化4个分区:

  1. Superblock
  2. inode blocks
  3. data blocks
  4. boot block(包含一些bootstrap code 在机器启动时读取,这里忽略)

其中inode blocks放的都是每个文件的inode,data blocks放的是每个文件的内容数据。而superblock包含整个文件系统的metadata,具体有:

  • inode block 和data block 总量,使用量,剩余量
  • 文件系统的格式,属主等各种属性

Superblock 对于文件系统是非常重要的,如果superblock损坏,文件系统将无法挂载,相应的文件也就无法读写。

既然superblock非常重要,那就不能只存一分,坏了就没了,因此superblock在文件系统中是有很多副本的,在superblock损坏的时候可以用fsck工具进行恢复。

回到上图,从左向右可以清楚地观察到文件的各种属性和文件的数据是如何存放在磁盘上的:

  1. dentry包含了文件的名字,inode指针,目录层级关系
  2. inode指针指向特定文件的inode(inode blocks中)
  3. 每个inode有志向data blocks 里面的logical block,logical block存放的就是文件具体的数据

logical block

什么是logical block?

对于不同的存储介质,都有最小的存储单元

cat /sys/block/vda/queue/physical_block_size

HDD叫做sector(扇区),SSD叫做page(页)

对于HDD来说,每个sector的大小是512个bytes

对于SSD来说每个page大小是不固定的 ,经典的大小是4KB,也是我们常说的固态硬盘格式化的时候要做4k对齐

但是Linux觉得按照存储介质的最小单元来读写会存在效率问题,所以支持在文件系统格式化的时候指定block size的大小,一般是将几个physical_block拼起来组成一个logical_block

cat /sys/block/sda/queue/logical_block_size

理论上讲logical_block_size >= physical_block_size,但有时候我们会看到physical_block_size = 4k logical_block_size = 512B的情况,这是因为磁盘上做了一层512B的仿真。

Linux 对磁盘的管理

在linux中 磁盘是作为块设备来管理的,也就是以块作为单位来读写,并且支持随机读写。

每个块设备都会被赋予两个设备号,分别是主 、次设备号。主设备号用在驱动程序中,用来区分设备类型;次设备号则是用来给多个同类设备编号

8表示他是一个sd类型的设备块

次设备号0~10表示这些不同sd设备块的编号

通用块层

和 VFS 类似,为了对上层屏蔽不同块设备的差异,内核在文件系统和块设备之前抽象了一个 Generic Block Layer(通用块层),有时候一些人也会把下面的 I/O 调度层并到通用块层里表述。

这两层主要做两件事:

  1. 跟 VFS 的功能类似。向上,为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来管理这些设备的驱动程序
  2. 对 I/O 请求进行调度,通过重新排序、合并等方式,提高磁盘读写效率

全景图

回复

This is just a placeholder img.