ymoti 最近的时间轴更新
ymoti

ymoti

V2EX 第 138796 号会员,加入于 2015-09-17 22:25:44 +08:00
ymoti 最近回复了
2017-10-13 00:01:57 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
重新做了合体版,如下。

https://www.v2ex.com/t/397209
2017-10-06 16:46:24 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
@lekai63 已经完成了,可以看一下。
2017-10-06 16:46:00 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
后记

以个人经验来看,编译路由器固件总的来说并不是很难,更多需要的细心和严谨。本人掉进去过的坑大家就不要再进了...

另外国外也有人在 advancedtomato 的源码上做过一些改动并且开源,我看 advancedtomato 的代码里有很多也来源于他的项目,链接如下。他的项目里有提供 R7000/R8000 的固件下载,并且都支持 TPROXY。 我之所以知道,是因为他是其中一个在论坛上帮我的人,他看到我问怎么编译 TPROXY,就问这个 TPROXY 说有啥用,另外一个人帮我回答了,然后他就在他自己的项目里把 TPROXY 也编译进去了。

https://bitbucket.org/AndreDVJ/advancedtomato-arm

另外,如果因为编译失败或者因为各种原因需要回到最开始刚下载完的一个比较干净的状态,可以运行下面的命令:
git clean -fdxq && git reset --hard
然后再 checkout 相应的版本。
2017-10-06 16:30:03 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
编译中可能出现的问题

如果完全按照上面一步步做下来,编译中仍然会出现问题,我把我碰到列出来下:
1. 提示 xx 文件没有访问权。 这个是因为编译程序不能访问某个文件或者某个目录导致的。为什么呢? 原因大概为: 1) 安装 Linux 时为 root 权限,而运行编译时为普通用户,所以那些目录普通用户是不能访问的,比如 /usr/bin 目录。解决办法为把那些目录 /文件的所有者改为当前用户,用命令 chown [OPTION]... [OWNER][:[GROUP]] FILE。2)其他文件 /目录在创建时用了 root 权限,原因和解决方法同 1).

2. 提示 xx 文件找不到,但是查看后文件其实存在。比如下面的 aclocal.m4 文件。 解决方法是运行 touch aclocal.m4 configure。 这样做可以更新文件的 timestamp,告诉编译程序不需重新编译这个文件。

WARNING: 'aclocal-1.15' is missing on your system. You should only need it if you modified 'acinclude.m4' or 'configure.ac' or m4 files included by 'configure.ac'. The 'aclocal' program is part of the GNU Automake package: http://www.gnu.org/software/automake It also requires GNU Autoconf, GNU m4 and Perl in order to run: http://www.gnu.org/software/autoconf http://www.gnu.org/software/m4/ http://www.perl.org/ make: *** [aclocal.m4] Error 127
2017-10-06 16:10:43 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
编译

编译需要做两个事情:
1. 选择需要编译 Linux 模块, TPROXY 就在这里选择
2. 选择需要编译的路由器型号。

1. 选择需要编译的 Linux 模块
在下面目录输入 make menuconfig,会进入一个编译菜单,可以选择需要编译的模块。
compile@ubuntu:~/tomato/release/src-rt-6.x.4708/linux/linux-2.6$ make menuconfig

在菜单里,*表示必选,[]表示可选,[M]表示作为单独模块编译。上下键移动光条,空格键做选择。
首先在第一层菜单里选择: General Setup -->, 在下一层菜单选上[*] Prompt for development and/or incomplete code/drivers。只有选上这个选项,那些 experimental 的模块才会显示出来,否则你是没法找到 TPROXY 的相应模块的。

TPROXY 相关的模块有两个,分别在如下位置

<M > Transparent proxying support (EXPERIMENTAL) (NEW)

│ Location: │
│ -> Networking support (NET [=y]) │
│ -> Networking options │
│ -> Network packet filtering framework (Netfilter) (NETFILTER [=y]) │
│ -> Core Netfilter Configuration │
│ -> Netfilter Xtables support (required for ip_tables) (NETFILTER_XTABLES [=m]) │


<M> "TPROXY" target support (EXPERIMENTAL)

│ Location: │
│ -> Networking support (NET [=y]) │
│ -> Networking options │
│ -> Network packet filtering framework (Netfilter) (NETFILTER [=y]) │
│ -> Core Netfilter Configuration

--------------或者不用菜单,直接编辑下面文件并添加 TPROXY 相应选项,效果也是一样的--------------

compile@ubuntu:~/tomato/release/src-rt-6.x.4708/linux/linux-2.6$ gedit config_base

然后在带#的那几段下面分别添加 CONFIG 开头的那些代码。前两个是 TPROXY 相关的,最后那个 SOCKET 结尾是因为添加 TPROXY 后在编译过程中会暂停问用户需要不需要编译,所以一次添加完。

# Core Netfilter Configuration
CONFIG_NETFILTER_TPROXY=y

