1 OpenWrt 简介
1.1 历史渊源
OpenWrt 项目是针对嵌入式设备的 Linux 操作系统,常用在路由器上。作为一个简介的嵌入式 Linux 操作系统,OpenWrt 高度模块化、自动化,不仅占用空间小,而且具有强大的网络组件。国内很多商用的家庭路由器,都有 OpenWrt 的影子,也就是基于 OpenWrt 进行二次开发的。主流路由器固件有 DD-WRT,Tomato,OpenWrt 三类,可见其地位举足轻重。
OpenWrt 项目始于 2004 年 1 月,其第一个版本采用了 LinkSys
的源码。在 LinkSys 的代码收费后,改为 Linux 内核集成,并将 OpenWrt 完全模块化,不断推出补丁和驱动。OpenWrt 的主要特点在于其高扩展性,并且文件系统可写,开发者无需在每一次修改后完全重新编译,只要编译自己的软件包即可,这样就加快了开发的进度。另外 OpenWrt 提供了 SDK,每个运行软件均能够以 SDK 来进行编译,以软件包形式进行安装和卸载。其主要特点有如下几个 1
- 源码不含三方代码,只有链接
- 编译时根据不同平台下载不同的源码和补丁,可修改 Makefile 获取最新软件包
- 使用
LuCI
作为最终用户管理界面,即我们常见的路由器 Web 管理界面 - UCI 通用配置管理方法
- 使用脚本调用 iptable,实现防火墙功能,配置文件保存在 UCI 文件中
- 使用开放和可扩展的OPKG格式安装升级包
1.2 OpenWrt 项目目录
OpenWrt 包含以下目录
目录 | 内容描述 |
| 编译选项配置文件: 包含全局编译设置,开发人员设置和内核编译设置 |
| 准备环境脚本,下载补丁脚本,编译Makefile和编译指令 |
| 各种功能的软件包,软件包仅包含Makefile、补丁及配置文件 |
| 存放了一些脚本,使用了 bash,Python,perl 等多种脚本语言 |
| 嵌入式平台,包含特定的嵌入式平台内容 |
| 编译器和C库,例如包含编译工具gcc和glibc库 |
| 通用命令,用来生成固件的辅助工具,如patch/make/spuashfs等 |
OpenWrt 根目录包含以下文件
文件 | 内容描述 |
| 在include/toplevel.mk中可以看到,这是和make menuconfig相关联的文件 |
| 顶层目录执行make命令的入口文件 |
| 配置下载第三方一些软件包时所使用的地址 |
| 定义了Makefile中使用的一些通用变量和函数 |
编译之后,源码会多出一些文件。我们既可以使用源码编译的方式,生成支持特定平台的固件,也可以直接下载官方镜像,官方也提供了支持多种架构和平台的二进制镜像文件。接下来,我们将分别介绍,源码编译生成固件的基本方法、官方镜像安装。并且将展示在两种不同硬件平台下安装 OpenWrt, 我们的 OpenWrt 安装平台是基于 ARM 平台的树莓派和 基于 x86 架构的 Windows 虚拟机。
2 编译源码
此方法适用于定制化的 OpenWrt,我们可以按需定制,如果是高级用户,可以修改源码,达到二次开发的效果。
2.1 下载源码
源码可以在github上下载,也可以在 OpenWrt 的官网下载
# 任选其一
git clone https://github.com/openwrt/openwrt.git
git clone https://git.openwrt.org/openwrt/openwrt.git
2.2 安装项目依赖
安装编译源码所需要的依赖包2:环境支持:gcc, binutils, bzip2, flex, python3.5+, perl, make, find, grep, diff, unzip, gawk, getopt, subversion, libz-dev and libc headers
Debian / Ubuntu 系统
sudo apt install subversion g++ zlib1g-dev build-essential git python python3 python3-distutils libncurses5-dev gawk gettext \
unzip file libssl-dev wget libelf-dev ecj fastjar java-propose-classpath
Ubuntu 18.04 及以上版本
sudo apt install build-essential libncursesw5-dev python unzip
Fedro 30
sudo dnf install @c-development @development-tools @development-libs zlib-static elfutils-libelf-devel gawk unzip file wget python3
CentOS
# CentOS
yum install binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel zlib-static make patch unzip perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static ncurses-libs sed sdcc intltool sharutils bison wget git-core openssl-devel xz
2.3 修改配置文件
生成默认配置文件,将所有配置保存,包括编译环境检查、生成交叉编译链
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
这是需要配置目标设备的一些信息,方便生成符合要求的固件。我们以树莓派为例,树莓派的硬件信息,可以在树莓派实验室 Raspberry Pi 树莓派版本代号大全 找到,根据硬件信息,填写上面的 OpenWrt Configuration
根据硬件信息,Target System 选择 Broadcom BCM27xx,后面几项会自动生成。需要手动修改的配置选项,其实也是按需定制,并非必要选项
Global buildsettings
- compile with support for patentedfunctionality(default)
Kernel Module
- Block Devices -> kmod-block2mtd(MTD:memory technology device内存技术设备)
- Cryptographic API Modules -> kmod-crypto-ccm kmod-crypto-cmac
以下同属于 Kernel Module 子项
filesystem
- kmod-fs-ext4
- kmod-fs-ntfs
- kmod-fs-vfat
USB Supprot
- kmod-usb-ohci
- kmod-usb-uhci
- kmod-usb-storage-extras
- kmod-usb2
Wireless Drivers
- kmod-ath
- kmod-ath9k-common
- kmod-ath9k-htc
- kmod-brcmfmac
输入make defconfig
,打印以下信息,说明没有出错
2.4 编译
# 编译前可更新,也可以不更新
make
这样就生成定制的镜像了。当然,我们也可以使用官方已经编译好的镜像文件。
3 树莓派 OpenWrt 镜像安装
OpenWrt 官网提供了适配各种硬件的镜像包。以树莓派为例,支持的镜像如下,由于是第一次使用树莓派安装 OpenWRT,选择 factory 的镜像
如果你觉得官方镜像下载速度过慢,和其他 Linux 发行版一样,你还可以使用国内提供的镜像地址,中科大 OpenWrt 镜像Win32 Disk Imager 是一款常用的将镜像烧录到 SD 卡的工具,如果你觉得链接网速过慢,也可以自行百度下载。
实践证明,用 Win32 Disk Imager 烧录,可能存在的问题是,OpenWrt 无法正常启动,一直卡在彩虹界面
Etcher 是一款优秀的 U盘镜像制作工具,功能很强大,当然 Ether 软件本身的体积也很大
注意,烧录文件的时候,需要先格式化 SD 卡,推荐使用 SDCardFormatter。
烧录成功之后,启动树莓派,后续的 Web 页面配置操作,让树莓派充当路由器,树莓派实验室提供了更为精确的说明 树莓派安装 OpenWrt 打造超级路由器
4 虚拟机安装 OpenWrt
从官网或者国内的镜像源,下载 x86 架构的 OpenWrt。解压并将镜像转换成符合 Vmware 支持的格式镜像
$ gzip -d openwrt-19.07.2-x86-generic-combined-ext4.img.gz
$ sudo qemu-img convert -f raw openwrt-19.07.2-x86-generic-combined-ext4.img -O vmdk openwrt-19.07.2-x86-generic-combined-ext4.vmdk
Vmware 新建虚拟机,参数配置合理即可,不用分配过大的内存空间。创建完虚拟机之后,在虚拟机目录下,将我们的镜像名称改为 虚拟机名 + vmdk
的格式即可。
打开虚拟机,OpenWrt 运行成功!
需要手动配置 IP 地址,才能让宿主机访问 OpenWrt,目的是让它们在同一网段上。查看一下 OpenWrt 原始网卡
配置网络,让宿主机和物理机处于同一网段
ifconfig br-lan 192.168.229.100 netmask 255.255.255.0
现在可以愉快的访问该路由器啦
后续的其他设置,可以访问 树莓派安装 OpenWrt 打造超级路由器 3
5 总结
OpenWrt 作为一个优秀的开源项目,为家用路由器的发展奠定了坚实的基础。本文只是介绍了 OpenWrt,并初步分析其一般的用法,不仅介绍源码编译的一般方式,也介绍了官方镜像安装的方法,通过在树莓派和虚拟机两种不同的平台,安装 OpenWrt 镜像,我们可以对 OpenWrt 有一个感性的认识。我们最终的目的是,用 OpenWrt 定制属于自己的路由器固件,从而能够对家用路由器背后的原理有一个全面的认识,因此,接下来,我们要不断深入挖掘 OpenWrt 背后的秘密。
- https://yq.aliyun.com/articles/97610 ↩︎
- https://openwrt.org/docs/guide-developer/quickstart-build-images ↩︎
- https://www.lxx1.com/3294 ↩︎