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所获取的参数,通过添加代码打印出来了。
并在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
得到如下帮助信息:
查看完所有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
发现成功挂载!