一种另类离线下载的思路(免费)(同时适用于 GIT 仓库克隆)

2017-04-15 13:23:43 +08:00
 codehz

我们知道国内好多提供离线下载的站都已经炸掉了,而且现有能用的支持离线下载的网盘也是限制很大。。。

百度云的限速就不提了。

我们也知道国内 github 的 clone 是比较蛋疼的事情,即使挂了梯子,对于比较大的仓库,比如动辄几个 G 的 linux 内核, Chromium 之类的,也不一定能一次性 clone 完毕(然而 git 不支持断点续传)

我最近想到了一个另类的方法,利用网络上现有的免费服务,为我们离线下载。。

先看看回传的速度(我这网速 20 兆)

这个速度还是可以接受的吧。。

方法就是利用各种提供 Docker 构建的云的构建服务,直接把需要的文件的下载方式写在 Dockerfile 里,然后就是启动构建,构建完成后直接下载最顶层的镜像即可。。。对于 git clone 来说,要么写子模块,要么直接写 git clone 命令

这个方法最大的优势就是免费,而且不违反任何能查阅到的 EULA/ToS ,而且,有些国内的构建平台有海外构建节点,用来 clone github 上的仓库是最适合不过的了。不过即使没有,我们还是可以直接使用 docker.io 的资源的:国内有一堆 docker 加速服务

缺陷就是速度比较慢——因为文件要经过好多节点才能到达目的地,先是海外构建节点,然后是国内的 regisity ,最后才是你的电脑。。。

至于如何下载 docker 的镜像,除了 docker pull 之外,还有很多选择——毕竟 docker 的协议是开放的,随便写一个客户端就可以获取到下载地址和 token...

PS :用来搞 BT 下载的就算了,好多海外机房是禁止 BT 的,出现问题可能导致服务商服务中断,到时候势必会对其他用户产生影响,我们要的是合理利用,不要竭泽而渔。。。

PPS :到时候我搞一个自动化工具来做这个。。

6541 次点击
所在节点    程序员
43 条回复
Miy4mori
2017-04-15 23:13:22 +08:00
download zip 不可以?除了 release 中的源码,我记得整个仓库也可以 download zip 的
codehz
2017-04-15 23:29:19 +08:00
@Miy4mori 坑爹的是 download zip 也是不支持断点续传的——甚至连 HEAD 请求查询大小都不行。。。
ryd994
2017-04-15 23:32:46 +08:00
@codehz 薅羊毛这么理直气壮也是少见
Interfere with other users' enjoyment of the Service
自己用用可能没啥,写成教程人多了以后,对其他人不是影响么?
git clone 或者 wget 源码,那些都是为了 build ,而且一般是 shallow clone ,而且特别大的源码 build 完会删除
ryd994
2017-04-15 23:35:38 +08:00
@codehz By way of example, and not as a limitation,
你用例子里面没出现来说明你的行为合理,根本站不住脚
proper 不 proper ,取决于 common sense 。语言的意义,本来就取决于大多数人的理解。你看看楼下多少说不妥,多少说妥,就知道怎么样是 proper 了
linhua
2017-04-15 23:36:11 +08:00
@codehz
用代理 clone 时, 设置 iptables 丢弃 TCP RST 包,会不会好一点
ryd994
2017-04-15 23:38:22 +08:00
git 可以先 shallow clone 再 unshallow ,只要有一层 clone 下来了,断掉的可以继续 fetch 补全
codehz
2017-04-16 00:05:25 +08:00
@ryd994 build 完删除并不代表不会占用存储空间—— docker 机制保证了每一个 RUN 命令都会创建一个独立的镜像, PULL 时,即使完全删除,也要拉取一遍
利用 docker 的服务下载开发用到的源码,完全合理合法;用来下载电影,当然不合法,所以我发送的节点是程序员节点。。有些人就是逆向 XXXX :外国人这么用就合理的;中国人用就是不合适,不恰当的。
你说我举得例子不恰当,那我就举几个具体的例子:
runmymind/docker-android-sdk :内容就是自动下载一堆 android sdk ,大小 5.4G
opengenomics/nci-downloader: 下载一个大文件,解压
qlik/gradle: 直接下载 gradle 的包——并不能直接跑
topfdrummer/minecraft: 直接下载 minecraft 服务端
部分镜像的拉取量超过 10M+,如果有问题,官方早就处理了
如果你认为下载过程不恰当,那么请问那些镜像是准备放着不拉取的吗?
显然我觉得不恰当的地方恐怕是这个标题了——如果说用 docker 来搭建开发环境,估计就没这么多反对——然而,仔细想想,对于程序员而言,排除了违法内容后,这两者有什么区别吗?
codehz
2017-04-16 00:09:26 +08:00
@ryd994 看前面的楼层,我已经测试了--depth 1 的拉取,效果并不是很明显——我这里网络环境并不能一次性下载 500MB 以上的内容,无论有没有梯子都这样,可能采取一些奇怪的措施能够加强稳定性吧。--depth 1 仍然不能中断
codehz
2017-04-16 00:41:09 +08:00
@linhua 然而我是 windows 党😂, WSL 不支持 iptables ,另外其实 docker 也是不支持的,我是直接开放 api 导出下载地址的。为啥不双系统呢?原因是 windows 是目前 linux 最好的发行版。。。 wsl 编译安卓内核毫无压力,所以我就用了。。。

