Total Pageviews

Friday, 13 May 2016

编译自己的OpenWrt固件

编译环境:Ubuntu 14.04.2 64-Bit
路由器型号:TP-LINK TL-WR703N v1, 改过硬件:16M Flash / 64M Memory
固件也可以去官方下载:https://downloads.openwrt.org/
例如 TP-LINK TL-WR703N v1 的最新固件下载地址为:
优点是方便,缺点是不能自己定制,如果你是改过 Flash 大小的,那么也必须自己编译
可参考官方文档关于编译的章节:http://wiki.openwrt.org/doc/start#building_openwrt
以下是我对改过硬件的 TL-WR703N 编译适合的固件的步骤:
按以下步骤编译好的固件下载地址(如果你不想自己编译的话):
factory: https://www.dropbox.com/s/aqe1957l4swpw9w/openwrt-15.05-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin?dl=0
sysupgrade: https://www.dropbox.com/s/os5sz47ljfgt4i6/openwrt-15.05-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin?dl=0
  1. 获取最新源码,如何获取源码可查看:https://dev.openwrt.org/wiki/GetSource
    git clone git://git.openwrt.org/openwrt.git
    也可以获取特定分支的源码,例如我们获取 15.05 branch (Chaos Calmer) 这个分支
    以下步骤都使用的这份源码
    git clone git://git.openwrt.org/15.05/openwrt.git
  2. 修改源码,使其适用于 16M Flash
    参考的这篇文章:http://wiki.openwrt.org/toh/tp-link/tl-wr703n#mb_flash_mod
    进入源码目录 cd openwrt
    • 打开 target/linux/ar71xx/image/Makefile 这个文件
      将如下内容
      define Device/tl-wr703n-v1
          $(Device/tplink-4mlzma)
          BOARDNAME := TL-WR703N
          DEVICE_PROFILE := TLWR703
          TPLINK_HWID := 0x07030101
          CONSOLE := ttyATH0,115200
      endef
      改为:
      define Device/tl-wr703n-v1
          $(Device/tplink-16mlzma)
          BOARDNAME := TL-WR703N
          DEVICE_PROFILE := TLWR703
          TPLINK_HWID := 0x07030101
          CONSOLE := ttyATH0,115200
      endef
    • 打开 tools/firmware-utils/src/mktplinkfw.c 这个文件
      将如下内容:
      .id             = "TL-WR703Nv1",
      .hw_id          = HWID_TL_WR703N_V1,
      .hw_rev         = 1,
      .layout_id      = "4Mlzma",
      改为:
      .id             = "TL-WR703Nv1",
      .hw_id          = HWID_TL_WR703N_V1,
      .hw_rev         = 1,
      .layout_id      = "16Mlzma",
  3. (可选)下载和安装所有可用的 Feeds, 如果不清楚 Feeds 是什么,可查看:http://wiki.openwrt.org/doc/devel/feeds
    ./scripts/feeds update -a
    ./scripts/feeds install -a
  4. 输入以下命令,检查哪些需要的包还没有安装:
    make defconfig
    make prereq
    make menuconfig
    例如在我这提示:
    Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)
    Build dependency: Please install zlib. (Missing libz.so or zlib.h)
    Build dependency: Please install the openssl library (with development headers)
    Build dependency: Please install GNU 'awk'
    Build dependency: Please install the Subversion client
    安装缺少的包:
    sudo apt-get install subversion libncurses5-dev zlib1g-dev libssl-dev gawk subversion
    你或许还需要安装 build-essential 这个包,我是以前就安好了
  5. 配置编译详情
    make menuconfig
    输入以上命令之后,会进入一个命令行图形界面,界面最上面是用法
    以下是我的一些配置,你可以选择性的参考
    我的配置非常简单,如果需要额外的功能可以通过 opkg 来安装,所以固件简单点就好,反正之后还可以安装
    • 选择 CPU 型号
      Target System 选为 Atheros ARM7xxx/ARM9xxx
    • 选择你的路由器型号
      Target Profile 选为 TP-LINK TP-WR703N
    • 启用 Web 管理界面 LuCI
      LuCI → Collections → 选中 luci
    • 添加 LuCI 中文支持
      LuCI → Modules → Translations → 选中 Chinese (zh-cn)
  6. 生成构建的配置文件,检查依赖等
    make defconfig
  7. 编译,可加上 V=99 参数输出所有调试信息
    make
    在虚拟机中大概编译了一个半到二个小时,大多数时间都在下载,所以要保持网络通畅
    编译好了之后可在 bin/ar71xx 目录找到生成的固件
    openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin 和 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin
    已经安装了 OpenWrt 那么可用 sysupgrade 固件进行升级,会保留用户数据(也可选不保留)
    factory 固件在第一次刷机的时候使用
  8. 刷机
    我所使用的 U-Boot 是这个:https://github.com/pepe2k/u-boot_mod
    步骤如下:
    1. 将电脑 IP 设置为 192.168.1.2, 子网掩码设置为 255.255.255.0
    2. 断开路由器的电源,用网线连接好电脑和路由器
    3. 按住路由器的 Reset 按钮,插上电源, 待路由器灯闪四次后放开,放开后,路由器灯会快闪一次,代表进入了恢复模式
    4. 用电脑浏览器打开 http://192.168.1.1/index.html, 打开后,上传固件。如打不开可重复以上几步
    5. 上传完固件后,等一段时间,待机器自动重启
      此时可将电脑 IP 设置为正常
  9. 配置系统
    配置成网口 PPPoE 上网,电脑连接无线上网
    因为系统初始是不开启无线连接的,所以你需要用网线将电脑和路由器连起来
    1. 电脑浏览器打开 192.168.1.1 进入 Web 管理界面
      不用输入密码直接登录,登录之后去设置一个新密码
    2. 更改系统语言
      Syatem → Language 修改为 Chinese, 点击 Save & Apply
    3. 点击,网络 → 无线,设置好 SSID, 密码点击「保存&应用」,最后点击「启用」
      现在可以通过无线连接到路由器进行配置了
    4. 配置网络还是修改配置文件比较方便,也比较好讲解
      修改之前先备份配置文件 cp /etc/config/network /etc/config/network.old
      然后编辑配置文件 vim /etc/config/network
      • 修改 lan 配置,修改成如下样子
        config interface 'lan'
            # 去掉这个,表示只有无线应用到 lan
            # option ifname 'eth0'
            option force_link '1'
            # 去掉这个,因为只有无线应用到 lan, 所以不需要桥接
            # option type 'bridge'
            option proto 'static'
            option ipaddr '192.168.1.1'
            option netmask '255.255.255.0'
            option ip6assign '60'
      • 增加 wan 配置,PPPoE 方式上网
        config interface 'wan'
            option ifname 'eth0'
            option proto 'pppoe'
            option username 'USERNAME'
            option password 'PASSWORD'
      最后使用如下命令重启网络服务:
      /etc/init.d/network restart
    以后配置路由器请使用无线连接方式,有线连接用于 PPPoE 上网.