rclone serve dlna
通过 DLNA 服务 remote:path
概要
为存储在 rclone 远程存储中的媒体运行一个 DLNA 媒体服务器。许多设备,如 Xbox 和 PlayStation,能够在局域网(LAN)中自动发现此服务器,并从中播放音频或视频。VLC 也支持此功能。服务发现使用 UDP 组播数据包(SSDP),因此仅适用于局域网。
Rclone 将列出远程存储中的所有文件,不会基于媒体格式或文件扩展名进行过滤。此外,它不支持媒体转码。这意味着某些播放器可能会显示它们无法正确播放的文件。
如果外部字幕文件(.srt)与视频文件具有相同的文件名(扩展名除外),并且位于视频文件所在的同一目录或 “Subs” 子目录中,Rclone 会将其添加到视频中。
服务器选项
使用 --addr
指定服务器应监听的 IP 地址和端口,例如 --addr 1.2.3.4:8000
或 --addr :8080
以监听所有 IP 地址。
使用 --name
选择友好的服务器名称,默认名称为 “rclone (hostname)"。
结合 -vv
使用 --log-trace
以启用所有 UPNP 流量的额外调试日志记录。
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 缓存中对象的最大总大小(默认 off)
--vfs-cache-min-free-space SizeSuffix 包含缓存的磁盘上的目标最小可用空间(默认 off)
--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 的性能将非常差,并且如果检测到这种情况,它将记录一条 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 块大小翻倍的最大限制(默认 off)
--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
。对于经过测试的命令而言,这并非问题,但对于其他命令可能会有影响。
注意,符号链接支持存在一个未解决的问题 问题 #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 serve dlna remote:path [flags]
Options
--addr string 要将 DLNA HTTP 服务器绑定到的 IP 地址和端口,格式为 ip:port 或 :port(默认值为 ":7879")
--announce-interval Duration SSDP 公告之间的间隔时间(默认值为 12 分钟)
--dir-cache-time Duration 目录条目缓存的时间(默认值为 5 分钟)
--dir-perms FileMode 目录权限(默认值为 777)
--file-perms FileMode 文件权限(默认值为 666)
--gid uint32 覆盖文件系统设置的 gid 字段(Windows 系统不支持)(默认值为 1000)
-h, --help dlna 命令的帮助信息
--interface stringArray 用于 SSDP 的网络接口(可重复指定)
--link-perms FileMode 链接权限(默认值为 666)
--log-trace 启用 SOAP 流量的跟踪日志记录
--name string DLNA 服务器的名称
--no-checksum 上传/下载时不比较校验和
--no-modtime 不读取/写入修改时间(可以加快速度)
--no-seek 不允许在文件中进行定位操作
--poll-interval Duration 轮询更改的间隔时间,必须小于 dir-cache-time,且仅适用于支持的远程存储(设置为 0 可禁用)(默认值为 1 分钟)
--read-only 仅允许只读访问
--uid uint32 覆盖文件系统设置的 uid 字段(Windows 系统不支持)(默认值为 1000)
--umask FileMode 覆盖文件系统设置的权限位(Windows 系统不支持)(默认值为 002)
--vfs-block-norm-dupes 如果同一目录中存在重复的文件名(经过规范化处理后),记录错误并隐藏重复项(可能会有性能开销)
--vfs-cache-max-age Duration 缓存中对象自上次访问以来的最大时间(默认值为 1 小时)
--vfs-cache-max-size SizeSuffix 缓存中对象的最大总大小(默认值为 off)
--vfs-cache-min-free-space SizeSuffix 包含缓存的磁盘上的目标最小可用空间(默认值为 off)
--vfs-cache-mode CacheMode 缓存模式:off|minimal|writes|full(默认值为 off)
--vfs-cache-poll-interval Duration 轮询缓存中陈旧对象的间隔时间(默认值为 1 分钟)
--vfs-case-insensitive 如果未找到指定文件名,尝试进行大小写不敏感的匹配
--vfs-disk-space-total-size SizeSuffix 指定磁盘的总空间(默认值为 off)
--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' 表示无限制)(默认值为 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 秒)
接下来将介绍与其他命令共享的选项。 此处未列出的全局选项,请参阅全局标志页面。
过滤器选项
用于过滤目录列表的标志
--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 serve - 通过协议为远程服务器提供服务。