openwrt固件获取、编译与安装

openwrt固件获取、编译与安装

参考

在linux下修改编译网件WNDR3700v4的Openwrt固件
Archlinux 下为 wndr4300 编译 OpenWrt trunk 版固件
编译自己的 OpenWrt 固件
【Linux/Ubuntu学习 7】E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录

环境

路由器 NETGEAR WNDR3700v4
编译环境 ubuntu-16.10-desktop-amd64

FAQ

固件的获取

  1. openwrt官网/科大清华阿里等的镜像站下载官方编译好固件
    这类固件比较干净,里面只带了一些必要的软件包
    可能没有我们路由器的型号,或者无法充分利用路由器升级的内存
  2. 民间大神编辑,如明月的OPENWRT
    这类固件装了很多软件包,操作简单
    功能很多,可能我们用不到
  3. 自己编译固件

为什么要自己编译固件

主要是听起来很酷
官方的包可能存在问题,例如我的3700v4有120M的flash,官方的包识别32M,可以通过自己编译解决,而且在编译时还可以安装一些软件包,这样,装完系统后,很多软件就不用一个一个装了

编译固件

编译环境 ubuntu-16.10-desktop-amd64 的硬盘空间至少剩余20G,在编译的过程中虽然源代码100M左右,但是编译产生的中间文件有10G左右

安装编译环境和依赖

Ubuntu终端内输入

sudo su
apt-get update    #更新软件列表
apt-get install g++
apt-get install libncurses5-dev
apt-get install zlib1g-dev
apt-get install bison
apt-get install flex
apt-get install unzip
apt-get install autoconf
apt-get install gawk
apt-get install make
apt-get install gettext
apt-get install gcc
apt-get install binutils
apt-get install patch
apt-get install bzip2
apt-get install libz-dev
apt-get install subversion
apt-get install asciidoc  #这个软件400M会下载好久

下载源码

exit #退出root,openwrt默认是不允许用root编译的

下载源代码

git clone -b chaos_calmer git://github.com/openwrt/openwrt.git

当然下载方式很多,这里仅是使用git从GitHub下载,也可以

wget https://github.com/openwrt/openwrt/archive/master.zip
sudu apt-get install zip
unzip master.zip

源码就在那里openwrt,下载方法随意
可以将下载源码的复制一份,免得之后的修改弄坏了,还可以重头来过

编译前的设置

进入源码目录git的目录为openwrt

cd openwrt

wget后解压的目录为openwrt-master

cd openwrt-master

其他方法下载的源码进入源码目录自定义

更新下载并安装所有可用的 feeds

./scripts/feeds update -a
./scripts/feeds install -a

检查还有哪些包没有安装,根据提示安装缺少的软件包

make defconfig
make prereq

打开配置菜单

make menuconfig

配置菜单

操作规则
Enter 进入子菜单/确定 空格切换软件包的状态 【*】表示编译进固件包,【M】表示编译成安装文件,【】为不做操作
左右键切换最下面的 <Select> < Exit > < Help > < Save > < Load >
< Exit > 返回上级菜单/退出

针对我3700v4选择以下参数
CPU型号 Target System 选中’(Atheros AR7xxx/AR9xxx)’
Flash型号 Subtarget 选中 ‘(Genaric devices with NAND flsh)’
路由器型号 Target Profile 选中’(NETGEAR WNDR3700v4/WNDR4300)’
(其他路由器适当选择,如果官方还没支持你的路由器,可按照硬件类似的路由器选择型号)

选择自己所需要安装的包
LuCI –>Collections –> luci #LuCI页面 参见openwrt使用心得系列----功能实现回帖

Network –>选中wpad 取消wpad-mini 即【*】wpad 【】wpad-mini 校园网认证802.1x用的,其他软件包根据需求安装/第一次学习也可以不添加软件包,编译之后也可以再安装软件包

选中< Save > 保存 < Exit > 退出
执行scripts/diffconfig.sh > diffconfig 保存修改内容至diffconfig文件。


其他修改
我需要修改3700v4的flash大小,

vi ./target/linux/ar71xx/image/Makefile  #修改Makeflie文件

/wndr4300 搜索 wndr4300
23552k(ubi),25600k@0x6c0000(firmware)修改为121856k(ubi),123904k@0x6c0000(firmware)
使整个语段变为

wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),121856k(ubi),123904k@0x6c0000(firmware),256k(caldata_backup),-(reserved)

esc退出编辑状态 :wq 保存退出


编译

