说明

Openwrt trunk版本更新实在太快了,我昨天刚刷最新的固件,今天安装软件时就提示不兼容了。没办法,只能升级到最新的固件来j兼容要装的软件了。

为装个软件而刷固件是在是太劳民伤财了!虽然系统有备份还原,但是刷机、装软件、还原这个过程还是要不少时间和精力。在网上搜了下,不少朋友都遇到同样的问题。看到有位朋友通过为Openwrt建立本地镜像的方法来解决:,这真是个一劳永逸的解决方案!

实现

实现OpenWrt软件源镜像非常简单,大概分3步:

  • 下载所有软件
  • 搭建web服务
  • 设置OpenWrt软件源

下载所有软件

由于Openwrt的软件实在太多,当然不可能一个个手动下载,我们可以写个爬虫来实现自动下载:

#!/usr/bin/env python  
#coding=utf-8
#  
# Openwrt Package Grabber  
#  
# Copyright (C) 2014    
#     

import urllib2 
import re
import os

# the url of package list page, end with "/"
baseurl = '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''
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上大概半个小时就全部下载完毕,速度还是比较快的。

%20list.PNG

搭建WEB服务

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

%20list.PNG

更改软件源

最后将Openwrt软件源地址设为这个镜像地址就行了,这样相当于将官方的trunk源freeze了一个版本。以后下载应用都是从这个源下载,再也不用当心官方源频繁升级带来的不兼容问题了。