# Xtables targets
CONFIG_NETFILTER_XT_TARGET_TPROXY=y

# Xtables matches
CONFIG_NETFILTER_XT_MATCH_SOCKET=y

config_base 是默认配置文件,刚刚的菜单也是先载入 config_base,然后根据用户的选择会把配置保存到.config 文件中。

2. 选择需要编译的路由器型号。
选择对应的路由器型号,相对简单。在 src-rt-6.x.4708 目录下(其他目录不行)下输入 make help,可以查看支持的型号(部分型号如下,全部型号及命令请在自己的电脑上查看)。比如我要编译 R7000,就输入 make r7000z,编译就会开始了,然后就是愉快的等候了。

本人只编译过 r7000 的固件,其他型号请自行查看并选择。

compile@ubuntu:~/tomato/release/src-rt-6.x.4708$ make help
ASUS ARM Builds - RT-N18U, RT-AC56U, RT-AC68U, RT-AC68R, RT-AC68P
ac68e RT-N18U/AC56U/AC68U(R/P) build VPN
ac68z RT-N18U/AC56U/AC68U(R/P) build AIO
n18e RT-N18U/AC56S without SMP build VPN
n18z RT-N18U/AC56S without SMP build AIO
DLINK ARM Builds
dir868l DLINK DIR868L
NETGEAR ARM Builds
r7000e R7000/R6300v2/R6250 build VPN
r7000z R7000/R6300v2/R6250 build AIO
r6400e R6400 build VPN - 128K NVRAM
r6400z R6400 build AIO - 128K NVRAM
.
.
.
2017-10-06 15:43:51 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
编译前最后准备

Tomato 系源码编译前需要做两件事:
1. 建立交叉编译目录的连接
2. 把上面建立的连接放到系统路径中,告诉编译工具在哪里可以找到交叉编译需要用到的工具在哪里。

1. 建立交叉编译工具目录的连接

交叉编译用的工具目录如下。
compile@ubuntu:~/tomato/release/src-rt-6.x.4708$ cd toolchains
compile@ubuntu:~/tomato/release/src-rt-6.x.4708/toolchains$ ls
hndtools-arm-linux-2.6.36-uclibc-4.5.3

连接命令如下,作用为: 把那一长串的目录连接到 /opt/brcm-arm 这个地方来,然后可以通过 /opt/brcm-arm 就和访问那一长串的目录是一样的。
sudo ln -s /home/compile/tomato/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3 /opt/brcm-arm
如果目录名没有敲错的话,连接会成功,ls /opt 显示的目录名会是蓝绿色。如果显示是红色的话,说明目录名有误。

注意!!!务必使用绝对目录, 比如 /home/compile/tomato/release/等等,不要使用~/tomato/release/这样的写法,虽然在 Linux 里看起来他们是效果是一毛一样的,但是在编译中会有很多问题是因为使用了~/tomato 这样的写法导致的。 我因为这个写法碰到的坑实在是多的不能再多了....... 务必使用绝对路径!!! 原因大概是因为编译过程的命令调用错综复杂,一层套一层,导致~/tomato 这样的写法会产生问题。总之为了避免不必要的麻烦,吸取我的前车之鉴吧。

2. 把目录连接加入系统路径。

命令如下:
PATH=$PATH:/opt/brcm-arm/bin
或者编辑~/.profile 文件,把上述命令加到最后一行。区别是放在~/.profile 后,每次重启都会把目录自动加到系统路径。
命令的作用是把 /opt/brcm-arm/bin 这个目录加到现有路径里。

完成后用 echo $PATH 检查,显示结果应该和下面相同。
compile@ubuntu:~/tomato/release/src-rt-6.x.4708/toolchains$ echo $PATH
/home/compile/bin:/home/compile/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/brcm-arm/bin

注意!!! /opt/brcm-arm/bin 务必放在现有路径后面,不要用 PATH=/opt/brcm-arm/bin:$PATH 这样的写法,这样的话会把交叉编译工具的目录放在前面,编译时没有先去找系统路径也会导致一些意想不到的问题。 我当时编译失败的其中一个原因就是这个,还在论坛被人给教育了不要自己乱来...

总之,在这两个方面务必严谨,可以给自己少很多不必要的麻烦....
2017-10-06 15:10:55 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
源码介绍 - 2

