Openwrt系统编译

前言提示

事先了解openwrt系统,不单单要了解是mtk7620的芯片,更要了解路由器型号(HC5661)

  1. 推荐阅读:
    openwrt官网:

https://openwrt.org/start?id=zh/downloads

  1. 推荐阅读:
    HC5661相关:

https://blog.csdn.net/dxt1107/article/details/81609033

环境要求

编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要:
一个纯净的OpenWrt编译系统大约需要200MB的空间。
一个包含feeds的OpenWrt编译系统大约需要300MB的空间。
编译feeds中的软件包大约需要2.1GB的空间用于存放下载来的源代码。
构建OpenWrt并生成固件文件需要大约3-4 GB的空间。
编译OpenWrt需要大约1-4 GB的内存。
更推荐64位的16.04的ubuntu系统

特别注意

  1. 请使用一个非root用户来完成这些工作!
  2. 这里的所有命令都在OpenWrt编译系统的根目录下运行(例如~/openwrt/trunk/)
  3. 编译系统的绝对路径中不能含有空格!
  4. 如果你使用root用户下载了源码,请把你下载来的源码的所有者更改为一个非root用户。(sudo chown -R user:user /openwrt/)

下载编译阶段

openwrt文件系统介绍

openwrt项目是针对嵌入式设备的linux操作系统.openwrt不是一个单一且不可更改的固件,而是提供了具有软件包管理功能的完全可写的文件系统.这样我们就可以不使用供应商提供的应用程序选择和配置,而是通过使用软件包来定制设备以适应任何应用程序.对于开发人员来说,openwrt是一个无需围绕它来构建完整固件就能开发应用程序的框架;对于用户来说,这意味着拥有了完全定制的能力,能以想象不到的方式使用该设备.

开发环境搭建

安装依赖库

在64位ubuntu系统16.04中

#sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

安装64位的依赖包

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

同步包信息

否则luci包找不到,该过程可能比较慢,需要从openwrt网站clone, 执行以下命令

make package/symlinks

LUCI是openwrt默认的GUI

下载官方源码

这部分很多源码的链接已经失效,而且部分源码下载实在github上,下载速度慢需要,但是该源码14M多点,迅雷下载也能下载好.
推荐下载地址:

https://github.com/openwrt/openwrt

创建普通用户

推荐阅读:

https://www.cnblogs.com/shudai/p/3256534.html

必须使用非root用户进行操作,添加一个普通用户。(注意:如果使用root进行操作的话,会提示检查失败:Checking ‘non-root’… failed.)

[root@localhost trunk]# adduser openwrt 
[root@localhost trunk]# su openwrt

为了防止文件读写权限造成问题,需要将源码copy到openwet的根目录下进行所有操作。

feeds版本的更新

cd /home/openwrt
./scripts/feeds update -a 
./scripts/feeds install -a

编译检查

在编译过程中,程序会自动通过feed机制,在网上下载相应的依赖文件,这要求编译者所在网络环境良好!
进行环境检查,查看编译所需依赖库是否都安装:

make defconfig

若提示有某个依赖库没有安装,请按照提示按照对应的依赖库. 直到上述检查无返回。
(PS部分返回libpam,找不到该安装方式,可以忽略)

编译配置

make menuconfig

在Target System中选择 MediaTek Ralink MIPS
在Subtarget中选择 MT7620 based boards
Target Profile选择 HiWiFi HC5661
选择web服务器
别忘记勾选中文:
LuCI–>2.Modules–>Translations–>Chinese(zh-cn)
需要额外选择的:
Build the openwrt image builder
Build the openwrt SDK
Package the openwrt-based toolchain
是为了能够在后面的比如应用开发中,使用到该toolchain工具链进行开发,故而一次性编译出来更加方便!
弄完之后save,保存为.config退出

开始编译

使用以下命令即可!(使用3核处理器编译,其实还是很慢,即便你把我的包也拷贝了)

make V=99

在编译根目录下会有一个dl的目录,这个目录其实是“download”的简写,在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。
当然,你也可以自己在dl里面创建自己的软件包,然后更改相关的配置文件,让openwrt可以识别这个文件包。

编译成功

成功编译后生成的固件地址

/home/openwrt/openwrt-master/bin/targets/ramips/mt7620

编译Q&A

问题一: xxx is not in the sudoers file.This incident will be reported.的解决方法

1.切换到root用户下.
2.添加sudo文件的写权限,命令是:

chmod u+w /etc/sudoers

3.编辑sudoers文件

vi /etc/sudoers 

找到这行 root ALL=(ALL:ALL) ALL,在他下面添加xxx ALL=(ALL:ALL) ALL (这里的xxx是你的用户名)
4.撤销sudoers文件写权限,命令:

chmod u-w /etc/sudoers

这样普通用户就可以使用sudo了.

问题二: apt-get update 失败的解决方法

修改源配置文件
本人原来的源下载使用suhu的源,现在改成阿里云的源
先备份原来的配置文件

 mv /etc/apt/sources.list /etc/apt/sources.list.bak 
 vim /etc/apt/sources.list

将Ubuntu镜像点添加到配置文件
可阅读该文档复制其阿里云的源链接.

https://blog.csdn.net/qq_35451572/article/details/79516563

源码下载困难

正常下载渠道是非常漫长的,有条件可,或者迅雷(相对快点);

非要普通用户才能编译吗

