alwaystest / Blog

24 stars 2 forks source link

树莓派Docker运行Aria2引发的一系列折腾 #46

Open alwaystest opened 7 years ago

alwaystest commented 7 years ago

树莓派Docker运行Aria2引发的一系列折腾

标签(空格分隔): 树莓派 RaspberryPi Docker Aria2 电信 UPNP NAT E-140W-P


这段时间用树莓派用的有点烦,因为之前用的wheezy,软件源里面好多软件都很旧了,搭建的 Aria2下载器是自己编译过的新版,最近想到树莓派上折腾Docker,发现需要升级升级系统到jessie,本来想无痛升级,使用rpi-update这个命令,参考这里的文章。但是发现升级完还是wheezy的系统, 难道是我没有理解内核和固件这两个名词?固件不是系统吗?求指教。

rpi-update不管用了,果断格式化重刷系统。心疼我下载的权利的游戏第六季一秒钟。

Win10的系统好像已经不能使用win32diskimager这个软件来烧录SD卡了,我这里打开报了一个错,但是还能开始运行,烧录到一半软件崩溃掉了。幸亏我还有一个万能PE,进入PE里面的便携版Linux系统,dd命令完事。

我的树莓派的用途列个清单:

  1. Python脚本自动签到两个论坛
  2. Aria2自动下载 前端yaaw和web-ui都有
  3. Samba文件共享

嗯,没别的了。虽然之前在树莓派上搭建过dnsmasq+ss-redir,但是感觉不是 很稳定,现在已经把方案放到路由器上实现了,用的是小米路由器MINI版刷机。系统用的改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件(百度云同步 aria2 QOS)的。

刷了新系统,第一时间上Docker。一行命令即可,没麻烦。

https://get.docker.com/

然后就开始了漫漫的寻找镜像的路。我就是这么懒。然而最后还是被逼着自己写了Dockerfile。

中间有看到别人使用docker-compose来管理容器,跟风也想来一个。

pip install docker-compose

然而安装了到现在也没有用上,我居然写了一个Makefile来启动和运行容器你敢信?当然没有实现根据依赖启动容器的功能,还是一个一个手动起,但是起码省了打那么长的命令。

先来一个Samba的镜像dastrasmue/rpi-samba,注意,拉取镜像应该使用docker pull dastrasmue/rpi-samba:v3而不是latest

中间有一个细节需要注意的是DockerHub上好多Samba镜像启动之后都会直接退出,如果run的时候加了--restart=always,就会表现为容器一直是Restarting的状态。

charlesmknox/rpi-samba修复了这个问题,dastrasmue/rpi-samba接受了charlesmknox的PR,所以dastrasmue/rpi-samba:v3镜像没有这个问题了。

Samba如果使用Guest访问文件夹,是不能删除里面的文件的,我是自己用,所以添加了用户pi,这样windows就可以直接删除看过的美剧了。具体Samba下的用户是怎么添加的,这里就不深究了,能用就行。

Makefile:

.PHONY: run
.SUFFIXES:

BUILD_IMAGE := dastrasmue/rpi-samba:v3

run:
        docker run --restart always \
  -v /home/pi/Downloads:/share \
  -p 137:137/udp \
  -p 138:138/udp \
  -p 139:139 \
  -p 445:445 \
  -p 445:445/udp \
  --name samba -d $(BUILD_IMAGE) \
  -u "pi:pi" \
  -s "share:/share:rw:pi"

default: run

接下来是yaaw和web-ui,随便找一个arm的nginx,配置一下然后把yaaw和web-ui的文件夹映射进去就好了。

最后是最麻烦的Aria2。没有找到现有的可用镜像,看到Aria2项目下面有交叉编译的Dockerfile,编译出来用了两天发现没有支持HTTPS。然后又自己搞了半天,终于发现github.com/q3aql有提供编译好的二进制文件,还开源了编译脚本,于是我按照编译脚本写了一份Docker交叉编译的Dockerfile,中间也踩了不少坑,主要是没有弄明白Makefile里面CCCXX这两个变量怎么在Dockerfile里面alias,最后使用Dockerfile里面ENV解决了这个问题。其实还是抄了cxjava.发现我在编译这方面还差很远,autoconf,configure,Makefile都没有理解,只是生搬硬套,没有人带这方面,只有自己碰墙。最终编译出来的二进制文件达到了70+M,比q3aql的大多了。最终还是使用了q3aql编译的文件。好处是初步摸索了一下交叉编译,还蛮有意思的,比树莓派自己编译快多了。前提是得先有台性能不错的VPS。

交叉编译的Dockerfile在这里。还有待改进。

rpi-aria2 Dockerfile(不能直接使用的,先看懂这个Dockerfile干了什么再用):

FROM resin/rpi-raspbian
WORKDIR /root/

COPY aria2c /usr/local/bin

