1 总体结构

linux下用的比较多的下载机软件是Aria2,进行配置后结合YAAW就可以进行下载操作了。书上关于Aria2的内容很短,我打算把其他一些内容加进来构成一个稍微完整些的远程下载机:配置U盘的自动挂载,让Aria2以U盘作为存储设备,最后使用动态域名解析软件实现远程管理。

2 Aria2配置

输入sudo apt-get install aria2 安装Aria2, 然后可以下载和Aria2配套的YAAW网页进行可视化操作,下载YAAW前首先需要运行Apache或者Nginx等web服务器,毕竟没有web服务器也就没法运行网页。

输入sudo apt-get install apache2 安装Apache2,一般要对Apache2进行配置的话主要是修改/etc/apache2/ports.conf和/etc/apache2/sites-available/default,前者可以修改默认的80端口,后者可以修改web站点的主目录,一般也不用改了。然后就可以下载YAAW页面了,输入cd /var/www/html 进入web站点主目录,输入git clone https://github.com/binux/yaaw 下载文件,完成后打开浏览器输入YAAW的地址“http://192.168.1.17/yaaw”,可以看到YAAW页面。

虽然打开了web前端,但是显示着红色的”Error: Internal server errror”,我们还需要进行Aria2的配置。首先新建一个配置文件sudo touch /etc/aria2.conf ,编辑内容:

dir=/mnt/usb_flash/aria2_download
disable-ipv6=true
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
rpc-listen-port=6800
continue=true
input-file=/mnt/usb_flash/aria2_download/.aria2.session
save-session=/mnt/usb_flash/aria2_download/.aria2.session
max-concurrent-downloads=3

这里面的“dir”配置项是下载机的存储路径,我新建了一个“/mnt/usb_flash”路径,并且需要把U盘挂载到上面。插上U盘,输入sudo fdisk -l 查看当前存储设备信息,

这里的sda就是分配给U盘的默认设备名。执行sudo mount -o uid=pi,gid=pi /dev/sda /mnt/usb_flash 进行挂载,之后查看usb_flash的话就可以看到U盘里的内容了,然后在usb_flash路径下新建aria2_download目录和.aria2.session文件。测试一下Aria2是否配置成功,执行aria2c --conf-path=/etc/aria2.conf ,如果没有错误信息出现的话按下ctrl+c退出。

最后创建aria2c,将Arai2做成系统服务从而可以自启动。新建“/etc/init.d/aria2c”,编辑内容:

#!/bin/bash
case "$1" in
start)
echo -n "starting aria2c"
aria2c --conf-path=/etc/aria2.conf -D
;;
stop)
echo -n "Shutting down aria2c"
killall aria2c
;;
restart)
echo -n "restart aria2c"
killall aria2c
aria2c --conf-path=/etc/aria2.conf -D
;;
esac
exit

不要忘了给这个文件赋上操作权限,然后执行sudo /etc/init.d/aria2c start 开启aria2c,执行sudo insserv aria2c 将其添加到自启动项。现在再打开YAAW页面,应该没有错误提示了。

3 动态域名

为了实现远程管理,需要动态域名解析或者内网穿透,从而可以从外网登陆YAAW页面。我看了网上的资料,要实现从外网访问内网的功能,大概有这么几种方法:
①用花生壳之类的动态域名解析软件,方便直接,但是花生壳现在的价格有点贵;
②直接在网关上设置个端口映射,但是网关的IP必须是公网IP,这个好像不太现实;
③Ngrok+VPS实现内网穿透,自己搭建动态域名解析系统,这个对我来说太复杂,而且也需要购买一个VPS。

综上,还是用现成的动态域名解析软件最方便,不过花生壳的价格太高,对我这种用来测试、尝试的太不划算了,这里我用了另一个软件,nat123,它的价格挺低的,一般充个二三十块就行了,当然性能和服务可能就没有花生壳好了。

首先得去nat123的官网注册个账号,可能得先充个钱,然后在“端口映射列表”中添加一条映射。

然后需要在树莓派中安装nat123客户端,nat123的官网中有详细的安装教程。首先需要安装mono,用mono可以在linux平台上运行.NET程序。执行sudo apt-get install mono-complete 安装mono。然后安装nat123客户端,新建一个nat123目录,执行sudo wget http://www.nat123.com/down/nat123linux.tar.gz 安装nat123程序,然后执行sudo tar -zxvf nat123linux.tar.gz 解压。执行sudo mono nat123linux.sh ,输入用户名和密码:

这样就启动了客户端,按下”x”退出。

