1. 什么是文件系统
文件系统顾名思义就是管理文件的系统。使用windows格式化U盘的时候需要选择文件系统,比如NTFS、FAT32等。经常使用linux的也知道Ext4、XFS等文件系统。
维基百科的描述:文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(或者称为簇),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。
2. FUSE文件系统
如果从内核开始动手实现一个文件系统是比较困难的,好在有高人实现了一个用户空间文件系统(Filesystem in Userspace,简称FUSE)。我们可以站在高人的肩膀上实现自己的一个文件系统。
假如我们实现了一个基于FUSE的文件系统叫做myfs,通过运行可执行程序myfs挂载到/mnt/fuse文件夹下,下图为FUSE的调用流程:
3. 实现一个简单的文件系统
FUSE提供了两组接口:fuse_operations和fuse_lowlevel_ops,实现任何一种都可以实现一个用户空间的文件系统。fuse_lowlevel_ops对于VFS了解比较少的人来说实现起来难度比较大,fuse_operations相对简单。
下面我们就在fuse_operations基础上创建一个自己的文件系统。使用FUSE之前需要安装fuse-devel安装包。
#include <fuse.h>
#include <stdio.h>
void *myfs_init(struct fuse_conn_info *conn)
{
printf("Init my file system.\n");
return NULL;
}
int main(int argc, char **argv)
{
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
struct fuse_operations myfs_oper = {
.init = myfs_init,
};
fuse_main(args.argc, args.argv, &myfs_oper, NULL);
return 1;
}
编译一下:gcc -o myfs myfs.c -lfuse -D_FILE_OFFSET_BITS=64
挂载:./myfs /mnt/fuse
通过mount命令查看挂载情况:/opt/testfuse/myfs/myfs on /mnt/fuse type fuse.myfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
卸载:umount /mnt/fuse
至此我们实现一个可以挂载的文件系统,但是这个文件系统只能挂载/卸载!