美文网首页
openwrt固件获取、编译与安装

openwrt固件获取、编译与安装

作者: cndaqiang | 来源:发表于2017-09-12 17:35 被阅读3389次

    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信号,拔掉电源,再开机就可以了

    相关文章

      网友评论

          本文标题:openwrt固件获取、编译与安装

          本文链接:https://www.haomeiwen.com/subject/yzgcsxtx.html