如果不觉得麻烦也可以使用root用户,编译时后加FORCE_UNSAFE_CONFIGURE =1
即:make V=99 FORCE_UNSAFE_CONFIGURE =1

报错没有打印相关信息

编译后加V=99打印编译日志,用于检错打印错误信息.
即:make V=99

编译报错出现在dl目录下的安装包没有权限

因为dl目录下面的安装包从我这拷贝过去的,所以需要修改权限,sudo chmod -R 777 dl即可.

内存不足的问题

问题出现: /bin/bash: line 1: 49340 Killed Makefile:2278: recipe for target ‘s-automata’ failed
解决方法:将内存加到3G足够,顺便把内核加到4核

烧写阶段

烧写提示

推荐阅读:

https://www.right.com.cn/forum/thread-161906-1-1.html

采用breed代替普通bootloder
Breed是不死的,界面是优化好的,编译好的固件可以直接在网上烧入进去

烧写步骤

  1. 使用网线链接好路由器以及pc;
  2. 使用cmd找到该路由器的网关地址
  3. 在浏览器上输入该ip地址,即可到达路由器的控制界面;
  4. 重启路由器,并且按住wps键使它停留在breed界面;
  5. 在浏览器上输入192.168.1.1地址,进入breed控制界面;
  6. 在固件上,选择文件,选择编译好的.bin文件,以及选择公版0x50000地址,上传烧入
  7. 自动重启,若没有问题即可重启wifi

可能需要改动的代码

5.1 改动提示
推荐阅读:

https://blog.csdn.net/qq_35650017/article/details/83896284

官方提供的固件,闪存只识别为8M,所以要修改为16M的闪存.
5.2 代码改动
该目录文件地址:

\target\linux\ramips\dts\PSG1218.dtsi
m25p80@0 {
compatible = "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <10000000>;
		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;
			partition@0 {
				label = "u-boot";
				reg = <0x0 0x30000>;   //这里uboot启动从0地址不用改
				read-only;
			};
			partition@20000 {
				label = "u-boot-env";
				reg = <0x30000 0x10000>; //uboot 环境变量地址不用改
				read-only;
			};
			factory: partition@30000 {
				label = "factory";
				reg = <0x40000 0x10000>; 
				read-only;
			};
			partition@40000 {
				label = "firmware";
				reg = <0x50000 0x7b0000>;  //这里的固件大小需要改
			};
		};
	};

其中firmware的固件地址大小改成:
Reg = <0x50000 0xfb0000> wq退出即可

开发阶段测试

构建检查编译工具

  1. 假设之前你已经按照操作步骤编译好openwrt系统
    在该目录下
/bin/targets/ramips/mt7620

既有openwrt检查工具链
openwrt-toolchain-ramips-mt7620_gcc-7.4.0_musl.Linux-x86_64.tar.bz2

  1. 解压到你的工作目录
sudo tar -jxvf OpenWrt-Toolchain-ramips-rt305x_gcc-4.8-linaro_musl-1.1.10.Linux-i686.tar.bz2 -C /opt/wkspace
  1. 进入你解压好的目录(路径可能不一样,不要直接拷贝,去到bin目录即可)
cd /opt/openwrt-toolchain-ramips-mt7620_gcc-7.4.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.4.0_musl/bin/
  1. 作为临时编译的工具链
    pwd得到的bin路径添加到环境中
export PATH=/opt/wkspace/openwrt-toolchain-ramips-mt7620_gcc-7.4.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.4.0_musl/bin/:$PATH
  1. 需要添加该环境变量的路径:
export STAGING_DIR=/opt/wkspace/openwrt-toolchain-ramips-mt7620_gcc-7.4.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.4.0_musl/
  1. 检查交叉工具链是否安装成功
mipsel-openwrt-linux-

输入以上指令,双击tab键两下,即为安装成功

测试检查工具链

Hello的测试

为了方便linux与window与开发板交互,选择了共享文件目录的方式进行开发
当然还有其他更好的方法,这里仅作抛砖引玉

cd /mnt/hgfs/myshare/openwrt系统开发/openwrthelloworld
touch hello.c
vi hello.c   //添加打印内容,内容随意.wq
进行交叉编译
mipsel-openwrt-linux-gcc hello.c -o hello

即生成了我们需要的hello文件,可以在开发板上运行.

执行文件烧入开发板

winscp的使用

考虑到开发板与windows链接是通过有线连接的,故采用winscp工具非常有用
输入文件协议:
SCP
输入开发板ip地址,端口号:
192.168.1.1 22
输入管理员账号密码:
Root 1
链接成功,可直接拖曳传输文件信息

给文件添加可执行属性
直接执行 该文件是没有权限的
添加执行属性

Chmod  667  hello

运行

 ./hello

参考文献

这是非官方提供的针对hc561路由器的固件地址:

http://downloads.openwrt.org/releases/18.06.2/targets/ramips/mt7620/openwrt-18.06.2-ramips-mt7620-hc5661-squashfs-sysupgrade.bin

这个是官方提供的针对hc5661路由器的固件地址:

https://downloads.openwrt.org/releases/18.06.2/targets/ramips/mt7620/

Breed下载网址:

https://breed.hackpascal.net/breed-mt7620-hiwifi-hc5761.bin

对应的breed为:
breed-mt7620-hiwifi-hc5761.bin 极路由 极壹S (HC5661)/极贰 (HC5761) 专用,波特率 115200,复位键 GPIO#12

你可能感兴趣的:(系统编译)