家庭网络 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上大概半个小时就全部下载完毕,速度还是比较快的。
file list.PNG
file list.PNG

搭建WEB服务

下载完成之后我们需要将整个目录部署成一个web应用,并开发文件列表,这样就可以作为镜像源使用了。这里使用nginx作为前端,并加载了FancyIndex模块,所以下面的列表比官方的要漂亮一些。
package list.PNG
package list.PNG

更改软件源

最后将Openwrt的软件源地址设为这个镜像地址就行了,这样相当于将官方的trunk源freeze了一个版本。以后下载应用都是从这个源下载,再也不用当心官方源频繁升级带来的不兼容问题了。
opkg config.PNG
opkg config.PNG
如果有需要的话,你也可以添加我的软件源:http://robots.shuyz.com/openwrt/wr703n/2014-06-13/,软件源里包含WR703N 官方trunk源6/11所有的软件,共3965个。

参考资料