make -j3 V=s  #第一次更推荐你输入make -j1 V=s进行编译

据说:j 后面数字改为你的 cpu 数量 +1,-j3 表示3线程运行,某个线程出错不会马上停止构建,而是等待其它线程结束,真正的错误信息被其他线程刷掉了。所以要-j1更容易找到编译失败原因
我第一次使用make -j3 V=s 出错,使用make -j1 V=s正常编译完成
出问题多google,

第一次编译时间比较长,以后就快了,大概是因为很多源代码编译后,不需要再次编译了吧

查看编译出的固件

chen@chen-virtual-machine:/media/chen/openwrt$ cd ./bin/ar71xx 
chen@chen-virtual-machine:/media/chen/openwrt/bin/ar71xx$ ls
md5sums                                openwrt-ar71xx-nand-vmlinux.elf                         openwrt-ar71xx-nand-wndr4300-squashfs-sysupgrade.tar
openwrt-ar71xx-nand-root.squashfs      openwrt-ar71xx-nand-vmlinux.gz                          openwrt-ar71xx-nand-wndr4300-ubi-factory.img
openwrt-ar71xx-nand-root.squashfs-64k  openwrt-ar71xx-nand-vmlinux.lzma                        packages
openwrt-ar71xx-nand-uImage-gzip.bin    openwrt-ar71xx-nand-vmlinux-lzma.elf                    sha256sums
openwrt-ar71xx-nand-uImage-lzma.bin    openwrt-ar71xx-nand-wndr3700v4-squashfs-sysupgrade.tar
openwrt-ar71xx-nand-vmlinux.bin        openwrt-ar71xx-nand-wndr3700v4-ubi-factory.img

使用U盘,winscp等任何方法复制出需要的固件

编译时遇到的问题


编译失败提示

{standardinput}: Fatal error: can't close fs/namespace.o: No space left on device

找到出错源头,可发现时空间不足
打开ubuntu,ubuntu也提示磁盘不足,验证想法正确,对虚拟机进行扩大磁盘操作解决


make menuconfig

$make menuconfig
Your display is toosmall to run Menuconfig!

观察提示,我是ssh连接的ubuntu,xshell的窗口太小了,显示不全配置菜单,放大窗口就可以了


在使用ubuntu apt-get 时,我遇到过下列错误提示

E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

通过下列方法解决

sudo rm /var/cache/apt/archives/locksudo rm /var/lib/dpkg/lock

再次install软件,提示:

E: dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题

执行

sudo dpkg --configure -a

再次进行安装

安装固件

已刷breed或者uboot
电脑通过网线连接路由器,打开浏览器输入192.168.1.1
路由器按住reset键,上电开机
浏览器不断刷新 192.168.1.1 界面直到出现bootloader(breed/uboot)引导界面,松开reset键
通过固件更新选项卡,上传固件进行升级,支持img和bin格式
我上传的是openwrt-15.05.1-ar71xx-nand-wndr3700v4-ubi-factory.img文件
上传重启
路由器支持bootloader升级,未刷breed/uboot
搜索相应路由器型号的刷机教程
已刷openwrt
可在Luci界面 -》系统 -》备份升级 -》 刷写新固件
选择openwrt-15.05.1-ar71xx-nand-wndr3700v4-squashfs-sysupgrade.tar文件
版本号相同可以保留原有配置,不同不保留
仅支持.tar格式的文件,如果只有.bin或.img的固件,使用上面的两种方法

遇到的问题

重启之后,可能没有5G的wifi信号,拔掉电源,再开机就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前置条件 编译环境:Linuxmint 18.2 64-Bit 路由器型号:TP-LINK TL-WR720N v...
    suanite阅读 20,417评论 2 13
  • 玩openwrt的基础 参考 什么是Flash内存?Flash内存是什么? 名词解释 openwrt openwr...
    cndaqiang阅读 8,701评论 0 7
  • 因为手贱入了斐讯k2,拿来直接网上找教程。有一键刷breed的脚本,挺好用的,就是要路由器自己有网。建议下次可以...
    贫道法号三刀阅读 1,846评论 0 1
  • 本来想画好后上色的,用App试了一下,还不如黑色有质感,所以人工智能不那么全面,还是比不上手工啊。 生活不是要过得...
    艾娃手绘阅读 299评论 0 4
  • 喜欢文字是什么样的呢?我觉得文字只是一种表现形式,是思想的表现,爱文字可能更多的是爱思想,喜欢脑海中的景色,喜欢脑...
    尹相华颜阅读 183评论 0 0