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
固件的获取
- openwrt官网/科大清华阿里等的镜像站下载官方编译好固件
这类固件比较干净,里面只带了一些必要的软件包
可能没有我们路由器的型号,或者无法充分利用路由器升级的内存 - 民间大神编辑,如明月的OPENWRT
这类固件装了很多软件包,操作简单
功能很多,可能我们用不到 - 自己编译固件
为什么要自己编译固件
主要是听起来很酷
官方的包可能存在问题,例如我的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信号,拔掉电源,再开机就可以了