另外我发现网络不稳定这个东西应该和丢包率有关系,我玩游戏的时候几乎没啥影响,因为流量不大,延迟也不高。然后下载的时候,流量大,持续时间长,这样就出现各种丢包,延迟;届时 PING baidu.com 都会有 50%以上的丢包率,而且当持续流量结束以后,并不是马上就能恢复的。。。检查应该不是路由器的问题(之前路由器出现过被高并发发包打死的情况,后来我买了个贵的就好了),因为直接连接网线我也试过了。。。这意味着单纯丢弃 RST 包并不会有啥效果。。。总感觉我这网络是被 QoS 什么的干掉了。
amd00
2017-04-16 00:59:15 +08:00
@codehz 如果大流量之后连百度都丢包成这样为何不去找你的运营商问题呢
youling
2017-04-16 02:22:52 +08:00
感谢楼主分享!
dongoo
2017-04-16 02:26:57 +08:00
说通过 docker 下载是滥用的?那请问用百度网盘离线下载的时候,算不算滥用网盘了?难道百度网盘理所当然给你下载了?

虽然这种行为可能导致 docker 本身没得用,但是这个行为本身有什么问题?
codehz
2017-04-16 02:37:47 +08:00
@amd00 学校的网络,大家都这样。。。。别人用另一个运营商也是这个样子, QoS 应该是在学校那边的,跟学校反应半天也没个下文。。不过大多数地址都可以断点续传,所以一般也感觉不出来。。。而且流量不大的话,长连接也可以保持很久,大概这种情况很难得到有关领导的重视吧。。。。
dongoo
2017-04-16 02:40:56 +08:00
另外到时 docker 公司完全也可以搞限速,搞会员来解决。

说滥用的,只是自己没这样做,担心未来免费服务的常规使用也不能使用了而已,防止滥用这不是服务商自己应该解决的问题吗?大不了你倒闭呗。
msg7086
2017-04-16 04:27:46 +08:00
让我想起了之前用 Github Issues 做回复插件的帖子了。

作者问了 Github 能不能这么用。

Github: 吼啊,资辞!

V2 回帖者: 滚,这是滥用!喷死你丫的!
FrankHB
2017-04-16 06:05:08 +08:00
@ryd994 你的解释大概也不符合 common sense :无关人等解读 ToS 对当事人毫无卵用,不管是道德上还是法律上的。显然你无法就是否 proper 这个话题直接实现替代一般 users 进行价值判断,因为度量 proper 的因素不都是你能确定的,能纠结是否 proper 的绝大多数脑子长在别人脑袋里,你没法飞线过去确认或改变主张。当然,也可以强调事实判断来代替这个缺陷,比如当你确实就是这里所说的 user 之一的时候;不过,要是你当真主张取决于“大多数人的理解”,反而可能就不那么好办了。
phrack
2017-04-16 12:19:03 +08:00
讨论的挺热烈。

docker 本身并没有禁止这个做法,国内提供加速的公司也没有禁止,如果是用来加速 github repo 的下载甚至是值得欣赏的一个小作品,技术本身没有任何问题。这个思路我以前也有过,但是因为 git 更好用,我存文件有时候就加密放到 github 或者国内的某些 git 服务商那里的。

但是技术可能会被滥用,所以我前面讲某些吸血国人并不是针对你,如果 offend 到了你的感受,我表示抱歉。而是讲,如果你放出脚本,被人用来加速,比如,下载视频,进行非法文件共享,就会产生恶。这里其实应该是服务商的一个逻辑漏洞。

通过漏洞进行无害利用,没什么,但是确实我们应该做的是上报漏洞,向服务商提出这种可能导致滥用的漏洞。

实际上这种漏洞可能无法防范。比如微信照嫖的是违法的,当然也违反了微信的本意,这也是微信不能控制的逻辑漏洞。

杀人不能诛心,我并没有看到 lz 并没有任何不良行为,所以我不会说你就是坏人。我前面气氛的是,你的脚本,一旦放出,很可能就会被利用到滥用,比如被人存小黄片然后分享,最后国内服务商不提供加速了,跟百度云一样来搞限速,搞审查。这样很多正常使用 docker 的人就会发现,为什么这么好的一项服务又要限速搞会员了。
codehz
2017-04-16 12:47:34 +08:00
@phrack 我本来打算放出的是获取镜像下载地址的工具,而非完全自动化的构造 Dockerfile 自动上传,自动触发构建什么的——获取镜像下载地址并非完全只有为了下载,也可以是在 Windows Subsystem for Linux 上获取特定镜像并运行( WSL 不支持完整 Linux 的各种 namespace , 因此不能运行 docker ,不过我测试大部分镜像都是可以在解压后加一个 chroot 就可以跑的,如果不考虑 overlay 文件系统和各种隔离的问题的话),但是听你这么一说,原本两个看似毫无关系的东西放在一起,就可以造成很大的影响了。。。所以我在考虑是否值得发布这个的工具。。。
codehz
2017-04-16 12:50:12 +08:00
利用工具获取到的链接并不能直接访问,而是需要携带特定的验证信息,对于一般用户而言,具有一定的使用门槛,从这个角度来说,下载地址被普通用户滥用的可能性还是比较低的。。。
phrack
2017-04-16 13:15:19 +08:00
@codehz 就像我前面说了,技术是没有错的,技术是没有主观意见的。如果被滥用,那是人的问题,这不是我们要不要开放源代码考虑的问题。

很多开源项目都被滥用,比如 chroium ,被某几个公司,改一改就直接标为自己的知识产权,一点不提 chroium 的贡献。 chroium 总不能因为这个就闭源了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355056

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX