FUSE 文件系统

FUSE (Filesystem in USErspace),是一个用户空间的文件系统。通过 FUSE 内核模块的支持,开发者只需要根据 FUSE 提供的接口实现具体的文件操作就可以实现一个文件系统。可以用来实现云盘

也被抽象成为了 VFS 下面的一个实际的文件系统:

  • 客户端:要进行文件操作的应用(在下图中以黄色标出)
  • 服务端:FUSE 的 daemon(在下图中以绿色标出)

为什么需要 /dev/fuse 文件?

这个文件不是让需要文件操作的 App 来进行操作的,而是让服务端也就是 FUSE 的 daemon 进程来操作的。

  • 用户态 FUSE 守护进程(比如 sshfs、s3fs)执行 open("/dev/fuse", O_RDWR),获得一个文件描述符 fd。
  • 正如普通的 mount 命令是 mount 一个已经搭载的文件系统的分区(一般就是一个 /dev 设备)到一个指定目录(挂载点):sudo mount -t ext4 /dev/sdb1 /mnt/data。FUSE daemon 也会执行一个 mount 来把 /dev/fuse 挂载到一个指定的挂载点上,比如 /mnt/fuse,这样的话内核里的 FUSE 文件系统代码就知道:“如果有人要访问 /mnt/fuse 下的文件,请不要去读磁盘,而是把请求打包成 FUSE 协议,塞进 fd=3 对应的发送队列,然后唤醒正在那个 fd 上睡觉的守护进程。”
  • App 访问 /mnt/fuse 下的文件,从而唤醒守护进程,内核会做一些数据的封装,做成请求头的方式告诉 fd,这样 FUSE Daemon 只要一直读取 fd 就能知道 App 想要访问哪些内容并做对应的处理。

FUSE 文件系统在 df -hT 的输出中长什么样子?

可以看到 Type 是 FUSE 类型。

NBD (Network Block Device)

在客户端呈现一个虚假的设备文件比如 /dev/nbdX,可以进行 mount 成文件系统啥的操作。因此从使用上来说,和云盘比如火山引擎实现的块存储什么的很像,属于是同一个赛道的。

另外在技术实现上,又和 FUSE^ 其实有点像。都是 Client/Server 架构,都是转发到用户态实现的后端设备上。区别在于 FUSE 截获的是对于文件系统的访问,而 NBD 的劫持更晚一些,在本地的 ext4 或者其他文件系统已经处理完了之后,截获到后端设备的一些请求。

NBD 可以用来实现玩具级的云盘,但是工业级的云盘需要使用 NVMe-oF 和 SPDK 来一起实现。

块存储 / 文件存储 / 对象存储 / 云盘

文件存储

块存储和文件存储容易混淆,主要的区别在于:

  • 文件系统谁来管理:块存储是 Guest OS 负责管理文件系统、文件存储是 NFS 负责管理文件系统。
  • 共享能力:块存储一般不能直接共享(多台机器同时访问),因为 Kernel 里的 FS 子系统已经使用了这个块设备,很难再共享给其他主机。但是,文件存储可以通过多客户端同时共享,只要在服务端处理好对于同一个文件的多个请求之间的干扰就好了。因为后端可能是一个存储集群,所以有可能叫做分布式文件存储,对于不同的文件的请求可能会路由到多个不同的机器上。
  • 块存储延迟更低:走的网络一样,但是块存储直接对磁盘偏移进行写入和读取,只有一次操作,没有多余操作;文件存储的问题在于对于一个路径,我们需要多次访问才行。

我们的客户端 OS 使用哪一种协议和文件存储的后端进行沟通?

客户端 OS 和文件存储后端都是通过 NFS 进行沟通的,OS 内核 -> VFS -> NFS 文件系统(相比较于 ext4, fat 等等其他文件系统来说的话)。

除了 NFS,还有 FUSE 框架,也就是在用户态运行的文件系统框架。FUSE 和 NFS 这两者的区别在网上随便一搜就能看到很多。更多的可以看 FUSE^。

文件存储和对象存储容易混淆,主要的区别在于:

  • 文件存储可以是基于对象存储之上来构建,因为对象存储本质上就是一个一个的对象,没有层级关系,但是文件存储可以通过命名来让前端展示的方式来展示这种层级关系。比如 JuiceFS,可以在多台机器之前共享是一个分布式文件存储服务,但是其实根据官方说法,本身是基于对象存储实现的。

云盘是产品名称,可以是块存储,也可以是文件存储。

SPDK

HDD 时代速度瓶颈在于硬件而不是软件,有了 NVMe 之后,硬件能力提升,因此软件逐渐成为瓶颈。

SPDK 是 Intel 开发的。

SPDK 和 DPDK 的后缀 PDK 不是一个意思:

  • Data Plane Development Kit
  • Storage Performance Development Kit

不过和 DPDK 一样,也是把处理放到用户态上(一个用户态的存储驱动)。思想:

  • Moving all of the necessary drivers into userspace, which avoids syscalls and enables zero-copy access from the application.

NVMe over fabrics (NVMe-oF)

注意 NVMe-oF 和 FUSE 的区别,两者并没有交集,一个注重灵活性,一个注重性能

An extension of the NVMe network protocol to Ethernet.

Compared to NVMe over PCIe.

NVMe-oF 定义规范与角色:NVMe-oF 定义了两种角色:

  • Target (目标端,也就是服务端,SPDK 主要工作在这里):负责将本地或虚拟的块设备通过网络暴露出去,供客户端访问。
  • Host (主机/ Initiator,也就是客户端):负责访问远端 Target 提供的设备。

G3.5 Storage Layer

  1. 面向推理,而非训练。
  2. 一个 Pod 内的机器之间共享存储,而不是集群级别的共享存储。
  3. 用户看到的是一个 Key Value 存储的 API,而不是一个共享文件系统或者块设备的什么东西。