rclone mount
将远程文件系统挂载到挂载点上。
概要
Rclone mount 允许 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 mount remote:path/to/files /path/to/local/mount
在 Windows 上,你可以通过不同的方式启动挂载操作。具体细节请参阅下文。如果在控制台窗口中以前台模式交互式地进行挂载操作,rclone 将为挂载点提供服务并占用该控制台窗口,因此在 rclone 被中断(例如按下 Ctrl-C)之前,你需要使用另一个窗口来操作挂载点。
以下示例展示了如何将远程存储挂载到自动分配的驱动器、特定的驱动器盘符 X:
、路径 C:\path\parent\mount
(父目录或驱动器必须存在,且挂载点不能已存在,并且在以网络驱动器模式挂载时不支持这种方式),最后一个示例展示了如何将远程存储挂载为网络共享 \\cloud\remote
并映射到自动分配的驱动器:
rclone mount remote:path/to/files *
rclone mount remote:path/to/files X:
rclone mount remote:path/to/files C:\path\parent\mount
rclone mount remote:path/to/files \\cloud\remote
当程序在前台模式下结束时,无论是通过 Ctrl+C 还是接收到 SIGINT 或 SIGTERM 信号 SIGINT 或 SIGTERM 信号时,挂载会自动停止。
在后台模式下运行时,用户必须手动停止挂载:
# Linux
fusermount -u /path/to/local/mount
#... or on some systems
fusermount3 -u /path/to/local/mount
# OS X or Linux when using nfsmount
umount /path/to/local/mount
卸载操作可能会失败,例如当挂载点正被使用时。 遇到这种情况时,用户有责任手动停止挂载。
挂载的文件系统大小将根据从远程获取的信息进行设置,与 rclone about 命令返回的信息相同。对于具有无限存储空间的远程存储,可能仅报告已使用的大小,此时会假设额外有 1 PiB 的可用空间。如果远程存储根本不支持 about
功能,则会将总大小和可用大小都设置为 1 PiB。
在 Windows 上安装
要在 Windows 上运行 rclone mount
,你需要下载并安装 WinFsp。
WinFsp 是一个开源的 Windows 文件系统代理,它使得为 Windows 编写用户空间文件系统变得容易。它提供了一个 FUSE 模拟层,rclone 会结合 cgofuse 使用该层。这两个软件包均由 Bill Zissimopoulos 开发,他在为 Windows 实现 rclone mount
时提供了很大帮助。
Windows 上的挂载模式
与其他操作系统不同,Microsoft Windows 为网络驱动器和固定驱动器提供了不同的文件系统类型。它基于固定磁盘驱动器快速且可靠,而网络驱动器具有相对较高的延迟和较低的可靠性这一假设来优化访问。某些设置也可以在这两种类型之间进行区分,例如,Windows 资源管理器应该只显示图标,而不为网络驱动器上的图像和视频文件创建预览缩略图。
在大多数情况下,rclone 默认会将远程存储挂载为普通的固定磁盘驱动器。但是,你也可以选择将其挂载为远程网络驱动器,通常称为网络共享。如果你使用默认的固定驱动器模式挂载 rclone 远程存储并遇到意外的程序错误、冻结或其他问题,可以考虑改为挂载为网络驱动器。
当挂载为固定磁盘驱动器时,你可以选择挂载到一个未使用的驱动器号,或者挂载到一个表示不存在的子目录的路径,该子目录的父目录或驱动器必须存在。使用特殊值 *
会告诉 rclone 从 Z: 开始并向后查找,自动分配下一个可用的驱动器号。示例如下:
rclone mount remote:path/to/files *
rclone mount remote:path/to/files X:
rclone mount remote:path/to/files C:\path\parent\mount
rclone mount remote:path/to/files X:
选项 --volname
可用于为挂载的文件系统设置自定义卷名。默认情况下,会使用远程名称和路径。
若要将其挂载为网络驱动器,你可以在挂载命令中添加 --network-mode
选项。在此模式下,不支持挂载到目录路径,这是 Windows 对链接点施加的限制,因此远程存储必须始终挂载到驱动器号。
rclone mount 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 mount remote:path/to/files X: --network-mode
rclone mount remote:path/to/files X: --volname \\server\share
你也可以将网络共享 UNC 路径指定为挂载点本身。然后 rclone 将自动分配一个驱动器号,就像使用 *
一样,并将其用作挂载点,而是将指定的 UNC 路径用作卷名,就好像是使用 --volname
选项指定的一样。这也将隐式设置 --network-mode
选项。这意味着以下两个示例具有相同的结果:
rclone mount remote:path/to/files \\cloud\remote
rclone mount 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 来完成。macFUSE 是一个传统的 FUSE 驱动程序,利用了 macOS 内核扩展 (kext)。FUSE-T 是一个替代的 FUSE 系统,它通过 NFSv4 本地服务器 “挂载”。
Unicode 规范化
强烈建议在 macOS 上的所有 mount
和 serve
命令中保持 --no-unicode-normalization=false
的默认设置。有关详细信息,请参阅 vfs 大小写敏感性。
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 维基:
File access and modification times cannot be set separately as it seems to be an issue with the NFS client which always modifies both. Can be reproduced with ’touch -m’ and ’touch -a’ commands
这意味着使用各种工具(特别是 macOS Finder)查看文件时,rclone 会更新文件的修改时间。这可能会导致 rclone 上传一个全新的文件副本。
只读挂载
使用 --read-only
进行挂载时,尝试写入文件将静默失败,而不像 macFUSE 那样会给出明确的警告。
限制
如果不使用 --vfs-cache-mode
,则只能按顺序写入文件,只能在读取时进行定位操作。这意味着如果不使用 --vfs-cache-mode writes
或 --vfs-cache-mode full
,许多应用程序将无法在 rclone 挂载的文件系统上正常使用其文件。
有关更多信息,请参阅VFS 文件缓存部分。在 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 mount 与 rclone sync/copy 的比较
文件系统要求操作必须 100% 可靠,而云存储系统距离达到 100% 可靠性还有很长的路要走。rclone sync/copy 命令通过大量重试来应对这种情况。然而,rclone mount 无法以相同的方式使用重试机制,除非对上传内容进行本地复制。有关使挂载更可靠的解决方案,请参阅VFS 文件缓存部分。
属性缓存
您可以使用 --attr-timeout
标志设置内核缓存目录条目的属性(大小、修改时间等)的时间。
默认值为 1s
,这足以缓存文件,避免内核频繁调用 rclone。
理论上,对于可能在核控制之外发生变化的文件系统,0s
应该是正确的值。然而,这会引发一些问题,例如
rclone 使用过多内存、
rclone 无法向 samba 提供文件
以及列出目录时耗时过长。
内核可以在 --attr-timeout
指定的时间内缓存文件信息。如果远程文件在此期间改变了长度,您可能会看到数据损坏。这可能表现为文件被截断或文件末尾出现乱码。使用 --attr-timeout 1s
时,这种情况极不可能发生,但并非完全不可能。--attr-timeout
设置得越高,发生这种情况的可能性就越大。默认设置为 1s
,这是可以缓解上述问题的最低设置。
如果将其设置得更高(例如 10s
或 1m
),内核将减少对 rclone 的回调,从而提高效率,但上述数据损坏问题发生的可能性也会增加。
如果文件在 rclone 控制之外不会在远程发生变化,则不会出现数据损坏的情况。
这与在 mount.fuse 中设置 attr_timeout 选项的效果相同。
过滤器
请注意,所有 rclone 过滤器都可用于选择要在挂载中显示的文件子集。
systemd
将 rclone mount 作为 systemd 服务运行时,可以使用 Type=notify。在这种情况下,服务将在挂载点成功设置后进入启动状态。 将 rclone 挂载服务指定为依赖项的单元在这种模式下将立即看到所有文件和文件夹。
请注意,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 副本。这样做可能会导致数据损坏。你可以通过为每个 rclone 提供自己的缓存层次结构(使用 --cache-dir
)来解决这个问题。如果使用的远程存储没有重叠,则无需担心这个问题。
–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 的性能会非常差,并且如果检测到这种情况,会记录一条 ERROR 消息。
指纹识别
VFS 的各个部分使用指纹识别来查看本地文件副本相对于远程文件是否发生了变化。指纹由以下信息组成:
- 大小
- 修改时间
- 哈希值
只要对象上有这些信息。
在某些后端,其中一些属性读取起来很慢(每个对象需要额外的 API 调用,或每个对象需要额外的工作)。
例如,hash
在 local
和 sftp
后端读取很慢,因为它们必须读取整个文件并进行哈希计算;modtime
在 s3
、swift
、ftp
和 qinqstor
后端读取很慢,因为它们需要额外的 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 mount remote:path /path/to/mountpoint [flags]
Options
--allow-non-empty 允许挂载到非空目录(Windows 不支持)
--allow-other 允许其他用户访问(Windows 不支持)
--allow-root 允许 root 用户访问(Windows 不支持)
--async-read 使用异步读取(Windows 不支持)(默认值:true)
--attr-timeout Duration 文件/目录属性的缓存时间(默认值:1s)
--daemon 在后台运行挂载操作并退出父进程(由于后台输出被抑制,请使用 --log-file 和 --log-format=pid,... 进行监控)(Windows 不支持)
--daemon-timeout Duration rclone 响应内核的时间限制(Windows 不支持)(默认值:0s)
--daemon-wait Duration 等待守护进程完成挂载的时间(在 Linux 上是最大等待时间,在 OSX/BSD 上是固定睡眠时间)(Windows 不支持)(默认值:1m0s)
--debug-fuse 调试 FUSE 内部 - 需要 -v 选项
--default-permissions 让内核根据文件模式强制执行访问控制(Windows 不支持)
--devname string 设置设备名称 - 默认是 remote:path
--dir-cache-time Duration 目录条目的缓存时间(默认值:5m0s)
--dir-perms FileMode 目录权限(默认值:777)
--direct-io 使用直接 I/O,禁用数据缓存
--file-perms FileMode 文件权限(默认值:666)
--fuse-flag stringArray 直接传递给 libfuse/WinFsp 的标志或参数(如有需要可重复使用)
--gid uint32 覆盖文件系统设置的 gid 字段(Windows 不支持)(默认值:1000)
-h, --help mount 命令的帮助信息
--link-perms FileMode 链接权限(默认值:666)
--max-read-ahead SizeSuffix 顺序读取时可预取的字节数(Windows 不支持)(默认值:128Ki)
--mount-case-insensitive Tristate 告知操作系统挂载点是否区分大小写(true 表示不区分,false 表示区分),忽略后端设置(auto 表示自动)(默认值:未设置)
--network-mode 挂载为远程网络驱动器,而非固定磁盘驱动器(仅 Windows 支持)
--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 可禁用)(默认值:1m0s)
--read-only 仅允许只读访问
--uid uint32 覆盖文件系统设置的 uid 字段(Windows 不支持)(默认值:1000)
--umask FileMode 覆盖文件系统设置的权限位(Windows 不支持)(默认值:002)
--vfs-block-norm-dupes 如果同一目录中存在重复的文件名(归一化后),记录错误并隐藏重复项(可能会影响性能)
--vfs-cache-max-age Duration 缓存中对象自上次访问以来的最大时间(默认值:1h0m0s)
--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 轮询缓存中过期对象的间隔时间(默认值:1m0s)
--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 在进行定位操作之前等待按顺序读取的时间(默认值:20ms)
--vfs-refresh 在启动时在后台递归刷新目录缓存
--vfs-used-is-size rclone size 使用 rclone size 算法计算已使用空间
--vfs-write-back Duration 使用缓存时,文件最后一次使用后写回的时间(默认值:5s)
--vfs-write-wait Duration 在给出错误之前等待按顺序写入的时间(默认值:1s)
--volname string 设置卷名(仅 Windows 和 OSX 支持)
--write-back-cache 让内核在将写入数据发送给 rclone 之前进行缓冲(否则使用直写式缓存)(Windows 不支持)
接下来将介绍与其他命令共享的选项。 此处未列出的全局选项,请参阅 global flags page。
过滤器选项
用于过滤目录列表的标志
--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 命令、标志和后端帮助。