Fuse挂载指定目录到挂载点

Fuse挂载指定目录到挂载点

安装好fuse3.2.1(FileSystem in Userspace)以后,自己编译运行了它的hello.c 以及passthrough.c两个example,也阅读源代码,为这两个源代码添加了足够的注释。fuse文件系统,需要用户自定义它的给出的函数,并注册已经实现的函数(.init,.getattr,.readdir,.open 等),最后在main函数中调用 fuse_main() 。以后当用户对挂载好的文件系统执行相应操作时,fuse内核会根据用户的操作,自动调用相应的函数(调用的函数:.init,.getattr,.readdir,.open 等,比如cat file 命令调用open、read接口,ls -al命令调用readdir、getattr接口)。

但一直困扰自己的是,代码中没有出现任何关于被挂载目录的信息,怎么hello.c 就是挂载的一个只有名为hello文件的文件系统,而 passthrough.c 却是将自己整个计算机文件系统挂载起来了?如果我想挂载/home/ubuntu/下载 的文件内容呢?

运行编译好的文件时,没有向其传递参数 ?###

自己观察了两个源代码文件 ,发现在调用fuse_main() 函数时,都会向其传递int main(int argc, char *argv[]) 的两个参数:argc、argv 。所以自己认为是在使用如下命令挂载文件系统时,没有向其传递被挂载目录的信息。

$ ./passtrough /home/ubuntu/fuse

所以尝试使用如下两种命令,实现对指定目录的挂载:

$ ./passtrough /home/ubuntu/下载 /home/ubuntu/fuse 

$ ./passtrough /home/ubuntu/fuse /home/ubuntu/下载

提示参数参数无效,而且都是最后一个参数无效,说明挂载时,很可能只接受一个参数。图片中间部分是argv所获取的参数,通过添加代码打印出来了。
Fuse挂载指定目录到挂载点_第1张图片
并在fuse3.2.1/lib/common.c 源代码中得到了印证:

if (opts.show_help) {
		if(args.argv[0][0] != '\0')
			printf("usage: %s [options] \n\n",
			       args.argv[0]);
			...
		}

使用option,尝试实现挂载指定目录到挂载点###

后来查询有关fuse的网页,发现在挂载文件系统时,fuse 虚拟文件系统 的 安装与使用 这一博客使用了option。自己尝试使用如下命令,查看mount有关所有option:

$ ./passthrough -h

得到如下帮助信息:
Fuse挂载指定目录到挂载点_第2张图片
查看完所有option后,觉得-o subdir=DIR 这个option可能就是自己想找的。尝试使用它:

$ ./passthrough -o subdir=/home/ubuntu/下载 /home/ubuntu/fuse

系统报错:

fuse: unknown option(s): `-o subdir=/home/lxf/下载'

查阅到关键资料,完成 挂载指定目录到挂载点##

后来查阅到FUSE(Filesystem in userspace)(用户空间文件系统),user-space框架简单介绍 的博客,里面有如下内容:

若想挂载指定目录,则使用命令 ./fuxexmp -o modules=subdir,subdir=/home/otheruser/

于是使用如下命令:

./passthrough -o modules=subdir,subdir=/home/ubuntu/下载 /home/ubuntu/fuse

发现成功挂载!
Fuse挂载指定目录到挂载点_第3张图片

Fuse挂载指定目录到挂载点_第4张图片

你可能感兴趣的:(ceph,文件系统,SDS项目)