ARM 系源码下有两个分支,这个要注意一下。两个分支的开发进度及对应机型是不同的。下面列表是从 Tomato By Shibby 的网站( http://tomato.groov.pl/?page_id=164)粘贴过来的,大家看了应该就明白。Again,AdvancedTomato 是基于 Tomato By Shibby 的。

我开始时不知道,然后在 ARM7 的分支下面编译了半天 R7000 的固件,一直过不了(惨痛教训 again),后来只好跑去国外的论坛上问,很快有好心人帮我指出问题所在....

K26RT-AC – MIPSR2 – SDK6.x, special builds for RT-N66U, RT-AC66U, R6300v1 and Tenda W1800R only

K26ARM – ARM – only for Broadcom-ARM based routers like: Asus RT-N18U, RT-AC56U, RT-AC68U (except HW Rev C1), RT-AC68R, D-Link DIR868L, Huawei WS880, Netgear R7000, R6400, R6300v2, R6250, Linksys EA6900, EA6700, EA6500 v2

K26ARM7 – ARM – only for Broadcom-ARM based routers: Netgear R8000 and Asus RT-AC3200

如何查看和切换要编译的分支?
git branch -r <---显示分支
git checkout <--- 检出分支, 相当于切换到相应分支,也就是用当前的分支做编译。

下面是具体操作命令和结果(注意*号的变化

compile@ubuntu:~/tomato/release$ git branch
* arm
arm7

compile@ubuntu:~/tomato/release$ git checkout arm7
Checking out files: 100% (39253/39253), done.
Switched to branch 'arm7'
Your branch is up-to-date with 'origin/arm7'.

compile@ubuntu:~/tomato/release$ git branch
arm
* arm7

compile@ubuntu:~/tomato/release$ git checkout arm
Switched to branch 'arm'
Your branch is up-to-date with 'origin/arm'.

compile@ubuntu:~/tomato/release$ git branch
* arm
arm7

git 是一个源码管理工具,个人懂得不多。我的认知是,它会跟踪所有的文件变化。看介绍,他的工作原理是把工作指针指到相应版本,比如 git checkout arm7 是把指针指到 arm7 的分支版本,这样我们看到和用到的就是 arm7 的文件了。

请大家根据实际情况做好设置。
2017-10-06 14:50:31 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
源码介绍 (ARM 系为例)

advancedtomato 的源码容量很大,应该有大于 1G。具体下载时间视网速。下载完后,目录下会有若干文件及目录,具体如下。att 是我自己建的目录名

compile@ubuntu:~$ cd att
compile@ubuntu:~/att$ ls
CHANGELOG COPYING README.md README.TXT release VERSION

compile@ubuntu:~/att$ cd release
compile@ubuntu:~/att/release$ ls
dhd src-rt-6.x.4708 src-rt-7.x.main

compile@ubuntu:~/att/release$ cd src-rt-6.x.4708
compile@ubuntu:~/att/release/src-rt-6.x.4708$ ls
bcm57xx cfe cy_conf.h include Makefile rts tools
bcmcrypto common cy_conf.mak linux makefiles shared wl
bcm_tools ctf emf lzma ntools target.mak wnrtool
btools ctools et lzma-loader router toolchains

编译时在 src-rt-6.x.4708 这个目录下执行命令 (RT-N/AC 系的目录名稍有不同)。有兴趣的同学可以自己每个目录看一下。
2017-10-06 14:42:38 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
源码下载

AdvancedTomato 的源码在下面链接可以下载 (AdvancedTomato 作者的官网),根据 Broadcom 路由器架构不同分成两个大类,RT- N/AC 的是比较老的系列了,像 WNDR3700。ARM 的是像 R6300V2, R7000 这些相对较新的路由器。下载源码时注意区别。

https://advancedtomato.com/faq#source-code

AdvancedTomato ARM Repository <---- ARM 系路由器固件源码
AdvancedTomato RT-N/AC Repository <---- RT-N/AC 系路由器固件源码
AdvancedTomato GUI Repository <---- 据作者说 AdvancedTomato 其实只是在 Tomato By Shibby 上添加一个图形界面(GUI),所以本质上还是固件还是 Tomato By Shibby。所以他也提供了单独的 GUI 的源码。没有具体研究过这部分。


源码下载方式为: 在 Linux 里开一个 Terminal - 找个地方建个目录,一般在~/home 下面 (这里有个坑,后续会说)。命令如下(以下载 ARM 系源码为例)
mkdir tomato #建目录
git clone https://github.com/Jackysi/advancedtomato-arm # git 是一个软件,在刚才编译环境准备 - 2 中已经安装,如果跳过那一步的话,在这里会报错。git clone 做的就是是把后面那个链接里的代码复制到当前目录。
2017-10-06 14:22:49 +08:00
回复了 ymoti 创建的主题 路由器 AdvancedTomato 固件编译步骤
编译环境准备 - 补充

固件编译涉及一个概念叫做交叉编译。正常我们用的电脑为 x86 架构,和路由器的硬件是不同的,所以直接在电脑上编译出来的东西是没法在路由器上运行的。但是直接在路由器上编译,要么是速度太慢,要么是空间不够,所以就有了这个交叉编译。 通过交叉编译在电脑上就可以直接编译出在路由器上可以运行的固件。Tomato 系开源项目里应该都自带交叉编译工具,目录名一般是 toolchains 之类的名字。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1677 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 16:45 · PVG 00:45 · LAX 09:45 · JFK 12:45
Developed with CodeLauncher
♥ Do have faith in what you're doing.