软件研究之Rclone

标签: 无 分类: 未分类 创建时间:2024-04-19 10:32:10 更新时间:2024-11-15 10:49:45

1.前言

查到了一个叫 rclone 的工具可以实现从 阿里云oss 复制到 minio。

2.下载

官网 下载相应的安装包到服务器,我这放到 /usr/local/rclone。需要注意的是 rclone 版本。我阿里云上用的是 alibaba 3 (64 bit),内核: 5.10.134-16.1.al8.x86_64 (x86_64),平台:amd64 的,所以我选择了 rclone 的 Intel/AMD - 64 Bit。

3.编辑配置文件

新建 vi /usr/local/rclone/rclone.conf 配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[oss]
type = s3
provider = Alibaba
env_auth = false
access_key_id = <你的ID,去阿里控制台配置>
secret_access_key = <你的秘钥,去阿里控制台配置>
endpoint = oss-cn-beijing.aliyuncs.com
acl = public-read
storage_class = STANDARD
bucket_acl = public-read

[minio]
type = s3
provider = Minio
env_auth = false
access_key_id = <你的minio用户名>
secret_access_key = <你的minio密码>
region = cn-east-1
endpoint = http://192.168.1.47:9000

4.解压配置可执行权限

1
2
3
4
5
6
7
8
9
10
# 进入目录
cd /usr/local/rclone
# 执行
./rclone sync -v oss:/hjkj-drone/drone/snapshot minio:/hjkj-drone/snapshot > rclone.log 2>&1

# 通配符复制
./rclone sync -v oss:/hjkj-drone/drone minio:/hjkj-drone/drone --include "{*/DJI_20240308*/*.mp4}" > rclone.log 2>&1

# 将本地目录上传到minio
./rclone sync -v /home/hj/alioss minio:/drone > rclone.log 2>&1
参考文章:
【1】.Rclone将阿里云Oss文件同步到Minio 这里直接有配置文件,可以采用配置文件。
【2】.如何使用MinIO 建立阿里云OSS代理 minio gateway
【3】.rclone 实现阿里OSS同步到MINIO 其实非常简单的一行命令,使用定时任务进行同步。
【4】.RcLone使用教程
【5】.Rclone 进阶使用教程 - 常用命令参数详解
【6】.Install

5.解决上传比较慢的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--transfers 4 表示文件并行数量
--max-size 3G 传输的文件最大3G
--min-size 3G 传输的文件最小3G
--checkers 64 并行检查64个文件
--drive-acknowledge-abuse 使用多线程传输
--fast-list 加快列表操作的速度

## 其他参数
--allow-other:允许非当前 rclone 用户外其它用户进行访问
--attr-timeout 5m:文件属性缓存,(大小,修改时间等)的时间。如果 VPS 配置比较低,建议适当提高这个值,避免过多内核交互,降低资源占用。
--vfs-cache-mode full:开启 VFS 文件缓存,可减少 rclone 与 API 交互,同时可提高文件读写效率
--vfs-cache-max-age 24h:VFS 文件缓存时间,这里设置 24 小时,如果文件很少更改,建议设置更长时间
--vfs-cache-max-size 5G:VFS 文件缓存上限大小,请根据服务器剩余磁盘自行调节
--vfs-read-chunk-size-limit 300M:分块读取大小,这里设置的是300M,可以提高文件读取的效率,比如1G的文件,大致分为10个块进行读取,但与此同时 API 请求次数也会增多
--buffer-size 300M:设置内存缓存,请根据服务器内存大小自行设置
--daemon:后台运行程序
--copy-links: 如果 OneDrive 中存在链接(symlink),则复制链接而不是解析它们。
--no-gzip-encoding: 禁止对文件进行 gzip 编码。
--no-check-certificate: 禁止检查 SSL 证书。
--allow-other: 允许其他用户(非挂载命令的用户)访问和操作挂载的文件系统。
--allow-non-empty: 允许挂载到非空目录。如果您要将 OneDrive 挂载到一个非空目录,需要使用这个选项。
--umask 000: 设置挂载目录的文件权限掩码为 000,意味着挂载的文件和目录对所有用户都具有完全的权限。
--no-modtime 用缺少modtime信息换取加载速度。

