家庭网络
2014 年 6 月 15 日
建立一个Openwrt软件源的镜像
这篇文章介绍了为OpenWrt建立本地镜像的方法,以解决频繁更新固件导致软件不兼容的问题。作者提供了三个步骤:下载所有软件、搭建web服务和设置OpenWrt软件源。通过编写爬虫实现自动下载软件,并将所有软件保存到一个指定目录中。在搭建web服务后,通过设置OpenWrt软件源将本地镜像添加到OpenWrt软件包管理器中,从而使得用户可以从本地镜像中安装软件,无需频繁更新固件。
说明
Openwrt trunk版本更新实在太快了,我昨天刚刷最新的固件,今天安装软件时就提示不兼容了。没办法,只能升级到最新的固件来j兼容要装的软件了。
为装个软件而刷固件是在是太劳民伤财了!虽然系统有备份还原,但是刷机、装软件、还原这个过程还是要不少时间和精力。在网上搜了下,不少朋友都遇到同样的问题。看到有位朋友通过为Openwrt建立本地镜像的方法来解决:搭建一个openwrt的本地镜像,这真是个一劳永逸的解决方案!
实现
实现OpenWrt软件源镜像非常简单,大概分3步:
- 下载所有软件
- 搭建web服务
- 设置OpenWrt软件源
下载所有软件
由于Openwrt的软件实在太多,当然不可能一个个手动下载,我们可以写个爬虫来实现自动下载:
#!/usr/bin/env python
#coding=utf-8
#
# Openwrt Package Grabber
#
# Copyright (C) 2014 http://shuyz.com
#
import urllib2
import re
import os
# the url of package list page, end with "/"
baseurl = 'http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/'
# which directory to save all the packages, end with "/"
savedir = './download/'
if not os.path.exists(savedir):
os.makedirs(savedir)
print 'fetching package list from ' + baseurl
content = urllib2.urlopen(baseurl, timeout=15).read()
print 'packages list ok, analysing...'
pattern = r'<a href="(.*?)">'
items = re.findall(pattern, content)
cnt = 0
for item in items:
if item == '../':
continue
else:
cnt += 1
print 'downloading item %d: '%(cnt) + item
if os.path.isfile(savedir + item):
print 'file exists, ignored.'
else:
rfile = urllib2.urlopen(baseurl + item)
with open(savedir + item, "wb") as code:
code.write(rfile.read())
print 'done!'
我的路由器是WR703N,Openwrt官方源接近4000个应用,总共还不到300M。在Openshift上大概半个小时就全部下载完毕,速度还是比较快的。
搭建WEB服务
下载完成之后我们需要将整个目录部署成一个web应用,并开发文件列表,这样就可以作为镜像源使用了。这里使用nginx作为前端,并加载了
FancyIndex
模块,所以下面的列表比官方的要漂亮一些。更改软件源
最后将Openwrt的软件源地址设为这个镜像地址就行了,这样相当于将官方的trunk源freeze了一个版本。以后下载应用都是从这个源下载,再也不用当心官方源频繁升级带来的不兼容问题了。
如果有需要的话,你也可以添加我的软件源:http://robots.shuyz.com/openwrt/wr703n/2014-06-13/,软件源里包含WR703N 官方trunk源6/11所有的软件,共3965个。
参考资料
- 搭建一个openwrt的本地镜像打造成真正的AirPlay播放器](http://www.right.com.cn/forum/thread-115634-1-1.html)
本文为原创文章,未经允许请勿非法盗用资源。我们保护知识产权,尊重每一个创作者的劳动成果。如需转载,请务必注明出处并获得授权,谢谢合作!
作者:Lance | 发表日期:2014 年 6 月 15 日