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 类型。

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

文件存储

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

  • 文件系统谁来管理:块存储是 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.