rclone nfsmount
将远程文件系统挂载到挂载点上。
概要
rclone nfsmount
允许 Linux、FreeBSD、macOS 和 Windows 通过 FUSE 将 Rclone 支持的任何云存储系统挂载为文件系统。
首先,使用 rclone config
设置你的远程存储。使用 rclone ls
等命令检查其是否正常工作。
在 Linux 和 macOS 上,你可以以前台或后台(即守护进程)模式运行挂载操作。挂载操作默认以前台模式运行。使用 --daemon
标志可强制以后台模式运行。在 Windows 上,只能以前台模式运行挂载操作,此标志将被忽略。
在后台模式下,rclone 充当通用的 Unix 挂载程序:主程序启动,派生一个后台 rclone 进程来设置和维护挂载,等待挂载成功或超时,然后以适当的代码退出(如果失败则终止子进程)。
在 Linux、macOS 或 FreeBSD 上,像这样启动挂载操作,其中 /path/to/local/mount
是一个空的、已存在的目录:
rclone nfsmount remote:path/to/files /path/to/local/mount
在 Windows 上,你可以通过不同的方式启动挂载操作。有关详细信息,请参阅下面的内容。如果在控制台窗口中交互式地以前台模式挂载,rclone 将提供挂载服务并占用该控制台,因此在 rclone 被中断(例如按下 Ctrl - C)之前,应该使用另一个窗口来操作挂载的文件系统。
以下示例将分别挂载到自动分配的驱动器、特定的驱动器号 X:
、路径 C:\path\parent\mount
(父目录或驱动器必须存在,且挂载点不能存在,并且在以网络驱动器模式挂载时不支持此方式),最后一个示例将作为网络共享 \\cloud\remote
挂载并映射到自动分配的驱动器:
rclone nfsmount remote:path/to/files *
rclone nfsmount remote:path/to/files X:
rclone nfsmount remote:path/to/files C:\path\parent\mount
rclone nfsmount remote:path/to/files \\cloud\remote
当前台模式下的程序通过 Ctrl - C 或接收到 SIGINT 或 SIGTERM 信号结束时,挂载操作应该会自动停止。
在后台模式下运行时,用户必须手动停止挂载操作:
# Linux
fusermount -u /path/to/local/mount
# ... 或者在某些系统上
fusermount3 -u /path/to/local/mount
# 使用 nfsmount 时的 OS X 或 Linux
umount /path/to/local/mount
卸载操作可能会失败,例如当挂载点正被使用时。出现这种情况时,用户有责任手动停止挂载操作。
挂载的文件系统的大小将根据从远程存储获取的信息进行设置,与 rclone about 命令返回的信息相同。具有无限存储空间的远程存储可能只报告已使用的大小,此时将假设还有额外的 1 PiB 可用空间。如果远程存储根本不支持 about
功能,则将总大小和可用大小都设置为 1 PiB。
在 Windows 上安装
要在 Windows 上运行 rclone nfsmount
,你需要下载并安装 WinFsp。
WinFsp 是一个开源的 Windows 文件系统代理,它使得为 Windows 编写用户空间文件系统变得容易。它提供了一个 FUSE 模拟层,rclone 结合 cgofuse 使用该层。这两个软件包均由 Bill Zissimopoulos 开发,他在为 Windows 实现 rclone nfsmount
时提供了很大的帮助。
Windows 上的挂载模式
与其他操作系统不同,Microsoft Windows 为网络驱动器和固定驱动器提供了不同的文件系统类型。它基于固定磁盘驱动器快速可靠、而网络驱动器具有相对较高的延迟和较低的可靠性这一假设来优化访问。某些设置也可以在这两种类型之间进行区分,例如 Windows 资源管理器应该仅显示图标,而不应该为网络驱动器上的图像和视频文件创建预览缩略图。
在大多数情况下,rclone 默认会将远程存储挂载为普通的固定磁盘驱动器。但是,你也可以选择将其挂载为远程网络驱动器,通常称为网络共享。如果你使用默认的固定驱动器模式挂载 rclone 远程存储并遇到意外的程序错误、冻结或其他问题,可以考虑改为以网络驱动器模式挂载。
当以固定磁盘驱动器模式挂载时,你可以将其挂载到未使用的驱动器号,或者挂载到一个不存在的子目录,该子目录的父目录或驱动器必须存在。使用特殊值 *
会告诉 rclone 从 Z: 开始向后自动分配下一个可用的驱动器号。示例如下:
rclone nfsmount remote:path/to/files *
rclone nfsmount remote:path/to/files X:
rclone nfsmount remote:path/to/files C:\path\parent\mount
rclone nfsmount remote:path/to/files X:
可以使用 --volname
选项为挂载的文件系统设置自定义卷名。默认情况下,将使用远程存储的名称和路径。
要以网络驱动器模式挂载,你可以在 nfsmount
命令中添加 --network-mode
选项。在此模式下,不支持挂载到目录路径,这是 Windows 对连接点施加的限制,因此远程存储必须始终挂载到驱动器号。
rclone nfsmount remote:path/to/files X: --network-mode
使用 --volname
指定的卷名将用于创建网络共享路径。完整的 UNC 路径,例如 \\cloud\remote
,可以选择带有路径 \\cloud\remote\madeup\path
,将按原样使用。任何其他字符串将在默认前缀 \\server\
之后用作共享部分。如果未指定卷名,则将使用 \\server\share
。当你挂载多个驱动器时,必须确保卷名是唯一的,否则挂载命令将失败。共享名将被视为映射驱动器的卷标,显示在 Windows 资源管理器等中,而完整的 \\server\share
将由 net use
等命令报告为远程 UNC 路径,就像普通的网络驱动器映射一样。
如果你使用 --volname
指定完整的网络共享 UNC 路径,这将隐式设置 --network-mode
选项,因此以下两个示例具有相同的结果:
rclone nfsmount remote:path/to/files X: --network-mode
rclone nfsmount remote:path/to/files X: --volname \\server\share
你也可以将网络共享 UNC 路径指定为挂载点本身。然后 rclone 将自动分配一个驱动器号,就像使用 *
一样,并将其用作挂载点,而将指定的 UNC 路径用作卷名,就好像是使用 --volname
选项指定的一样。这也将隐式设置 --network-mode
选项。这意味着以下两个示例具有相同的结果:
rclone nfsmount remote:path/to/files \\cloud\remote
rclone nfsmount remote:path/to/files * --volname \\cloud\remote
还有另一种启用网络模式并设置共享路径的方法,即直接传递“原生”的 libfuse/WinFsp 选项:--fuse-flag --VolumePrefix=\server\share
。请注意,在这种情况下,路径必须仅使用单个反斜杠作为前缀。
注意:在 rclone 的早期版本中,这是唯一支持的方法。
另请参阅下面的限制部分。
Windows 文件系统权限
Windows 上的 FUSE 模拟层必须在 FUSE 中使用的基于 POSIX 的权限模型和 Windows 中使用的基于访问控制列表 (ACL) 的权限模型之间进行转换。
挂载的文件系统通常会在其访问控制列表 (ACL) 中获得三个条目,分别代表 POSIX 权限范围:所有者、组和其他用户的权限。默认情况下,所有者和组将取自当前用户,而内置组“Everyone”将用于代表其他用户。可以使用 FUSE 选项“UserName”和“GroupName”自定义用户/组,例如 -o UserName=user123 -o GroupName="Authenticated Users"
。每个条目的权限将根据选项 --dir-perms
和 --file-perms
进行设置,这些选项采用传统 Unix 数字表示法的值。
默认权限对应于 --file-perms 0666 --dir-perms 0777
,即每个人都有读写权限。这意味着你将无法从挂载点启动任何程序。要能够这样做,你必须添加执行权限,例如 --file-perms 0777 --dir-perms 0777
以将其添加给每个人。如果程序需要写入文件,很可能你还必须启用 VFS 文件缓存(另请参阅限制)。请注意,默认的写入权限对除所有者之外的账户有一些限制,具体来说,它缺少“写入扩展属性”权限,如下文所述。
权限的映射并不总是简单的,你在 Windows 资源管理器中看到的结果可能与你预期的不完全一样。例如,当设置包含组或其他用户范围的写入访问权限的值时,这将被映射为单个权限“写入属性”、“写入数据”和“追加数据”,但不包括“写入扩展属性”。然后 Windows 将显示为基本权限“特殊”而不是“写入”,因为“写入”还包括“写入扩展属性”权限。当为组或其他用户设置数字 0 以表示没有权限时,他们仍然会获得单个权限“读取属性”、“读取扩展属性”和“读取权限”。这样做是出于兼容性考虑,例如允许没有额外权限的用户能够像在 Unix 中一样读取文件的基本元数据。
WinFsp 2021(版本 1.9)引入了一个新的 FUSE 选项“FileSecurity”,它允许使用 SDDL 完整指定文件安全描述符。使用此选项,与上述使用 POSIX 权限相比,你可以更详细地控制最终的权限,并且不会为了与 Unix 兼容而自动添加额外的权限。以下是一些示例用例。
如果你仅设置允许所有者访问的 POSIX 权限,使用 --file-perms 0600 --dir-perms 0700
,用户组和内置的“Everyone”组仍然会被授予一些特殊权限,如上所述。某些程序可能会(错误地)将此解释为文件对所有人都可访问,例如 SSH 客户端可能会警告“未受保护的私钥文件”。你可以通过指定 -o FileSecurity="D:P(A;;FA;;;OW)"
来解决这个问题,该选项将文件的所有访问权限 (FA) 设置给所有者 (OW),而不授予其他权限。
如前所述,在设置写入权限时,除所有者外,这不包括“写入扩展属性”权限。这可能会阻止应用程序写入文件,从而给出权限被拒绝的错误。要为内置的“Everyone”组设置有效的写入权限,类似于默认情况下它获得的权限,但增加“写入扩展属性”权限,你可以指定 -o FileSecurity="D:P(A;;FRFW;;;WD)"
,该选项将文件读取 (FR) 和文件写入 (FW) 权限授予所有人 (WD)。如果还需要文件执行 (FX) 权限,则将其更改为 -o FileSecurity="D:P(A;;FRFWFX;;;WD)"
,或者设置文件所有访问权限 (FA) 以获得包括删除在内的完整访问权限,即 -o FileSecurity="D:P(A;;FA;;;WD)"
。
Windows 注意事项
以管理员身份创建的驱动器对其他账户不可见,即使是通过用户账户控制 (UAC) 功能提升为管理员的账户也不行。这意味着如果你从以管理员身份运行的命令提示符将其挂载到驱动器号,然后尝试从 Windows 资源管理器(不以管理员身份运行)访问同一驱动器,你将无法看到挂载的驱动器。
如果你不需要从具有管理员权限的应用程序访问驱动器,最简单的解决方法是始终从不提升权限的命令提示符创建挂载。
为了使映射的驱动器对创建它们的用户账户可用,无论是否提升权限,有一个名为链接连接的特殊 Windows 设置可以启用。
也可以通过以内置的 SYSTEM 账户运行创建驱动器挂载的进程,使驱动器挂载对系统上的所有人可用。有几种方法可以做到这一点:一种是使用命令行实用程序 PsExec,它是 Microsoft 的 Sysinternals 套件的一部分,具有 -s
选项,可以以 SYSTEM 账户启动进程。另一种方法是从 Windows 计划任务或 Windows 服务运行挂载命令,并将其配置为以 SYSTEM 账户运行。第三种方法是使用 WinFsp.Launcher 基础设施。在安装文档中了解更多信息。请注意,当以其他用户身份运行 rclone 时,除非你使用 --config
选项指定,否则它不会使用你个人资料中的配置文件。另请注意,现在 SYSTEM 账户将拥有所有者权限,其他账户将根据组或其他范围拥有权限。如上所述,这些账户将不会获得“写入扩展属性”权限,这可能会阻止写入文件。你可以使用 FileSecurity 选项解决这个问题,见上面的示例。
请注意,映射到目录路径而不是驱动器号不会受到同样的限制。
在 macOS 上挂载
在 macOS 上可以通过 内置的 NFS 服务器、macFUSE(也称为 osxfuse)或 [FUSE - T](https://www.fuse - t.org/) 进行挂载。macFUSE 是一个传统的 FUSE 驱动程序,利用 macOS 内核扩展 (kext)。FUSE - T 是一个替代的 FUSE 系统,它通过 NFSv4 本地服务器进行“挂载”。
Unicode 规范化
强烈建议在 macOS 上的所有 mount
和 serve
命令中保持 --no - unicode - normalization=false
的默认设置。有关详细信息,请参阅 [vfs - case - sensitivity](https://rclone.org/commands/rclone_mount/#vfs - case - sensitivity)。
NFS 挂载
此方法使用 serve nfs 命令启动一个 NFS 服务器,并将其挂载到指定的挂载点。如果你使用 |--daemon|
以后台模式运行此命令,你需要使用 |kill|
命令向 rclone 进程发送 SIGTERM 信号以停止挂载。
请注意,--nfs - cache - handle - limit
控制 nfsmount
缓存处理程序存储的最大缓存文件句柄数。此值不应设置得太低,否则在尝试访问文件时可能会遇到错误。默认值为 1000000,但如果服务器的系统资源使用导致问题,可以考虑降低此限制。
macFUSE 注意事项
如果使用网站上的 dmg 包 安装 macFUSE,rclone 将无需进一步干预即可找到 macFUSE 库。但是,如果使用 macports 包管理器安装 macFUSE,则需要执行以下额外步骤。
sudo mkdir /usr/local/lib
cd /usr/local/lib
sudo ln -s /opt/local/lib/libfuse.2.dylib
FUSE - T 限制、注意事项和说明
关于其工作方式有一些限制、注意事项和说明。截至 FUSE - T 版本 1.0.14,这些信息是最新的。
读取时更新 ModTime
根据 [FUSE - T 维基](https://github.com/macos - fuse - t/fuse - t/wiki#caveats):
文件访问和修改时间似乎无法单独设置,因为这似乎是 NFS 客户端的一个问题,它总是同时修改两者。可以使用 ’touch - m’ 和 ’touch - a’ 命令重现此问题
这意味着使用各种工具(特别是 macOS Finder)查看文件时,会导致 rclone 更新文件的修改时间。这可能会使 rclone 上传一个全新的文件副本。
只读挂载
当使用 --read - only
进行挂载时,尝试写入文件将静默失败,而不像在 macFUSE 中那样给出明确的警告。
限制
如果不使用 --vfs - cache - mode
,则只能按顺序写入文件,只能在读取时进行查找。这意味着许多应用程序在没有 --vfs - cache - mode writes
或 --vfs - cache - mode full
的情况下,无法在 rclone 挂载的文件系统上正常工作。有关更多信息,请参阅 [VFS 文件缓存](#vfs - file - caching) 部分。在 macOS 上使用 NFS 挂载时,如果不指定 |--vfs - cache - mode|
,挂载点将为只读。
基于存储桶的远程存储(例如 Swift、S3、Google Compute Storage、B2)不支持空目录的概念,因此空目录一旦从目录缓存中消失,就会有消失的趋势。
当在 Unix 上使用 --daemon
标志调用 rclone mount
时,主 rclone 程序将等待后台挂载准备就绪,或者直到 --daemon - wait
标志指定的超时时间。在 Linux 上,它可以使用 ProcFS 检查挂载状态,因此该标志实际上设置的是最大等待时间,而实际等待时间可能更短。在 macOS / BSD 上,等待时间是固定的,并且仅在最后进行检查。我们建议你在 macOS 上合理设置等待时间。
目前仅支持 Linux、FreeBSD、OS X 和 Windows。
rclone nfsmount 与 rclone sync/copy 的比较
文件系统期望操作具有 100% 的可靠性,而云存储系统远未达到 100% 的可靠性。rclone sync/copy 命令通过大量重试来应对这个问题。然而,rclone nfsmount 如果不进行本地上传副本的操作,就无法以相同的方式使用重试机制。请查看 [VFS 文件缓存](#vfs - file - caching) 部分以获取使 nfsmount 更可靠的解决方案。
属性缓存
你可以使用 --attr - timeout
标志来设置内核缓存目录条目的属性(大小、修改时间等)的时间。
默认值为 1s
,这样可以缓存文件足够长的时间,以避免内核向 rclone 发出过多的回调。
理论上,对于可以在核控制之外更改的文件系统,0s 应该是正确的值。然而,这会导致一些问题,例如 rclone 使用过多内存、[rclone 无法向 samba 提供文件](https://forum.rclone.org/t/rclone - 1 - 39 - vs - 1 - 40 - mount - issue/5112) 以及 [列出目录的时间过长](https://github.com/rclone/rclone/issues/2095#issuecomment - 371141147)。
内核可以根据 --attr - timeout
指定的时间缓存文件的信息。如果远程文件在这个时间窗口内更改了长度,你可能会看到数据损坏。这可能表现为文件被截断或文件末尾有乱码。使用 --attr - timeout 1s
时,这种情况非常不可能发生,但并非完全不可能。--attr - timeout
设置得越高,发生这种情况的可能性就越大。默认设置“1s”是缓解上述问题的最低设置。
如果你将其设置得更高(例如 10s
或 1m
),内核将减少对 rclone 的回调,从而提高效率,但上述数据损坏问题的可能性会增加。
如果文件在 rclone 的控制之外不会在远程存储上发生更改,那么就不会有数据损坏的风险。
这与在 mount.fuse 中设置 attr_timeout 选项相同。
过滤器
请注意,所有 rclone 过滤器都可用于选择要在挂载中显示的文件子集。
systemd
当将 rclone nfsmount 作为 systemd 服务运行时,可以使用 Type = notify。在这种情况下,服务将在挂载点成功设置后进入启动状态。将 rclone nfsmount 服务指定为依赖项的单元将在此模式下立即看到所有文件和文件夹。
请注意,systemd 在运行挂载单元时不会设置任何环境变量,包括 PATH
或 HOME
。这意味着波浪号 (~
) 展开将不起作用,你应该通过 rclone 参数显式提供 --config
和 --cache - dir
作为绝对路径。由于挂载操作需要 fusermount
或 fusermount3
程序,在这种情况下,rclone 将使用 /bin:/usr/bin
作为备用 PATH。请确保 fusermount
/fusermount3
存在于这个 PATH 中。
将 Rclone 用作 Unix 挂载助手
核心 Unix 程序 /bin/mount
通常接受 -t FSTYPE
参数,然后运行 /sbin/mount.FSTYPE
助手程序,并将挂载选项作为 -o key = val,...
或 --opt =...
传递给它。自动挂载(经典或 systemd)的行为类似。
rclone 默认期望使用 GNU 风格的标志 --key val
。要将其作为挂载助手运行,你应该将 rclone 二进制文件符号链接到 /sbin/mount.rclone
,并可选地链接到 /usr/bin/rclonefs
,例如 ln -s /usr/bin/rclone /sbin/mount.rclone
。rclone 将检测到这一点并适当地转换命令行参数。
现在你可以像这样运行经典挂载:
mount sftp1:subdir /mnt/data -t rclone -o vfs_cache_mode=writes,sftp_key_file=/path/to/pem
或创建 systemd 挂载单元:
# /etc/systemd/system/mnt-data.mount
[Unit]
Description=Mount for /mnt/data
[Mount]
Type=rclone
What=sftp1:subdir
Where=/mnt/data
Options=rw,_netdev,allow_other,args2env,vfs-cache-mode=writes,config=/etc/rclone.conf,cache-dir=/var/rclone
可选配 systemd 自动挂载单元
# /etc/systemd/system/mnt-data.automount
[Unit]
Description=AutoMount for /mnt/data
[Automount]
Where=/mnt/data
TimeoutIdleSec=600
[Install]
WantedBy=multi-user.target
或者在 /etc/fstab
中添加一行,如
sftp1:subdir /mnt/data rclone rw,noauto,nofail,_netdev,x-systemd.automount,args2env,vfs_cache_mode=writes,config=/etc/rclone.conf,cache_dir=/var/cache/rclone 0 0
或者使用经典的 Automountd。
请记住,由于挂载单元在没有 HOME
环境变量的情况下运行,因此需要显式提供 config=...,cache-dir=...
作为解决方法。
以挂载助手模式运行的 Rclone 会将 -o
参数按逗号分割,将 _
替换为 -
,并在前面加上 --
以得到命令行标志。包含逗号或空格的选项可以用单引号或双引号括起来。相同类型的外层引号内的内层引号应该加倍。
挂载选项语法包含一些特殊处理的额外选项:
env.NAME=VALUE
会为挂载进程设置一个环境变量。 这对于 Automountd 和 Systemd.mount 很有用,因为它们不允许为挂载助手设置自定义环境。 通常你会使用env.HTTPS_PROXY=proxy.host:3128
或env.HOME=/root
command=cmount
可用于运行cmount
或任何其他 rclone 命令,而不是默认的mount
。args2env
会通过环境变量而不是命令行参数将挂载选项传递给在后台运行的挂载助手。这可以避免在ps
或pgrep
等命令中暴露机密信息。vv...
会转换为相应的--verbose=N
- 像
x-systemd.automount
、_netdev
、nosuid
等标准挂载选项仅用于 Automountd,rclone 会忽略它们。
VFS - 虚拟文件系统
此命令使用 VFS 层。该层将 rclone 使用的云存储对象转换为更像磁盘文件系统的形式。
云存储对象有很多与磁盘文件不同的属性,比如不能扩展它们,也不能写入文件中间,因此 VFS 层必须处理这些问题。由于没有一种通用的处理方法,下面将介绍各种选项。
VFS 层还实现了一个目录缓存,它将文件和目录的信息(但不包括数据)缓存在内存中。
VFS 目录缓存
使用 --dir-cache-time
标志,你可以控制一个目录在多长时间内被认为是最新的,而无需从后端刷新。通过 VFS 所做的更改将立即显示,或者使缓存失效。
--dir-cache-time duration 目录条目缓存的时间(默认 5m0s)
--poll-interval duration 轮询更改的间隔时间。必须小于 `dir-cache-time`。仅适用于支持轮询的后端。设置为 0 可禁用(默认 1m0s)
然而,如果后端配置不支持轮询更改,那么通过 Web 界面或另一个 rclone 副本直接在云存储上所做的更改,只有在目录缓存过期后才能被检测到。如果后端支持轮询,更改将在轮询间隔内被检测到。
你可以向 rclone 发送 SIGHUP
信号,使其刷新所有目录缓存,无论它们的缓存时间有多长。假设只有一个 rclone 实例在运行,你可以这样重置缓存:
kill -SIGHUP $(pidof rclone)
如果你将 rclone 配置为 远程控制,则可以使用 rclone rc 刷新整个目录缓存:
rclone rc vfs/forget
或者刷新单个文件或目录:
rclone rc vfs/forget file=path/to/file dir=path/to/dir
VFS 文件缓冲
--buffer-size
标志决定了用于提前缓冲数据的内存量。
每个打开的文件都会尽量在内存中保留指定数量的数据。缓冲的数据与一个打开的文件绑定,不会共享。
这个标志是每个打开文件使用内存的上限。缓冲区只会为已下载但尚未读取的数据使用内存。如果缓冲区为空,只会使用少量内存。
rclone 用于缓冲的最大内存量可以达到 --buffer-size * 打开文件数
。
VFS 文件缓存
这些标志控制 VFS 文件缓存选项。文件缓存对于使 VFS 层与普通文件系统兼容是必要的。可以禁用它,但会牺牲一些兼容性。
例如,如果你想同时读写一个文件,就需要启用 VFS 缓存。更多细节见下文。
请注意,VFS 缓存与缓存后端是分开的,你可能需要其中一个或两个都需要。
--cache-dir string rclone 用于缓存的目录。
--vfs-cache-mode CacheMode 缓存模式:off|minimal|writes|full(默认 off)
--vfs-cache-max-age duration 缓存中对象自上次访问以来的最大时间(默认 1h0m0s)
--vfs-cache-max-size SizeSuffix 缓存中对象的最大总大小(默认无限制)
--vfs-cache-min-free-space SizeSuffix 缓存所在磁盘的目标最小可用空间(默认无限制)
--vfs-cache-poll-interval duration 轮询缓存中过期对象的间隔时间(默认 1m0s)
--vfs-write-back duration 使用缓存时,文件最后一次使用后写回的时间(默认 5s)
如果使用 -vv
运行 rclone,它会打印文件缓存的位置。文件存储在用户缓存文件区域,该区域依赖于操作系统,但可以通过 --cache-dir
或设置相应的环境变量来控制。
缓存有 4 种不同的模式,通过 --vfs-cache-mode
选择。缓存模式越高,rclone 的兼容性越好,但会占用更多磁盘空间。
请注意,文件只有在关闭且在 --vfs-write-back
秒内未被访问时才会写回到远程。如果 rclone 退出或崩溃,有未上传的文件,下次使用相同标志运行 rclone 时,这些文件将被上传。
如果使用 --vfs-cache-max-size
或 --vfs-cache-min-free-size
,请注意缓存可能会超过这些配额,原因有两个。一是它只在 --vfs-cache-poll-interval
时间检查一次。二是打开的文件不能从缓存中移除。当 --vfs-cache-max-size
或 --vfs-cache-min-free-size
超过时,rclone 会尝试先移除缓存中访问最少的文件。rclone 会从最长时间未被访问的文件开始。这种缓存刷新策略很高效,更相关的文件可能会留在缓存中。
--vfs-cache-max-age
会在设定的自上次访问时间过后将文件从缓存中移除。默认值 1 小时意味着开始移除 1 小时内未被访问的文件。当缓存文件被访问时,1 小时计时器会重置为 0,并在再等待 1 小时后移除。使用标准符号(s、m、h、d、w)指定时间。
如果使用 --vfs-cache-mode > off
,不应该使用相同的 VFS 缓存和相同或重叠的远程运行两个 rclone 副本。否则可能会导致数据损坏。你可以通过 --cache-dir
为每个 rclone 提供自己的缓存层次结构来解决这个问题。如果使用的远程不重叠,则无需担心这个问题。
–vfs-cache-mode off
在这种模式(默认模式)下,缓存会直接从远程读取数据并直接写入远程,不会在磁盘上缓存任何内容。
这意味着某些操作将无法进行:
- 不能同时以读写模式打开文件
- 以写模式打开的文件不能进行查找操作
- 以写模式打开现有文件时必须设置 O_TRUNC
- 以读模式打开并设置 O_TRUNC 的文件将以只写模式打开
- 以只写模式打开的文件将表现得好像设置了 O_TRUNC
- 打开模式 O_APPEND、O_TRUNC 会被忽略
- 如果上传失败,无法重试
–vfs-cache-mode minimal
这种模式与 “off” 模式非常相似,除了以读写模式打开的文件会被缓冲到磁盘。这意味着以写模式打开的文件会更兼容,但只使用最少的磁盘空间。
以下操作仍然无法进行:
- 以只写模式打开的文件不能进行查找操作
- 以写模式打开现有文件时必须设置 O_TRUNC
- 以只写模式打开的文件会忽略 O_APPEND、O_TRUNC
- 如果上传失败,无法重试
–vfs-cache-mode writes
在这种模式下,以只读模式打开的文件仍然直接从远程读取,而以只写和读写模式打开的文件会先缓冲到磁盘。
这种模式应该支持所有正常的文件系统操作。
如果上传失败,会以指数级增加的间隔重试,最长间隔为 1 分钟。
–vfs-cache-mode full
在这种模式下,所有的读写操作都会缓冲到磁盘和从磁盘读取。从远程读取数据时,也会缓冲到磁盘。
在这种模式下,缓存中的文件将是稀疏文件,rclone 会跟踪文件中哪些部分已下载。
因此,如果应用程序只读取每个文件的开头,那么 rclone 只会缓冲文件的开头。这些文件在缓存中看起来是完整大小,但实际上是稀疏文件,只有已下载的数据存在。
这种模式应该支持所有正常的文件系统操作,并且与 --vfs-cache-mode writes
模式相同。
读取文件时,rclone 会提前读取 --buffer-size
加上 --vfs-read-ahead
字节的数据。--buffer-size
是在内存中缓冲的,而 --vfs-read-ahead
是在磁盘上缓冲的。
使用这种模式时,建议不要将 --buffer-size
设置得太大,如果需要,可以将 --vfs-read-ahead
设置得大一些。
重要提示:并非所有文件系统都支持稀疏文件。特别是 FAT/exFAT 不支持。如果缓存目录位于不支持稀疏文件的文件系统上,rclone 的性能会非常差,并且如果检测到这种情况,会记录一条错误消息。
指纹识别
VFS 的各个部分使用指纹识别来判断本地文件副本相对于远程文件是否发生了变化。指纹由以下信息生成:
- 大小
- 修改时间
- 哈希值
如果对象有这些属性的话。
在某些后端,其中一些属性读取起来很慢(每个对象需要额外的 API 调用,或者每个对象需要额外的工作)。
例如,local
和 sftp
后端的 hash
读取很慢,因为它们必须读取整个文件并进行哈希计算;s3
、swift
、ftp
和 qinqstor
后端的 modtime
读取很慢,因为它们需要额外的 API 调用才能获取。
如果你使用 --vfs-fast-fingerprint
标志,rclone 将不会在指纹中包含这些慢速操作。这会使指纹识别不太准确,但速度会快很多,并且会提高缓存文件的打开速度。
如果你在 local
、s3
或 swift
后端上运行 vfs 缓存,建议使用这个标志。
请注意,如果你更改了这个标志的值,缓存中文件的指纹可能会失效,文件需要重新下载。
VFS 分块读取
当 rclone 从远程读取文件时,它会分块读取。这意味着 rclone 不会请求整个文件,而是读取指定的块。这可以通过只请求实际读取的块来减少某些远程的下载配额,但会增加请求数量。
这些标志控制分块读取:
--vfs-read-chunk-size SizeSuffix 以块为单位读取源对象(默认 128M)
--vfs-read-chunk-size-limit SizeSuffix 块大小翻倍的最大限制(默认无限制)
--vfs-read-chunk-streams int 同时读取的并行流数量
分块读取的行为取决于 --vfs-read-chunk-streams
参数。
--vfs-read-chunk-streams
== 0
rclone 会开始读取大小为 --vfs-read-chunk-size
的块,然后每次读取时将块大小翻倍。如果指定了 --vfs-read-chunk-size-limit
且大于 --vfs-read-chunk-size
,则每个打开文件的块大小只会翻倍,直到达到指定值。如果值为 “off”(默认值),则禁用限制,块大小会无限增长。
使用 --vfs-read-chunk-size 100M
和 --vfs-read-chunk-size-limit 0
时,将下载以下部分:0 - 100M、100M - 200M、200M - 300M、300M - 400M 等等。如果指定 --vfs-read-chunk-size-limit 500M
,结果将是 0 - 100M、100M - 300M、300M - 700M、700M - 1200M、1200M - 1700M 等等。
将 --vfs-read-chunk-size
设置为 0
或 “off” 会禁用分块读取。
块不会在内存中缓冲。
--vfs-read-chunk-streams
> 0
rclone 会同时读取 --vfs-read-chunk-streams
个大小为 --vfs-read-chunk-size
的块。每次读取的大小将保持不变。
这在高延迟链接或连接到高性能对象存储的非常高带宽链接上可以显著提高性能。
需要进行一些实验来找到 --vfs-read-chunk-size
和 --vfs-read-chunk-streams
的最佳值,因为这些值取决于所使用的后端和到后端的延迟。
对于高性能对象存储(例如 AWS S3),一个合理的起始设置可能是 --vfs-read-chunk-streams 16
和 --vfs-read-chunk-size 4M
。在对 AWS S3 的测试中,性能大致与 --vfs-read-chunk-streams
设置成正比。
类似的设置也适用于高延迟链接,但根据延迟情况,可能需要更多的 --vfs-read-chunk-streams
才能获得吞吐量。
VFS 性能
这些标志可用于出于性能或其他原因启用/禁用 VFS 的某些功能。另请参阅 分块读取 功能。
特别是 S3 和 Swift 后端从 --no-modtime
标志(或使用 --use-server-modtime
以获得略有不同的效果)中受益巨大,因为每次读取修改时间都需要进行一次事务。
--no-checksum 上传/下载时不比较校验和。
--no-modtime 不读取/写入修改时间(可以加快速度)。
--no-seek 不允许在文件中进行查找操作。
--read-only 只允许只读访问。
有时 rclone 会收到无序的读写请求。与其进行查找操作,rclone 会等待一小段时间,等待按顺序的读写请求到来。这些标志仅在不使用磁盘缓存文件时生效。
--vfs-read-wait duration 在进行查找操作之前等待按顺序读取的时间(默认 20ms)
--vfs-write-wait duration 在给出错误之前等待按顺序写入的时间(默认 1s)
使用 VFS 写缓存(--vfs-cache-mode
值为 writes 或 full)时,可以设置全局标志 --transfers
来调整从缓存中并行上传修改后文件的数量(相关的全局标志 --checkers
对 VFS 没有影响)。
--transfers int 并行运行的文件传输数量(默认 4)
符号链接
默认情况下,VFS 不支持符号链接。但是,可以通过以下两个标志之一启用:
--links 将符号链接转换为带有 `.rclonelink` 扩展名的普通文件,反之亦然。
--vfs-links 为 VFS 将符号链接转换为带有 `.rclonelink` 扩展名的普通文件,反之亦然。
由于大多数云存储系统不直接支持符号链接,rclone 将符号链接存储为带有特殊扩展名的普通文件。因此,看起来是符号链接的文件 link-to-file.txt
将在云存储中存储为 link-to-file.txt.rclonelink
,其内容将是符号链接目标的路径。
请注意,--links
会在 rclone 全局范围内启用符号链接转换,这包括任何支持该概念的后端(例如本地后端)。--vfs-links
仅为 VFS 层启用该功能。
此方案与 带有 --local-links
标志的本地后端 使用的方案兼容。
--vfs-links
标志是为 rclone mount
、rclone nfsmount
和 rclone serve nfs
设计的。
目前尚未在其他 rclone serve
命令中进行测试。
当前实现的一个限制是,它期望调用者解析子符号链接。例如,给定以下目录树:
.
├── dir
│ └── file.txt
└── linked-dir -> dir
VFS 会正确解析 linked-dir
,但不会解析 linked-dir/file.txt
。对于经过测试的命令来说,这不是问题,但对于其他命令可能会有影响。
注意,符号链接支持存在一个未解决的问题 issue #8245,当符号链接移动到存在同名文件的目录中时(反之亦然),会创建重复的文件。
VFS 大小写敏感性
Linux 文件系统区分大小写:两个文件可以仅通过大小写来区分,打开文件时必须使用确切的大小写。
现代 Windows 系统中的文件系统不区分大小写,但会保留大小写:虽然可以使用任何大小写来打开现有文件,但创建文件时使用的确切大小写会被保留,并且程序可以查询。同一目录中不允许有两个仅通过大小写区分的文件。
通常,macOS 上的文件系统不区分大小写。可以将 macOS 文件系统设置为区分大小写,但这不是默认设置。
--vfs-case-insensitive
VFS 标志控制 rclone 如何处理这两种情况。如果其值为 “false”,rclone 会按原样将文件名传递给远程存储。如果该标志为 “true”(或者在命令行中出现但没有值),rclone 可能会执行如下所述的“修正”操作。
用户可能会指定一个与远程存储上存储的大小写不同的文件名来进行打开、删除、重命名等操作。如果参数引用的是一个名称完全相同的现有文件,那么磁盘上现有文件的大小写将被使用。但是,如果没有找到名称完全相同的文件,但存在一个仅大小写不同的名称,rclone 会透明地修正该名称。这种修正仅在请求现有文件时发生。rclone 新创建的文件名的大小写敏感性由底层远程存储控制。
请注意,运行 rclone 的操作系统(目标系统)的大小写敏感性可能与 rclone 呈现的文件系统(源系统)的大小写敏感性不同。该标志控制是否执行“修正”以满足目标系统的要求。
如果命令行中未提供该标志,则其默认值取决于 rclone 运行的操作系统:在 Windows 和 macOS 上为 “true”,其他情况下为 “false”。如果该标志提供但没有值,则为 “true”。
--no-unicode-normalization
标志控制是否对那些在 Unicode 方面规范等效但不同的文件名执行类似的“修正”操作。Unicode 规范化对于 macOS 用户特别有用,因为 macOS 更喜欢使用 NFD 形式,而大多数其他平台使用 NFC 形式。因此,强烈建议在 macOS 上保持默认值 false
,以避免编码兼容性问题。
在(可能不太可能)应用大小写和 Unicode 规范化后,目录中有多个重复文件名的情况下,--vfs-block-norm-dupes
标志允许隐藏这些重复项。这会带来性能上的权衡,因为 rclone 在列出目录时必须扫描整个目录以查找重复项。因此,如果不需要,建议禁用此标志。但是,macOS 用户可能希望考虑使用它,否则,如果远程目录中包含同一文件名的 NFC 和 NFD 版本,将会出现一种奇怪的情况:这两个版本的文件在挂载点中都可见,并且看起来都可以编辑,但是,编辑任何一个版本实际上都会导致只有 NFD 版本在底层被编辑。--vfs-block-norm-dupes
会检测这种情况,隐藏重复项,并记录错误,类似于 rclone sync
中的处理方式,从而避免这种混淆。
VFS 磁盘选项
此标志允许你手动设置文件系统的统计信息。当这些统计信息无法自动正确读取时,这可能会很有用。
--vfs-disk-space-total-size 手动设置磁盘总空间大小(示例:256G,默认值:-1)
已使用字节的替代报告方式
一些后端,尤其是 S3,不会报告已使用的字节数。如果你在文件系统上运行 df
时需要此信息可用,请将 --vfs-used-is-size
标志传递给 rclone。
设置此标志后,rclone 不会依赖后端来报告此信息,而是会像 rclone size
一样扫描整个远程存储,并自行计算总使用空间。
警告:与 rclone size
不同,此标志会忽略过滤器,以确保结果准确。但是,这非常低效,可能会产生大量 API 调用,从而导致额外费用。请将其作为最后手段使用,并且仅在启用缓存的情况下使用。
rclone nfsmount remote:path /path/to/mountpoint [flags]
Options
--addr string 绑定服务器的 IP 地址:端口或 :端口
--allow-non-empty 允许挂载到非空目录(Windows 不支持)
--allow-other 允许其他用户访问(Windows 不支持)
--allow-root 允许根用户访问(Windows 不支持)
--async-read 使用异步读取(Windows 不支持)(默认值:true)
--attr-timeout Duration 文件/目录属性的缓存时间(默认值:1 秒)
--daemon 以后台模式运行挂载操作并退出父进程(由于后台输出被抑制,请使用 --log-file 并结合 --log-format=pid,... 进行监控)(Windows 不支持)
--daemon-timeout Duration rclone 响应内核的时间限制(Windows 不支持)(默认值:0 秒)
--daemon-wait Duration 等待守护进程完成挂载的时间(在 Linux 上为最大等待时间,在 OSX/BSD 上为固定休眠时间)(Windows 不支持)(默认值:1 分钟)
--debug-fuse 调试 FUSE 内部 - 需要 -v 选项
--default-permissions 让内核根据文件模式强制执行访问控制(Windows 不支持)
--devname string 设置设备名称 - 默认值为 remote:path
--dir-cache-time Duration 目录条目的缓存时间(默认值:5 分钟)
--dir-perms FileMode 目录权限(默认值:777)
--direct-io 使用直接 I/O,禁用数据缓存
--file-perms FileMode 文件权限(默认值:666)
--fuse-flag stringArray 直接传递给 libfuse/WinFsp 的标志或参数(如有需要可重复使用)
--gid uint32 覆盖文件系统设置的 gid 字段(Windows 不支持)(默认值:1000)
-h, --help nfsmount 命令的帮助信息
--link-perms FileMode 链接权限(默认值:666)
--max-read-ahead SizeSuffix 顺序读取时可预取的字节数(Windows 不支持)(默认值:128Ki)
--mount-case-insensitive Tristate 告知操作系统挂载点是否区分大小写(true 表示不区分,false 表示区分,auto 表示自动)(默认值:未设置)
--network-mode 挂载为远程网络驱动器,而非固定磁盘驱动器(仅 Windows 支持)
--nfs-cache-dir string 若设置,NFS 句柄缓存将使用的目录
--nfs-cache-handle-limit int 同时缓存的最大文件句柄数(最小值:5)(默认值:1000000)
--nfs-cache-type memory|disk|symlink 使用的 NFS 句柄缓存类型(默认值:memory)
--no-checksum 上传/下载时不比较校验和
--no-modtime 不读取/写入修改时间(可加快速度)
--no-seek 不允许在文件中进行查找操作
--noappledouble 忽略 Apple Double (._) 和 .DS_Store 文件(仅 OSX 支持)(默认值:true)
--noapplexattr 忽略所有 "com.apple.*" 扩展属性(仅 OSX 支持)
-o, --option stringArray libfuse/WinFsp 的选项(如有需要可重复使用)
--poll-interval Duration 轮询更改的间隔时间,必须小于 dir-cache-time,且仅适用于支持的远程存储(设置为 0 可禁用)(默认值:1 分钟)
--read-only 仅允许只读访问
--sudo 使用 sudo 以根用户身份运行挂载/卸载命令。
--uid uint32 覆盖文件系统设置的 uid 字段(Windows 不支持)(默认值:1000)
--umask FileMode 覆盖文件系统设置的权限位(Windows 不支持)(默认值:002)
--vfs-block-norm-dupes 如果同一目录中存在重复的文件名(规范化后),记录错误并隐藏重复项(可能会有性能开销)
--vfs-cache-max-age Duration 缓存中对象自上次访问以来的最大时间(默认值:1 小时)
--vfs-cache-max-size SizeSuffix 缓存中对象的最大总大小(默认值:无限制)
--vfs-cache-min-free-space SizeSuffix 缓存所在磁盘的目标最小可用空间(默认值:无限制)
--vfs-cache-mode CacheMode 缓存模式:off|minimal|writes|full(默认值:off)
--vfs-cache-poll-interval Duration 轮询缓存中过期对象的间隔时间(默认值:1 分钟)
--vfs-case-insensitive 如果未找到文件名,尝试进行大小写不敏感的匹配
--vfs-disk-space-total-size SizeSuffix 指定磁盘的总空间(默认值:无限制)
--vfs-fast-fingerprint 使用快速(不太准确)的指纹识别来检测更改
--vfs-links 为 VFS 将符号链接转换为带有 '.rclonelink' 扩展名的普通文件,反之亦然
--vfs-read-ahead SizeSuffix 在使用 full 缓存模式时,除 --buffer-size 外额外预读的字节数
--vfs-read-chunk-size SizeSuffix 以块为单位读取源对象(默认值:128Mi)
--vfs-read-chunk-size-limit SizeSuffix 如果大于 --vfs-read-chunk-size,则每次读取块后将块大小翻倍,直到达到限制('off' 表示无限制)(默认值:无限制)
--vfs-read-chunk-streams int 同时读取的并行流数量
--vfs-read-wait Duration 在进行查找操作之前等待按顺序读取的时间(默认值:20 毫秒)
--vfs-refresh 在启动时在后台递归刷新目录缓存
--vfs-used-is-size rclone size 使用 rclone size 算法计算已使用空间大小
--vfs-write-back Duration 使用缓存时,文件最后一次使用后写回的时间(默认值:5 秒)
--vfs-write-wait Duration 在给出错误之前等待按顺序写入的时间(默认值:1 秒)
--volname string 设置卷名(仅 Windows 和 OSX 支持)
--write-back-cache 让内核在将写入操作发送给 rclone 之前进行缓冲(否则使用直写式缓存)(Windows 不支持)
接下来将介绍与其他命令共享的选项。 此处未列出的全局选项,请参阅全局标志页面。
过滤器选项
用于过滤目录列表的标志
--delete-excluded 删除目标端中被排除在同步之外的文件
--exclude stringArray 排除符合指定模式的文件
--exclude-from stringArray 从文件中读取要排除的文件模式(使用 `-` 从标准输入读取)
--exclude-if-present stringArray 如果指定文件名存在,则排除该目录
--files-from stringArray 从文件中读取源文件名列表(使用 `-` 从标准输入读取)
--files-from-raw stringArray 从文件中读取源文件名列表,不对行进行任何处理(使用 `-` 从标准输入读取)
-f, --filter stringArray 添加文件过滤规则
--filter-from stringArray 从文件中读取文件过滤模式(使用 `-` 从标准输入读取)
--ignore-case 在过滤时忽略大小写(大小写不敏感)
--include stringArray 包含符合指定模式的文件
--include-from stringArray 从文件中读取要包含的文件模式(使用 `-` 从标准输入读取)
--max-age Duration 仅传输比指定时间(以秒或后缀 `ms|s|m|h|d|w|M|y` 表示)更新的文件(默认关闭)
--max-depth int 如果设置,则将递归深度限制为此值(默认 -1)
--max-size SizeSuffix 仅传输小于指定大小(以 KiB 或后缀 `B|K|M|G|T|P` 表示)的文件(默认关闭)
--metadata-exclude stringArray 排除符合指定模式的元数据
--metadata-exclude-from stringArray 从文件中读取要排除的元数据模式(使用 `-` 从标准输入读取)
--metadata-filter stringArray 添加元数据过滤规则
--metadata-filter-from stringArray 从文件中读取元数据过滤模式(使用 `-` 从标准输入读取)
--metadata-include stringArray 包含符合指定模式的元数据
--metadata-include-from stringArray 从文件中读取要包含的元数据模式(使用 `-` 从标准输入读取)
--min-age Duration 仅传输比指定时间(以秒或后缀 `ms|s|m|h|d|w|M|y` 表示)更旧的文件(默认关闭)
--min-size SizeSuffix 仅传输大于指定大小(以 KiB 或后缀 `B|K|M|G|T|P` 表示)的文件(默认关闭)
参见
- rclone - 显示 rclone 命令、标志和后端帮助。