EXPOSE 6800
CMD set -xe \
    && aria2c --conf-path=/etc/aria2/aria2.conf

Makefile:

.PHONY: build run
.SUFFIXES:

BUILD_IMAGE := aria2-rpi

build:
        docker build -t $(BUILD_IMAGE) .

run:
        docker run --restart always -v /home/pi/Downloads:/root -v /home/pi/Downloads/Docker/aria2:/etc/aria2 -p 65298:65298 -p 6800:6800 --name aria2 -d $(BUILD_IMAGE)

default: build

注意:65298端口是我设置BT下载的端口,配置不同,这个端口应该是需要变的。

注: Docker中搞了Aria2之后,下载有时候会出现文件分配 失败导致下载失败的情况,不论我的配置是file-allocation=falloc还是file-allocation=prealloc,目前还不知道是Aria2的BUG还是Docker不兼容的问题,或者是我把一个目录映射给了两个容器造成了这种情况。

上面的工作都完成以后,百度云离线好然后使用Chrome插件导出到Aria2下载是没有问题的了,下载HTTPS也不再是问题。

但是我突然发现我的树莓派好久没有成功下载过磁力链接的文件了。

一个是前两天360云盘关闭个人服务,我觉得百度云可能也撑不了太长时间,一个是百度云分享的连接,好多因为时间长了, 链接无效了。这种情况就需要用磁链下载了。

我的简单理解,磁链下载是BT下载的一个升级版本,避开了BT下载需要Tracker服务器的弱点。

查看Aria2的配置文件还是抄的别人的,发现里面有设置DHT端口,于是感觉应该和这个端口有关系,于是首先从容器把端口映射出来,然后再在上级路由做NAT。

NAT可以选择性的把局域网内部服务器的端口暴露 给上级网络,感觉和Docker容器的端口映射是一码事。而且好像还都是靠iptables来实现的。

UPNP需要软件支持,可以理解为一个自动化的NAT,由软件和开启了UPNP的路由器去协商。

第一我使用的网络情况比较复杂,首先是电信接进来一个E-140W-P型号的光猫,光猫拨号,然后下级接自己的路由器,路由器使用动态IP模式,实际上最好是配置IP地址与MAC绑定,防止手动配置的NAT规则失效。UPNP无法在多级路由器之间传递。我居然会从百度贴吧做引用,也是不够严谨。

第二Aria2不支持UPNP

所以我还是手动配置NAT规则吧。

坑爹的是现在电信送的光猫只给用户开放普通管理账号,基本上什么都不能做。网上有这个型号的路由器拆解,然后外接TTL线,使用Telnet连接进去查看超级管理员密码的,但是太麻烦了,还得自己买装备,一个手贱还有可能搞坏光猫,所以我们采用广为流传的第二种方法,找电信的维修人员问。我们可以美其名曰社工(社会工程学)。其实我觉得管理自己的路由器是我们的权利来着,电信没理由不开放超级管理员账户给用户。

拿到超级管理员账号以后,就可以配置NAT啦,把一路上的路由器的65298端口全部NAT之后,Aria2总算可以下载磁链啦。

E-140W-P有QOS功能,我简单的配置了一下,本来想着优先把游戏的UDP包发出去,这样下载美剧就不会影响别人LOL了,最后发现还不如不配呢。。还是我太菜, 驾驭不了这玩意。

E-140W-P使用超级管理员账号开启Telnet的方法在这里

为什么需要Telnet呢?

我配置完NAT的时候不确定有没有效果,于是把小米路由器的管理界面设为外网可以访问,然后在光猫做NAT(小米路由器是是光猫的下级路由),然后在我的电脑尝试访问光猫的公网地址:端口(我的电脑连在小米路由器上),看能不能打开小米路由器的管理界面,但是发现一直是连接超时,而访问其他端口,则提示连接被拒绝,我也搞不懂这个NAT是设置好没有,想起来前同事玩的一手好SHELL,曾经徒手tcpdump抓出了服务器的病毒,于是也连到路由器里面玩,tcpdump监听公网端口,发现我的电脑访问公网IP:端口的时候,光猫那里并没有收到包。于是我开始怀疑是不是从内部访问的时候被路由规则扔掉了,于是手机开流量访问,成功。看来还真是处在内网的原因。

具体是路由怎么把包搞丢了,我现在就不追究了。理论上讲,使用tcpdump也是可以搞得定的,可是我还要去下载行尸走肉呐。

m3744 commented 7 years ago

謝謝你,你的這篇幫助很大,樹莓還是比banana pi靠譜阿。

yangxuan8282 commented 7 years ago

多谢分享,按照博主的提供的编译文件链接写了个 Dockerfile push 到 docker hub 上了:yangxuan8282/rpi-alpine-aria2

基于 alpine,大概 9MB,准备再基于此把 yaaw,webui-aria2 放进容器