• fuse的mount机制-流程及参数


    在bbfs中,传递的参数有两个目录,fuse将一个目录挂载在另一个目录下。

    在ssfs中,传递的参数只有一个目录(传递两个目录fuse会出错)。

    问题:那么fuse的mount机制到底需要几个目录参数?为什么bbfs要使用两个目录参数?

    答:fuse的mount应该只需要一个目录参数,即挂载点。bbfs在调用fuse_main之前将第一个目录参数进行了处理,保存在一个的结构中,并将这个结构传递给fuse_main。而ssfs调用fuse_main时对应的参数置为NULL。

    fuse_main(argc, argv, &bb_oper, bb_data);

    fuse_main( argc, argv, &operations, NULL );

    问题:这个参数是如何被fuse处理的?

     答:fuse_main的四个参数首先在fuse.h中被扩展为5个参数 fuse_main_real(argc, argv, op, sizeof(*(op)), user_data)

    然后在fuse_main_real中被传递给fuse_main_common,变为6个参数,return fuse_main_common(argc, argv, op, op_size, user_data, 0);

    问题:能不能将/dev/sdx1挂在在某个目录下呢?

    使用 -f参数时,主程序会在前台运行,阻塞在fuse_main的调用这里,ctrl+c后就会返回,打印后面的语句。

    如果不使用-f参数,运行主程序后就会结束,但是fuse_main调用后面的打印语句并不会打印。

    问题:fuse_main的调用后面到底发生了什么?为什么不是用-f参数主程序看起来是跳过打印语句退出?

     需要进入fuse_main_common查看。在这里,如果不是用-f参数,主程序显示运行到fuse_setup_common之前,如果使用-f参数,主程序会运行到 fuse_setup_common 之后,且fuse=0x189e290, multithreaded=1,进入res = fuse_loop_mt(fuse); ctrl+c后运行fuse_teardown_common对挂载点进行了卸载。

    所以需要进入fuse_setup_common,以及fuse_loop_mt。这两个函数一个用户-f参数下的循环,另一个用于非-f参数下的循环。可以预料,-f参数在fuse_setup_common被处理。

    在fuse_setup_common中会进行mount操作,ch = fuse_mount_common(*mountpoint, &args); 然乎调用 fuse = fuse_new_common(ch, &args, op, op_size, user_data, compat); 这个函数在fuse.c中,现在终于从helper.c进入了fuse.c

    问题

    在bbfs中,传递的参数有两个目录,fuse将一个目录挂载在另一个目录下。

    在ssfs中,传递的参数只有一个目录(传递两个目录fuse会出错)。

    问题:那么fuse的mount是怎么处理参数的呢?

    问题:能不能将/dev/sdx1挂在在某个目录下呢?

    可以运行ssfs两次,挂载不同的目录,运行mount命令显示有两个ssfs。可以使用sudo umount ssfs卸载这个挂载,卸载的是最后一个。

    root@river:/home/leveldb/store# mount

    /dev/sdf1 on /home/leveldb/store/f1 type ext4 (rw)

    bbfs on /home/leveldb/fuse/bbfs/dir2 type fuse.bbfs (rw,nosuid,nodev,user=leveldb)
    ssfs on /home/leveldb/fuse/ssfs/mnt type fuse.ssfs (rw,nosuid,nodev,user=leveldb)
    ssfs on /home/leveldb/fuse/ssfs/dir1 type fuse.ssfs (rw,nosuid,nodev,user=leveldb)

    也可以打印/etc/mtab来查看mount列表

    root@river:/home/leveldb/store# cat /etc/mtab

    /dev/sdf1 /home/leveldb/store/f1 ext4 rw 0 0
    bbfs /home/leveldb/fuse/bbfs/dir2 fuse.bbfs rw,nosuid,nodev,user=leveldb 0 0
    ssfs /home/leveldb/fuse/ssfs/mnt fuse.ssfs rw,nosuid,nodev,user=leveldb 0 0
    ssfs /home/leveldb/fuse/ssfs/dir1 fuse.ssfs rw,nosuid,nodev,user=leveldb 0 0

    这与一般的挂载不一样,一般的挂载比如 mount /dev/sdc1 /mnt/c1ext4 后,/dev/sdc1出现在mount列表的entry中的第一个项,同上述列表中的ssfs。umount的参数可以是第一个项,也可以是第二个项,而fusermount -u 的参数只能是第二个项即挂载点。

    问题:fuse的mount的怎么写入mount列表的?

  • 相关阅读:
    Debian apt-get 无法补全
    Python 字典排序
    Python 替换字符串
    Debian 7 64位安装 wine
    Python Virtualenv 虚拟环境
    ASP.NET MVC ModelState
    Oracle存储过程写法
    利用ODBC从SQLServer向Oracle中导数据
    web自定义控件UserControl
    工作笔记
  • 原文地址:https://www.cnblogs.com/bettersky/p/6739667.html
Copyright © 2020-2023  润新知