## 示例
./rclone sync -v /home/drone minio:/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 512M --checkers 64 --transfers 64 > rclone.log 2>&1
参考文章:
【1】.备份同步神器 Rclone 使用教程 rclone 中的每个选项都可以通过环境变量设置。环境变量的名称可以通过长选项名称进行转换,删除 – 前缀,更改 - 为 _,大写并添加前缀 RCLONE_。环境变量的优先级会低于命令行选项,即通过命令行追加相应的选项时会覆盖环境变量设定的值。
【2】.rclone从存储桶到文件系统的传输速度慢 这里有几个参数可以调整

6.rclone同步到alist

同步到百度网盘 编辑 rclone.conf 配置文件,填入如下的内容,因为这个密码需要加密后的密码,所以只能通过 rclone config 的方式进行生成配置

1
2
3
4
5
6
[百度网盘]
type = webdav
vendor = Other
user = admin
pass = xxxx
url = http://127.0.0.1:10002/dav

(1)配置步骤

1
2
3
4
5
6
7
8
9
10
11
./rclone config

# 1.选择 n 创建新的远程连接
# 2.设置远程名称:baidu
# 3.选择存储类型,这里没有可选项,直接输入: webdav
# 4.设置url, 这里设置:http://127.0.0.1:10002/dav
# 5.设置vendor,有些地方选6,我这个版本选择7:Other site/service or software
# 6.设置远程账号user,这里就是 alist 的用户名:admin
# 7.设置密码,这里就是 alist 的密码:
# 8.显示远程信息,确认,接下来一路回车
# 9.最后退出就好了。

(2)查看目录

1
2
3
4
5
# 查看alist的目录   baidu: 等于配置文件里面的名字
rclone lsd baidu:

# 查看alist的文件 等于配置文件的remote
rclone ls baidu:

(3)挂载好之后进行同步

1
/usr/local/rclone/rclone copy -v oss:/hjkj-drone/drone baidu:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 64M --checkers 32 --transfers 32 > /usr/local/rclone/logs/rclone_baidu.log

注意
为了解决大文件上传的问题,如果使用默认的配置的话,会导致大文件无法上传,我测试的时候,是超过 20M 就无法上传了,于是我坐了下面的一些操作,成功的上传了大文件,但是相应的,上传速度就会慢点很多。
(1)需要进行自定义破解ua:pan.baidu.com
(2)上传线程数需要设置为 1,设置为其他的会出错
(3)rclone传输的时候,也需要设置为 1,否则也会出错。

1
/usr/local/rclone/rclone copy -v oss:/hjkj-drone/drone baidu:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 64M --checkers 2 --transfers 2 --timeout 120m

(4)关于页面上的 web 代理,这地方我暂时想不明白到底怎么回事,我觉得关闭 web 代理,上传的速度可能会更快一些。

参考文章:
【1】.分享一下总结的rclone挂载百度网盘,迅雷网盘的博客
【2】.百度网盘官方linux+rclone定时转存脚本–解决你的百度网盘转存到onedrive或googledrive问题
【3】.非常规网盘研究 篇二:rclone+alist挂载百度网盘,天翼云盘等各种网盘为本地数据 建议选代理模式,如果是外网的话302跳转可以绕过服务器直接访问网盘,速度要更快也不占用alist服务器带宽。不过302跳转可能要设置请求header来适配各家网盘。
【4】.不过302跳转可能要设置请求header来适配各家网盘
【5】.rclone和alist挂载网盘当本地磁盘 这里有常见的 rclone 命令,还有开机启动的问题,最后也是用的这个里面的一些东西弄好的自己的配置,这里也是有部分不一样的,但是大部分还是可以参考的,这里也有rclone的很多参数信息可以查看
【6】.rclone和alist挂载网盘到本地 使用了 docker 部署了 alist 。使用二进制包安装了 rclone,通过 rclone config 配置了链接。挂载到本地,开机自动挂载,还有就是接触挂载。
【7】.最完整rclone挂载网盘到本地(Alist篇)解决方案 后台模式挂载到本地,将189Cloud挂载到本地目录/webdav。开机自动挂载 。

