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 包含以下目录

目录

内容描述

./config

编译选项配置文件: 包含全局编译设置,开发人员设置和内核编译设置

./include

准备环境脚本,下载补丁脚本,编译Makefile和编译指令

./package

各种功能的软件包,软件包仅包含Makefile、补丁及配置文件

./scripts

存放了一些脚本,使用了 bash,Python,perl 等多种脚本语言

./target

嵌入式平台,包含特定的嵌入式平台内容

./toolchain

编译器和C库,例如包含编译工具gcc和glibc库

./tools

通用命令,用来生成固件的辅助工具,如patch/make/spuashfs等

OpenWrt 根目录包含以下文件

文件

内容描述

Config.in

在include/toplevel.mk中可以看到,这是和make menuconfig相关联的文件

Makefile

顶层目录执行make命令的入口文件

feeds.conf.default

配置下载第三方一些软件包时所使用的地址

rules.mk

定义了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

openwrt rsync 是否运行 openwrt snort_openwrt rsync 是否运行


这是需要配置目标设备的一些信息,方便生成符合要求的固件。我们以树莓派为例,树莓派的硬件信息,可以在树莓派实验室 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,打印以下信息,说明没有出错

openwrt rsync 是否运行 openwrt snort_树莓派_02

2.4 编译

# 编译前可更新,也可以不更新
make

这样就生成定制的镜像了。当然,我们也可以使用官方已经编译好的镜像文件。

3 树莓派 OpenWrt 镜像安装

OpenWrt 官网提供了适配各种硬件的镜像包。以树莓派为例,支持的镜像如下,由于是第一次使用树莓派安装 OpenWRT,选择 factory 的镜像

openwrt rsync 是否运行 openwrt snort_python_03


如果你觉得官方镜像下载速度过慢,和其他 Linux 发行版一样,你还可以使用国内提供的镜像地址,中科大 OpenWrt 镜像Win32 Disk Imager 是一款常用的将镜像烧录到 SD 卡的工具,如果你觉得链接网速过慢,也可以自行百度下载。

openwrt rsync 是否运行 openwrt snort_openwrt rsync 是否运行_04


实践证明,用 Win32 Disk Imager 烧录,可能存在的问题是,OpenWrt 无法正常启动,一直卡在彩虹界面

openwrt rsync 是否运行 openwrt snort_git_05

Etcher 是一款优秀的 U盘镜像制作工具,功能很强大,当然 Ether 软件本身的体积也很大

openwrt rsync 是否运行 openwrt snort_树莓派_06


注意,烧录文件的时候,需要先格式化 SD 卡,推荐使用 SDCardFormatter。

烧录成功之后,启动树莓派,后续的 Web 页面配置操作,让树莓派充当路由器,树莓派实验室提供了更为精确的说明 树莓派安装 OpenWrt 打造超级路由器

4 虚拟机安装 OpenWrt

从官网或者国内的镜像源,下载 x86 架构的 OpenWrt。解压并将镜像转换成符合 Vmware 支持的格式镜像

openwrt rsync 是否运行 openwrt snort_python_07

$ 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 rsync 是否运行 openwrt snort_git_08


打开虚拟机,OpenWrt 运行成功!

openwrt rsync 是否运行 openwrt snort_python_09


需要手动配置 IP 地址,才能让宿主机访问 OpenWrt,目的是让它们在同一网段上。查看一下 OpenWrt 原始网卡

openwrt rsync 是否运行 openwrt snort_python_10


配置网络,让宿主机和物理机处于同一网段

ifconfig br-lan 192.168.229.100 netmask 255.255.255.0

现在可以愉快的访问该路由器啦

openwrt rsync 是否运行 openwrt snort_openwrt rsync 是否运行_11


后续的其他设置,可以访问 树莓派安装 OpenWrt 打造超级路由器 3

5 总结

OpenWrt 作为一个优秀的开源项目,为家用路由器的发展奠定了坚实的基础。本文只是介绍了 OpenWrt,并初步分析其一般的用法,不仅介绍源码编译的一般方式,也介绍了官方镜像安装的方法,通过在树莓派和虚拟机两种不同的平台,安装 OpenWrt 镜像,我们可以对 OpenWrt 有一个感性的认识。我们最终的目的是,用 OpenWrt 定制属于自己的路由器固件,从而能够对家用路由器背后的原理有一个全面的认识,因此,接下来,我们要不断深入挖掘 OpenWrt 背后的秘密。


  1. https://yq.aliyun.com/articles/97610 ↩︎
  2. https://openwrt.org/docs/guide-developer/quickstart-build-images ↩︎
  3. https://www.lxx1.com/3294 ↩︎