如何使用mount(8)和fstab注册FUSE文件系统类型?

drd*_*man 33 linux filesystems mount gnu fuse

我已经编写了一个基于FUSE的小文件系统,现在唯一缺少的是我想用fstab(5)注册它以在系统启动时自动挂载它和/或用它手动挂载它mount /srv/virtual-db.我怎样才能做到这一点?

我知道,我可以/usr/bin/vdbfs.py /srv/virtual-db从一些初始化脚本运行,但这并不完美.

我很抱歉,因为这可能不是一个编程问题,但它是高度相关的,因为打包和部署仍然是程序员的工作.

eph*_*ent 33

通常,通过创建可执行文件,"注册"新的安装文件系统类型mount.fstype.

$ ln -s /usr/bin/vdbfs.py /usr/sbin/mount.vdbfs

如果vdbfs.py采用mount-ish参数(即dev path [-o opts]),则mount -t vdbfs使用vdbfs第3个字段fstab将起作用.如果没有,您可以创建一个包装器,它接受该表单的参数并将它们映射到您vdbfs.py需要的任何内容.

FUSE还应安装mount.fuse可执行文件; mount.fuse 'vdbfs.py#dev' path -o opts会继续打电话vdbfs.py dev path -o opts.在这种情况下,您可以使用fuse您的文件系统类型并为您的设备添加前缀vdbfs.py#.

  • 请注意,FUSE 的作者 – *Miklos Szeredi* – [已弃用](https://lwn.net/Articles/221779/) 对挂载源中的真实文件系统类型进行编码。引用自 [`mount`](https://linux.die.net/man/8/mount) 手册: *程序 mount 和 umount 支持文件系统子类型。子类型由“.subtype”后缀定义。例如'fuse.sshfs'。建议使用子类型符号而不是向挂载源添加任何前缀(**例如 'sshfs#example.com' 已弃用**)。* (5认同)

ejm*_*ejm 20

因此,为了澄清ephemient的答案,有两种选择:

  1. 编辑/etc/fstab如下:

    # <file system>   <mount point>      <type>  <options>         <dump>  <pass>
    # ...
    vdbfs.py#<dev>    /srv/virtual-db    fuse    user,<other-opts>    0    0
    
    Run Code Online (Sandbox Code Playgroud)

    要么,

  2. 创建一个前缀为"mount"的可执行文件.(确保它可以与mount类似的选项一起使用):

    $ ln -s /usr/bin/vdbfs.py /usr/sbin/mount.vdbfs
    
    Run Code Online (Sandbox Code Playgroud)

    并编辑/etc/fstab如下:

    # <file system> <mount point> <type>    <options>         <dump>  <pass>
    # ...
    <dev>    /srv/virtual-db    vdbfs.py    user,<other-opts>    0    0
    
    Run Code Online (Sandbox Code Playgroud)

关于启动时的自动安装和手动安装mount,这些usernoauto选项是相关的,并由保险丝本身完全支持,因此您不必自己实施.该user选项允许作为"fuse"组成员的非priveleged用户使用该mount命令装入您的文件系统,并noauto指示您的文件系统不会在启动时自动挂载.如果未指定noauto,则会自动挂载.


Gus*_*uss 6

为了澄清 @patryk.beza 对已接受答案的评论,挂载 FUSE 文件系统的正确方法是将文件系统类型设置为fuse.<subtype>.

例如,要挂载s3fs-fuse实现(它不提供特定/sbin/mount.*包装器并通常使用s3fs用户命令来挂载 S3 存储桶),可以​​以 root 身份使用此命令:

mount -t fuse.s3fs bucket-name /path/to/dir -o <some,options>
Run Code Online (Sandbox Code Playgroud)

或以下行/etc/fstab

bucket-name /path/to/dir fuse.s3fs <some,options> 0 0
Run Code Online (Sandbox Code Playgroud)

或此 SystemD 安装单元(例如/etc/systemd/system/path-to-dir.mount):

[Unit]
Description=S3 Storage
After=network.target

[Mount]
What=bucket-name
Where=/path/to/dir
Type=fuse.s3fs
Options=<some,options>

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

工作原理:mount当类型使用句点(即 )进行格式化时,识别“文件系统子类型”的概念<type>.<subtype>,以便将具有该格式的类型fuse.someimpl识别为 FUSE 安装助手的职责/sbin/mount.fuse。然后,FUSE 安装帮助程序将该someimpl部分解析为 FUSE 实现,其方式与原始答案中使用的格式相同#(我认为这只是名为 的程序的路径搜索<subtype>,但我对此不是 100% 确定) )。