8.rclone移动

这里我测试了,如果一个文件很大,没有上传完成,在上传期间,那么使用 rclone 列举文件,就不会出现这个问题,等文件上传完成就可以查看到这个文件了。所以不会存在一个文件上传了一小部分,移动之后,就被删除的情况。

1
2
3
4
5
## 查看一级文件
./rclone --max-depth 1 ls oss:zjhjkj

## 同步成功后删除,排除截图目录
nohup /usr/local/rclone/rclone moveto -v oss:/zjhjkj/drone baidu:/zjhjkj/drone --exclude snapshot/ --fast-list --drive-acknowledge-abuse --s3-chunk-size 64M --checkers 32 --transfers 1 --timeout 120m --daemon --buffer-size=500M > /usr/local/rclone/logs/rclone_baidu.log 2>&1 &
参考文章:
【1】.rclone的基本用法 –max-backlog #N # 在 sync/copy/move 时使用,占用 N 倍 KB 内存;–bwlimit UP:DOWN # 上传下载限速,b|k|M|G
【2】.rclone_move命令行
【3】.rclone中文文档:常用命令大全

9.带宽

我遇到了一个问题,就是在前端运行的时候,上传速度可以跑满带宽,但是当我用 nohup 命令转到后台运行之后,就会导致带宽始终上不来。我为了解决这个问题,想了很多的办法。–bwlimit 10M:off 意味着将上传带宽限制为 10 MiB/s,下载带宽限制为 100 KiB/s。任一限制都可以“关闭”,意味着没有限制,因此只需限制您将使用的上传带宽。

后来我在运行脚本的地方,加了一个 –bwlimit off:off 参数,表示上传和下载都不限制,这才能使带宽跑满了。

1
2
3
4
5
# 这意味着,周一的传输带宽将设置为 512 KiB/s。周五结束前将升至 10 MiB/s。周六 10:00 将设置为 1 MiB/s。周日 20:00 起不限量。
--bwlimit "Mon-00:00,512 Fri-23:59,10M Sat-10:00,1M Sun-20:00,off"

# 传输带宽将在每天早上8点设置为512 KiB/s。中午,它将上升到10 MiB/s,并在下午1点回落到512 KiB/sec。在下午6点,带宽限制将被设置为30 MiB/s,在晚上11点,它将被完全禁用(全速)。 晚上11点和早上8点之间的任何东西都将保持无限。
--bwlimit "08:00,512k 12:00,10M 13:00,512k 18:00,30M 23:00,off"

比特/秒 ,实际上就是我们常说的带宽,比如家庭网是 10M 带宽,真正的传输速率就是 10M/8 = 1.25Mib/s ,也就是每秒传输 1.25M 的数据。

参考文章:
【1】.–bwlimit=BANDWIDTH_SPEC
【2】.rclone使用技巧 注意,单位是字节/秒,而不是比特/秒。通常情况下,连接是以比特/秒来衡量的–转换时要除以8。例如,假设你有一个10Mbit/s的连接,你希望rclone使用它的一半–5Mbit/s。这就是5/8 = 0.625 MiB/s,所以你要为rclone使用–bwlimit 0.625M参数。

10.过滤

如果你把任何规则以 / 结尾它只会匹配目录,如果以 / 开头,那么就是从根目录开始匹配。

