本教程主要包括两部分内容,第一部分是如何快捷的安装OpenWRT应用,第二部分是如何大量的安装应用而不用担心空间不足的问题。教程的最后有一个简单的视频监控服务器的示例。注意,本教程需要root后,ssh登录路由器后进行操作。
大家都知道newifi是基于OpenWRT开发的,其基础编译环境,内核,C库,包管理器都有OpenWRT的影子。那么,能不能直接使用OpenWRT的包管理器opkg在线安装应用呢?答案是可以的,只要配置好软件源即可。opkg包管理器的软件源设置可以通过修改/etc/opkg.conf文件。
root@newifi:/etc# cat opkg.conf src/gz PandoraBox http://downloads.openwrt.org.cn/PandoraBox/ralink/mt7620/packages dest root /mnt/sda4/newifi_app dest ram /tmp lists_dir ext /var/opkg-lists
简单说明一下,上述的配置内容使用http://downloads.openwrt.org.cn/PandoraBox/ralink/mt7620/packages下的软件版本,这个软件源路径下的软件可以直接安装。当然,理论上也可以直接使用openwrt官网的软件源,比如 http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/,但需要修改arch参数。这个没有研究过,有懂的同学欢迎指点。
另外上面的配置还有一个修改的地方是安装目录,也就是”dest root /mnt/sda4/newifi_app”这句。很明显,我把新安装的软件都转到了外置U盘或硬盘中。这么做的原因是,newifi mini本身的存储空间太小。看看我的路由器剩余空间,只有可怜的几M,稍微装几个大一点的软件,就纠结了。
root@newifi:~# df -h Filesystem Size Used Available Use% Mounted on rootfs 3.8M 668.0K 3.2M 17% / /dev/root 11.0M 11.0M 0 100% /rom tmpfs 61.9M 728.0K 61.2M 1% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock7 3.8M 668.0K 3.2M 17% /overlay overlayfs:/overlay 3.8M 668.0K 3.2M 17% / /dev/sda4 7.5G 93.6M 7.4G 1% /mnt/sda4
所以,大家可能需要修改一个opkg.conf文件,按照你们自己的情况,要么改为下面的,安装在路由器内部的flash中。
dest root /
要么按照上面的思路改为外部存储器,需要注意具体的路径可能不是/mnt/sda4,需要按照时间挂在的路径进行配置。
这个时候就可以安装应用了,比如安装一个动作检测视频监控程序motion,那么执行
opkg install motion
不幸的是,会提示不满足libc库的依赖。其实没关系,libc库是可用的,我们需要做的就是绕过去,强行安装,执行
opkg install motion --nodeps
这种方法并不好,毕竟包管理器最主要的功能就是自动安装依赖包。这样就必须手动的一点点安装所有依赖包。但是没办法,毕竟的hack,有点问题是正常的,继续分析解决嘛。
安装完成后,在/mnt/sda4/newifi_app下就是看到/usr/bin/motion和其他相关文件了。由于安装的路径不是正常软件的路径,会到只库文件,配置文件或可执行文件无法找到情况发生,这是由于环境变量的设置问题。这里有两种解决办法,一种是修改环境变化,一种是建立软连接将安装路径下的所有文件软连接到根目录下对应目录中。这里使用方法二,并提供一个简单脚本install.sh,用于快速创建软连接。脚本功能很简单,将脚本所有目录的usr/bin、usr/lib、etc的所有文件都映射到根下的应用目录中。这样就相当于把软件安装到正常的路径下,而对flash的空间占用非常非常小。
vim /mnt/sda4/newifi_app/install.sh
#!/bin/sh create_link() { source=1 target_dir="/2" filename=`basename 1` echo "ln -sfsource {target_dir}/{filename}" ln -sf source{target_dir}/{filename} } for dir in etc usr/bin usr/lib;do findPWD/dir -maxdepth 1 -type f -o -type l|while read f;do create_linkf $dir done done
上面的步骤执行成功后,在终端摄入motion -n前台运行motion软件就能看到软件可以正常启动了。当然由于路由器唯一的U口插了U盘或移动硬盘,还没有插摄像头,所以motion还不能正常工作。这是需要找一个USB HUB来,将USB口扩展一下。需要注意的是,使用USB HUB扩展后可能会导致单个USB口功率不做,所以建议使用USB摄像头+U盘的组合,而不要使用移动硬盘。在此,我需要明确的赞一下newifi的软件开发人员,他们没有裁剪kernel驱动,不像某米路由,只有一个U盘驱动。
motion配置成功后,可以通过浏览器查看实时视频。浏览器的地址是路由IP,端口通过/etc/motion.conf配置文件配置。有感兴趣的可以看一下这个配置文件,其注释信息非常全面。
最后,介绍一下一个内网web服务器映射到外网的方法。使用localtunnel.me提供的数据通道。localtunnel.me使用nodejs开发,需要node解释器,在网上找到一个(见附件),或自行下载:http://pan.baidu.com/s/1pJ6XXF1 。解压缩出来的文件node放在/mnt/sda4/newifi_app/usr/bin下,libuClibc++.so.0文件放在/mnt/sda4/newifi_app/usr/lib下, 并使用install.sh脚本建立对应的软连接。现在,node环境是可用的了,执行node命令看看是否可以进入node的交互开发环境中,如果出现>,就表示OK了。
由于在路由器环境中没有npm工具(nodejs的包管理器),所有需要在一台安装有nodejs的linux PC下的执行npm install localtunnel,并把下载下来的localtunnel目录拷贝到路由器里。附件中也包含了已经下载的localtunnel软件。
这是,使用node执行localtunnel软件,就能在外网的环境下注册一个域名地址,并通过外网访问路由器上的web服务了。比如这样:
root@newifi:/mnt/sda4/newifi_app# /usr/bin/node localtunnel/bin/client --port=8881 your url is: https://rxtnzrqdxe.localtunnel.me
这条命令的意思是,启动一个映射程序,将本地8881端口的web服务器映射到外网,如果映射成功,localtunnel.me会返回一个包含随机的的子域名的完整地址,上例的子域名是rxtnzrqdxe。当然,你也可以通过 –subdomain参数制定你自己期望的子域名。在我的路由器中8881端口是motion程序的WEB实时视频流,在我把这个web服务映射到外网后,就可以在通过访问地址https://rxtnzrqdxe.localtunnel.me来看到家里的实时视频了。
这里有一篇localtunnel.me原理分析的博客,感兴趣的可以研究一下。
http://blog.csdn.net/jt6562/article/details/41986447