OpenWrt开发环境构建

OpenWrt开发环境构建

来源 https://zhuanlan.zhihu.com/p/24403803

 

无线路由器目前已经可以做很多的功能了,相应的扩展资源也越来越多。其中大部分都是直接基于OpenWRT平台直接进行开发的。笔者之前一直介绍的都是一些协议的理论知识,目前也更新一些笔者关于SDWN(Software Defined Wireless Networking)的实现中,所总结的一些实战类的笔记。笔者目前是采用WNDR3800作为硬件平台,性价比高。

PS:由于路径问题,一般一个ubuntu系统只能够安装一个OpenWRT,否则会出现路径不匹配的问题。

开发环境构建

第一步:安装一些依赖包

sudo apt-get install libncurses5-dev zlib1g-dev gawk flex patch git-core g++ subversion

第二步:下载OpenWRT源码

git clone git://git.openwrt.org/14.07/openwrt.git

第三步:修改文件夹权限,为了编译方便,一般直接对源码文件夹赋予777的权限

sudo chmod -R 777 openwrt

第四步:修改feeds源,用以安装所需的package以及luci界面

gedit feeds.conf.default

打开文件后,注释掉一些不需要的源,一般使用前三个源即可

第五步:更新与安装feeds包

./scripts/feeds update –a
./scripts/feeds install –a

第六步:固件的编译设置,我们要设置如下内容。注意,空格键是选择是否安装模块,如果是“*”的话,那么就是默认安装,如果是“M”的话,那么就是要手动加载。回车键是用来选择是否进入子栏的,在配置完固件之后,需要手动保存后再离开。

1)Target System类型为: Atheros AR7xx/AR9xx

2)Target Profile类型为:NETGEAR WNDR3700/WNDR3800/WNDRMAC,这里根据路由器型号进行选择,我们采用的路由器为WNDR3800。

3)Target Images类型为:squashfs,其余的选项不选

4)分别选中 <Advanced configuration options(for developers)>,<Build the OpenWrt SDK>,<Build the OpenWrt based Toolchain>

5)选择<Luci—Collections--(*)luci>,如下图(选择时要注意是选择了M还是*,因为这两种不同的选择方式编译完的固件是有不同的,这里还是强调全部用 *,否则刷机完之后,还需要手动加载Luci界面)

6)保存退出

7)如果需要装OVS的话,那么需要手动取消bridge,即在make menuconfig后手动执行以下指令。

echo '#CONFIG_KERNEL_BRIDGE is not set' >> .config

注意:每次 make menuconfig以后都要执行这条指令。


第七步:在openwrt源码文件中,添加编译时候需要附加的模块。在openwrt编译过程中,会从互联网上自行下载一些模块,不过由于网络以及数据源的问题,有部分数据包直接下载是存在问题的。故本文已经将该版本openwrt所需要的数据包进行整理,并整理如下:

openwrt文件1

openwrt文件2

上述文件解压缩以后,可以获得一个dl.tar.gz的文件,首先将其下载至本地,并传入开发环境中,然后用以下命令解压缩

tar zvxf dl.tar.gz

解压缩之后,可以获得一个名为dl的文件夹。此时需要将该文件夹与openwrt目录下的内容进行合并,比如可以用以下指令(如果在图形界面里面,手动拖拽文件夹也行)

cp ./dl/* openwrt/dl/

在openwrt编译过程中,如果dl目录中已经有下载好的模块,那么编译的时候就不会再行下载资源。

第八步:编译openwrt固件。直接在openwrt根目录下,执行以下指令即可

make V=99

编译完的结果被保存在目录(openwrt/bin/ar71xx/)下,其中ar71xx路径名与固件配置时选择的芯片型号有关。以本文选择WNDR3800路由器为例,最后编译结果为

openwrt-ar71xx-generic-wndr3800-squashfs-sysupgrade.bin

将该文件拷出后,我们可以进行最后一步的刷机操作。

 

 

一、问题1

执行
make V=99
报出错误:
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/${ <-- HERE ([^ \t=:+{}]+)}/ at xxxx/usr/bin/automake line 3939

二、原因

从perl v5.22开始:不再推荐在正则表达式中使用 {,而且如果没有转义 { 会有错误警告,从v5.26开始:不仅有警告,还会有语法错误提示。
此为Perl版本更新后对语法规范进行了变更,若左花括号作为文本则应当进行转义。

三、解决方法

在 openwrt 目录下
cd build_dir/host/automake-1.15/bin/
vim build_dir/host/automake-1.15/bin/automake.in:3883 或 automake:3938
输入/text =
找到$text =~ s/\${([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;
修改为$text =~ s/\$[{]([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;

四、问题2

执行
make V=99
报出错误:
build_dir/host/u-boot-2014.10/lib/rsa/rsa-sign.c:279:21: error: dereferencing pointer to incomplete type 'RSA {aka struct rsa_st}'

五、原因

此为Ubuntu18.04安装的libssl-dev为1.1版本,而OpenWrt 15.05.1不支持此版本,需要回退到1.0版本

六、解决方法

使用aptitude软件包管理器
sudo apt-get install aptitude
卸载之前的版本
sudo aptitude remove libssl-dev
安装1.0版本
apt-get install libssl1.0.0

 

you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment)

来源 https://www.cnblogs.com/dakewei/p/10819433.html

在编译buildroot的时候出现了此错误,表示不能使用root权限编译
根据提示,在网上查,说是export set FORCE_UNSAFE_CONFIGURE=1能够解决问题
但我在终端上输入还是报错,后来才知道是要添加到/etc/profile文件中设置全局才有效

vi /etc/profile.d/force_unsafe_configure.sh

# fixed for you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
export set FORCE_UNSAFE_CONFIGURE=1

执行:

echo "export set FORCE_UNSAFE_CONFIGURE=1"  >> /etc/profile
source /etc/profile

最好重启终端

如果还是不行,看看是否存在~/profile文件,如果存在,在~/profile中也添加相应内容

 

openwrt编译e2fsprogs-1.43时报错misc/create_inode.c:399:18: error: conflicting types for 'copy_file_range'

补丁 https://github.com/dudanov/source/commit/e7d44a5d5d5b48570fe3e4a3c08b73b7a3f58dc3

1. 详细报错信息

  misc/create_inode.c:399:18: error: conflicting types for 'copy_file_range'

  static errcode_t copy_file_range(ext2_filsys fs, int fd, ext2_file_t e2_file,

  ^~~~~~~~~~~~~~~

  In file included from ./../misc/create_inode.c:19:0:

  /usr/include/unistd.h:1110:9: note: previous declaration of 'copy_file_range' was here
  ssize_t copy_file_range (int __infd, __off64_t *__pinoff,

2. 解决办法

  将copy_file_range改成copy_file_chunk

   cd build_dir/host/e2fsprogs-1.43.7

   vi misc/create_inode.c (将所有的copy_file_range改成copy_file_chunk)

 

 

location.c: In function 'event_location* string_to_explicit_location(const char**, const language_defn*, int)':
location.c:527:19: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
       || *argp == '\0'
                        ^~~~
Makefile:1131: recipe for target 'location.o' failed

vi build_dir/toolchain-mips_24kc_gcc-5.4.0_musl-1.1.16/gdb-7.12/gdb/location.c:527:19:
       || *argp == ((char *)'\0')

 

 

make defconfig V=s

make -j1 LINUX_VERMAGIC:=779398d8ffeda2471f857e23ecb06b22 V=s

 

============ End

 

posted @ 2020-09-24 21:18  lsgxeva  阅读(439)  评论(0编辑  收藏  举报