1
2
# 过滤全部的 snapshot 目录,和以 kmz 文件结尾的文件
--exclude "snapshot/" --exclude "*.kmz"
参考文章:
【1】.rclone 过滤,包含和排除规则 这里是单星号。–exclude “/{.git,public,resources}/“,排除 .git、public 和 resources 文件夹
【2】.rclone sync exclude directory
【3】.过滤,包含和排除规则
【4】.如何使用rclonesync排除特定名称的子目录? 这里是双星号,–exclude **/test/** 排除名称包含 test 的子目录

11.同步到本地目录

问题

(1)Segmentation fault
使用脚本安装之后,直接无法启动,出现了 “段错误” 问题。

【解决方案】
我重新下载了 alist ,找了 alist-linux-amd64.tar.gz ,然后解压后上传到服务器,替换了自动脚本安装的 alist 程序,解决了这个问题。

(2) context deadline exceeded (Client.Timeout exceeded while awaiting headers) #2: Post “https://d.pcs.baidu.com/rest/2.0/pcs/superfile2
这个就是我上传650M文件的时候,出现了这个,我尝试了很多的方法,在网页上显示的错误。

【解决方案】
(1)后来我将上传线程数由 3 改为了 1,就可以完成上传了。

参考文章:
【1】.付费求alist百度网盘rclone挂载webdav可上传大文件方案 使用了超时时间:–transfers 1 –timeout 60m
【2】.百度网盘bug
【3】.SVIP百度网盘WebDAV无法播放

(3)405 Method Not Allowed (WebDAV)
在将使用rclone进行大文件传输的时候,就会出现这个问题,小于20M的文件就可以上传,但是大于 20M 的就无法上传了,真是不知道为什么了。

【尝试方法】
(1)将破解ua,由 pan.baidu.com,改为了:netdisk
(2)尝试新建一个 alist 用户,没有效果。
(3)降低 rclone 一次传输的文件数量,通过 –checkers 4 –transfers 4,限制一次只能传输 4 个文件,可是不行。
(4)尝试增加了 –multi-thread-streams 0 这个方法,还是不行
(5)尝试查看是不是文件路径过长,就算是短的名字,还是不行。

【解决方案】
这个是综合的解决方案
(1)需要设置 ua 为 pan.baidu.com

(2)为了保证正常传输,还需要合理的设置传输文件个数,rclone的 –transfers 需要设置为1

1
/usr/local/rclone/rclone copy -v oss:/hjkj-drone/drone baidu:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 64M --checkers 32 --transfers 1 --timeout 120m

(3)如果 alist 的刷新码过期了,也会出现这样的问题,解决方案就是重新扫码登录,获取新的刷新码,然后填上。

参考文章:
【1】.405 Method Not Allowed (WebDAV)
【2】.data/temp空间无限制,导致copy时磁盘占满出现405 Method Not Allowed 这里说是 data/temp 文件大小的限制
【3】.挂载Alist上传大文件报Method Not Allowed: 405 错误 这是onedrive/sharepoint WebDAV的限制,非alist bug。
【4】.Rclone搭建Webdav服务+Systemd保活+Nginx反代+CF加速一条龙 如果少了这一段部分应用用 POST 方法上传 js 和 png 等静态文件时 Nginx 那边会报 method not allowed: 405 错误。这一段配置是我自己摸爬滚打参考了无数博客试验出来的,貌似全网独一无二,网上主流的做法是加一段“error_page 405 =200 http://$host$request_uri;”这样的配置,但是这个配置加了之后我常用的一个可以同步 webdav 的同步软件 goodsync 会报奇怪的错误,所以也就是说主流的做法没卵用。
【5】.webdav连接失败,报405 method not allowded,求帮助 这里也没有解决这个问题,但是这里说的是新建一个用户,我尝试过了,不行。
【6】.云服务器 rclone挂载后上传大文件失败 自己研究出的解决办法: –multi-thread-streams 0,单线程 上传成功,默认4线程最后合并阶段出错
【7】.405 Method Not Allowed (WebDAV) 这里显示的问题是 文件名可能太长了,但是我尝试过了,好像不行。

(4)Not deleting source as copy failed: corrupted on transfer
当我用rclone进行传输的时候,结果报了这个错误,暂时不知道到底是cpolar的问题还是rclone的问题。也就说说文件传输失败了

【尝试方法】
(1)后来我用了cpolar的域名,结果出现错误:Failed to copy: multipart upload: failed to read source: unexpected EOF

(2)我尝试换了一个域名,用 nas.cpolar.cn 域名进行minio上传测试,使用 rclone 文件文件转移,结果就是小文件没有问题,但是一旦超过了3.5G,最后就会报错:corrupted on transfer, Not deleting source as copy failed: corrupted on transfer。传输中断,我尝试了很多次,都是这个样子。

(3)使用 minio 提供的 web 端进行传输,但是却可以传输 3.5G 的文体。通过查看 rclone 的传输日志,明明是3.5G的文件,最后传输了竟然是超过了 100%,达到了 156%,有 5.4G 文件。

【解决方案】
(1)升级版本从 1.66 升级到 1.67,没想到升级之后就可以了。
(2)如果还是不行,增加参数 –ignore-size 强制进行复制,但是这样做的后果我无法估计。还有一个参数就是 –ignore-checksum,这个参数也是忽略检查。

1
2
3
4
--ignore-case-sync                            Ignore case when synchronizing
--ignore-checksum Skip post copy check of checksums
--ignore-existing Skip all files that exist on destination
--ignore-size Ignore size when skipping use modtime or checksum
参考文章:
【1】.分布式文件存储系统minio、大文件分片传输 1、Promise对象;2、Blob对象和File 对象;3、FileReader函数;4、前端文件转MD5
【2】.rclone迁移客户数据进程中断 1.首先检查服务器网络连接,客户反馈无人进过机房,未曾有过网络连接失败的情况;2.检查服务器日志,cpu、内存和磁盘读写都正常;3.检查服务器日志,cpu、内存和磁盘读写都正常;4.排查发现遍历源目录的时间约为1天,怀疑是由于目录内的文件数量太多导致rclone进程down掉;
【3】.rclone怎么传一些文件老是有几个失败啊 拷贝到OneDrive报错 size differ,这是一个已知的微软的问题,在上传办公文件(word、xls等)和html文档的时候,OneDrive会偷偷修改文件大小,解决方法:拷贝完毕其他文件后确认只剩这些因为size differ报错而无法拷贝的文件了,则添加下述指令,–ignore-checksum –ignore-size,忽略文件检查指令,强制拷贝。
【4】.Rclone常见用法和问题解决办法 1.如果使用rclone出现corrupted on transfer: MD5 hash differ的错误提示,原因可能是rclone认为的文件的md5值与google drive提供的md5值不一样,解决办法就是加上 –ignore-checksum 参数。2.使用rclone进行google drive服务器之间拷贝方法,先把别人共享的文件夹点击右键,选择 添加到“我的云端硬盘”,这样你的15G的个人google drive就有了这个文件夹的快捷方式,然后使用命令rclone copy –transfers=100 –progress –stats-one-line –drive-server-side-across-configs 你刚刚保存的文件夹快捷方式: 你的无限网盘路径。3.如果发现拷贝不动了,但是有速度,说明你拷贝的数据量超过了google drive每天规定的750G上限,办法是换个gmail账户,然后在重复第二步,拷贝,重复的文件会自动忽略。。4.last error was: corrupted on transfer: sizes differ,出现上述错误,可以添加参数 –ignore-size
【5】.Rclone throwing error “corrupted on transfer: sizes differ” First try the same with the latest rclone version. You are using quite old one. 这里从 1.61.1 升级到 1.66.0 解决了这个问题。
【6】.Global Flags
【7】.rclone的基本用法 –s3-chunk-size 默认值 5M
【8】.rclone flag 这里有特别多的参数说明,可以作为查阅手册
【10】。rclone 工具使用及问题汇总 内核不支持插件问题;安装问题;rsync 传输错误;md5 校验错误;一致性问题;目录显示问题;windows 使用问题;缓存目录过大问题
【11】. Not deleting source as copy failed: corrupted on transfer: sizes differ 3761874597 vs 5368642250 这里通过升级版本解决了。
【12】.minio error Unexpected EOF for .metacache
【13】.-s3-chunk-size int option for S3 users 我的网络具有低延迟和良好的网络带宽,在这种用例中,为传输大文件制作太小的块(5M)无助于获得最佳性能。
【14】.Rclone文件传输设置禁止分段,不产生partial类型临时文件 如果没有–inplace(默认值),rclone将首先上传到一个扩展名如下的临时文件,其中XXXXXX表示一个随机字符串,.partial是–partial后缀值(默认值为.partial)。原始文件名。XXXXXX.部分(如果需要,rclone将通过截断原始文件名部分来确保最终名称不超过100个字符)。
上传完成后,rclone会将.partial文件重命名为正确的名称,覆盖此时的任何现有文件。如果上传失败,则.partial文件将被删除。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。