欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fuse挂载指定目录到挂载点

程序员文章站 2024-02-29 20:33:22
...

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挂载指定目录到挂载点
并在fuse3.2.1/lib/common.c 源代码中得到了印证:

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

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

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

$ ./passthrough -h

得到如下帮助信息:
Fuse挂载指定目录到挂载点
查看完所有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挂载指定目录到挂载点

Fuse挂载指定目录到挂载点