当然可以后台启动,执行sudo mono nat123linux.sh service& ,出现“nat123 service is running”表示运行成功,现在可以用手机测试一下,从4G网登陆映射的域名来访问内网的YAAW。

4 U盘自动挂载

虽然把Aria2设置成开机自启动,同时将存储目录指定到U盘上,但是现在U盘要手动挂载,重启树莓派后U盘是不会自动挂载到指定的“/mnt/usb_flash”上的,所以Aria2找不到存储路径,运行失败,因此需要设置U盘的自动挂载。

有两种方法进行自动挂载设置,一种是修改/etc/fstab,这样可以实现开机时自动挂载,但是无法实现随时拔插时的挂载卸载,而且我试验的时候发现如果不把U盘插上的话无法开机;另一种方法是在/etc/udev/rules.d中添加规则文件,这种方法更加安全有效。

udev 是 Linux内核里的一个功能,是 Linux 默认的设备管理工具。udev一方面对设备进行动态管理,当设备添加 、删除时,udev 的守护进程侦听来自内核的uevent,以此添加或者删除 /dev下的设备文件;另一方面它会自动读取规则文件,在发生uevent的时候进行相关操作,在默认的规则文件下,udev 在 /dev/里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd等等。下图是udev的工作流程图:

根据这个流程,我们可以在udev的规则目录下添加新的规则文件,这就好像是添加一个事件处理方法,当发生设备添加或删除的“事件”时调用这个方法。

udev 里的规则文件默认存放在 “/etc/udev/rules.d”下,所有的规则文件必须以“.rules”为后缀名,udev 按照规则文件名的字母顺序来查询全部规则文件,然后为匹配规则的设备管理其设备文件或文件链接。通常情况下,建议让自己想要的规则文件最先被解析,比如,创建一个名为“/etc/udev/rules.d/10-myrule.rules” 的文件,并把你的规则写入该文件,文件名里的数字越小, udev 越先解析到你的文件。而关于规则的语法,可以查询相关资料(我主要参考https://www.ibm.com/developerworks/cn/linux/l-cn-udev/)。

新建“/etc/udev/rules.d/10-usbstorage.rules”,编辑设备规则,我在网上查到的关于树莓派自动挂载的规则代码几乎都是同一篇,虽然那代码很全面,不过有点长,我觉得可以写的更简单一点,下面是我写的规则:

#如果内核设备名不是sd*,说明不是磁盘或U盘设备,就跳到"END_HERE",结束规则检查
KERNEL != "sd*", GOTO="END_HERE"
SUBSYSTEM != "block", GOTO="END_HERE"
#用IMPORT语句执行blkid语句,读取设备信息,并将信息存储到各个环境变量
IMPORT{program}="/sbin/blkid -o udev -p %N"
#通过判断UUID是否为8C0F-39CA,格式是否为Fat32,唯一指定我自己的那个U盘
ENV{ID_FS_TYPE} != "vfat", ENV{ID_FS_UUID != "8C0F-39CA"}, GOTO="END_HERE"
#设定挂载操作mount的选项
ENV{ID_FS_TYPE} == "vfat", ENV{mount_options} = "uid=pi,gid=pi,iocharset=utf8,umask=000"
#如果是新增设备,就执行挂载操作,这里的%k表示引用默认的内核设备名称
ACTION=="add", RUN+="/bin/mount -o $env{mount_options} /dev/%k /mnt/usb_flash"
#如果是删除设备,就执行卸载操作
ACTION=="remove", RUN+="/bin/umount -l /mnt/usb_flash"
LABEL="END_HERE"

在上面的规则中,我通过ID_FS_TYPE和ID_FS_UUID这两个环境变量唯一指定了我的一个U盘,ID_FS_TYPE是文件系统类型,一般U盘是FAT32;ID_FS_UUID是设备UUID,这个号可以在插入U盘后执行sudo blkid 查看。配置完成后,输入sudo /etc/init.d/udev rrestart 重启udev服务,这样就可以实现U盘的自动挂载和卸载了,而且可以开机时也能进行这些操作。

5 下载测试

重新启动树莓派(开机前已经插上U盘),可以看到usb_flash下已经挂载了U盘,接着输入ps -ef | grep aria2,可以看到aria2服务已经成功启动了,在浏览器上打开YAAW页面,应该没有报错了,点击“Add”添加一个下载任务,直接下载到U盘。

虽然运行成功了,不过使用起来不是太理想啊,有些下载任务根本启动不了,而且启动过程中动不动就显示“Error: Internal server errror”信息,具体的报错原因估计还得研究研究它的日志文件。