交叉编译:OpenWRT On Raspi 3B+!

    OpenWRT,一个嵌入式的 Linux 发行版系统,不但轻量,而且拥有强大的网络组件和扩展性,是一个强大的路由器系统;
树莓派3B+,一个只有卡片大小的嵌入式计算机,不但性能强悍,而且拥有丰富的可拓展性,是不少硬件玩家的最爱。
而OpenWRT+树莓派3B+,那就成了一台超级软路由!

那么,现在就让我们从零开始,搭建一台属于自己的软路由,突破校园网设备数量限制、叠加带宽吧

一、硬件准备

主要根据需求。因为我还需要连接一台交换机,所以我的硬件清单如下:

  • 树莓派3B+主机一台
  • 32GB SD卡一张(最小64MB都可以,2G推荐)
  • ASIX USB 100Mbps 有线网卡一个
  • 5V 2A 电源一个(为树莓派供电)
  • 网线若干(上网用)

这里特别说明一下SD卡:OpenWRT是非常小的一个系统,它还可以被刷进市面上的路由器,而这些路由器显然没有足够的存储空间(通常64MB)。这里我使用32GB的SD卡是因为我还计划在树莓派上搭建Samba服务,用来共享文件。

(如果树莓派还是全新未开封,那么最好还是先安装一下官方的系统试试,看看各个功能是否运转正常。)

硬件准备好了,那么现在就开始吧!

二、如果不想麻烦自己编译…

emmm,其实OpenWRT官方提供了一个为树莓派编译好的系统,只不过我试了试,发现无法启动。貌似网上大多数人也遇到了这种情况。据说是因为那是专为3B提供的,而不是3B+。不过这里还是提一下,贴个链接吧。

https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi

这是OpenWRT专为树莓派编译的镜像。

三、编译环境搭建

首先引入交叉编译的概念:(通俗地讲)就是在一个系统中生成另一个系统的可执行文件…电脑上运行的程序的底层代码和手机的不一样,所以手机就无法直接运行电脑程序…就是这个意思…

树莓派虽然在卡片电脑里算性能强悍的,但是比起我们的台式计算机、笔记本电脑,那可还是小巫见大巫。因为在树莓派上直接编译OpenWRT会耗时太久,所以我们要在电脑上更加快速地编译。

编译环境,除了硬件方面(电脑配置),还有就是要安装一些基本的编译软件~还有获取一些构成OpenWRT系统的一些资源~总之就是装装装!

当然,如果看得懂原文,就更好了。
https://openwrt.org/docs/guide-developer/start

1、虚拟机搭建(可选)

虚拟机环境硬件配置:

  • CPU:4x 3GHz
  • RAM:4GB
  • 操作系统:Ubuntu 18.04 LTS
虚拟机配置

2、安装必要软件

参考: https://openwrt.org/docs/guide-developer/quickstart-build-images

sudo apt install build-essential libncurses5-dev python unzip
sudo apt install subversion g++ zlib1g-dev build-essential git python time
sudo apt install libncurses5-dev gawk gettext unzip file libssl-dev wget
sudo apt install libelf-dev
sudo apt install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

3、获取源代码

先cd到将要存储源代码的目录,然后执行:

git clone https://git.openwrt.org/openwrt/openwrt.git/
cd openwrt

直接下载可能有些慢,如果允许也可以使用下载工具从GitHub下载源代码:
https://github.com/openwrt/openwrt/archive/master.zip
下载完后解压到一个文件夹,并进入。

或者使用proxychains代理下载:

proxychains git clone https://git.openwrt.org/openwrt/openwrt.git/
cd openwrt

4、下载并检查源

此时你应该位于/.../.../openwrt目录,执行以下命令:

./scripts/feeds update -a
./scripts/feeds install -a

此时留意屏幕上的提示。如果看到提示说可能缺少一些包,也要用apt安装上
(不过也不是一定要全部都安装,貌似…)

5、检查依赖环境

make defconfig

此时可能还会提示缺少一些软件包。这里提示缺少的则需要尽量都装上。

四、配置

上面的步骤完成后,就可以配置待会儿需要编译的组件了(即选择功能)

make menuconfig

稍等片刻,应该会出现这个界面:

配置主页

这就是OpenWRT的配置主页了

下面我们一起来配置!

配置列表和说明

下面是勾选的列表:

  • Target System
    • Broadcom BCM27xx
  • Subtarget
    • BCM2710 64 bit based boards
  • Target Profile
    • Raspberry Pi 3B/3B+
  • Target Images 【注1】
    • squashfs
    • (128) Kernel partition size (in MB)
    • (2048) Root filesystem partition size (in MB)
  • Global build settings
    • Compile with support for patented functionality(2019.6.9更新,这个不一定需要)
    • Kernel build options
      • Enable support for printk(内核调试信息输出相关)
    • 按需选择
  • Base system
    • dnsmasq不选
    • 选择dnsmasq-full
    • 选择wireless-tools
    • 其他按需选择
  • Administration
    • 按需选择
  • Boot Loaders
    • 默认已经选好
  • Development
    • 一些编译工具,按需选择
  • Extra packages
    • 网上下载的或者自己写的软件包,一般空的,具体以后再说
  • Firmware(固件)
    • brcmfmac-board-rpi3
  • Fonts
    • 字体库,不选也不会影响网页管理字体的显示
  • Kernel modules
    • Block Devices
      • kmod-block2mtd
    • Cryptographic API modules
      • 加密库,建议多选
    • Filesystems
      • kmod-fs-configfs(默认已选)
      • kmod-fs-squashfs(一定要选!)
    • Network Devices
      • kmod-macvlan(虚拟VLAN支持)
    • Network Support
      • 对网络接入协议的支持(PPPoE等),按需选择
    • USB Support
      • kmod-usb-core(USB支持核心组件)
      • kmod-usb-hid(USB键盘鼠标支持)
      • kmod-usb-net(USB网卡支持)
        • 根据网卡型号按需选择
      • kmod-usb-ohci
      • kmod-usb-storage
      • kmod-usb-storage-extras
      • kmod-usb-uhci
      • kmod-usb-wdm
      • kmod-usb2
    • Wireless Drivers(无线网卡驱动)
      • kmod-ath
      • kmod-ath9k-htc
      • kmod-brcmfmac
  • Languages
    • 对编程语言的支持,按需选择
  • Libraries
    • 一些软件接口。按需选择
  • LuCI
    • Collections
      • luci-ssl-nginx(带HTTPS支持,Nginx提供网页服务)
    • Modules
    • Applications
      • luci-app-mwan3(多线负载均衡界面)
      • luci-app-opkg(软件包管理界面)
      • luci-app-samba4(文件共享管理界面)
      • luci-app-statistics(统计图表功能)
      • luci-app-upnp(Upnp功能)
      • luci-app-wifischedule(WiFi计划启用)
      • luci-app-wol(网络唤醒功能管理)
    • Themes
      • luci-theme-material(好看的Material主题)
    • Protocols
    • Libraries
  • Mail
  • Multimedia
  • Network
  • Sound
  • Utilities
  • Xorg

【注1】 Target Images
1、推荐使用squashfs文件系统,而不是EXT4。因为suqashfs文件系统由两个分区组成,一个分区存储出厂时记录的数据,另一个分区存储修改后的数据。这样的好处是可以轻松地将修改后的数据抹除掉,相当于“恢复出厂设置”。在OpenWRT管理界面里面也有这个功能。而若选择ext4文件系统,则无法回复出厂设置。
2、squashfs文件系统的另一个好处就是生成的镜像文件非常小,而不像ext4镜像保留了原始大小。
3、内核大小一般默认即可,内核设置了多大,最后生成的squashfs文件就大概有多大。
4、 Root filesystem partition size 就是设置文件系统的分区大小有多大。

五、开始编译

在保存了配置后,就可以开始编译了:(先别急着执行!)

make

编译可能很慢。一方面是因为代码比较多,另一方面是因为编译过程中会自动下载一些缺失的依赖包。如果有条件可以使用代理下载:

proxychains make

也可以先只下载所有需要的软件包:

make download

或使用代理:

proxychains make download

然后再编译:

make

如果需要查看编译信息:

make V=99

如果编译出错,可以查看编译信息,也可以使用单线程编译:

make V=99 -j1

如果追求速度,那就多线程编译:(极大可能出现错误)

make V=99 -j5

所以推荐这样执行:

proxychains make V=99 -j1

执行过程可能需要一个晚上,所以执行完后就睡觉去吧~(第二天早上就会发现编译失败)

最后将生成一个镜像文件于/.../.../openwrt/bin/targets/brcm2708/bcm2710文件夹,烧录至SD卡,上电运行,就OK啦

(撒花~)

================================

(2019年6月9日更新)

六、修改编译

最近重新编译了一下OpenWRT固件,编译完后发现忘记加几个功能了,于是就回去make menuconfig了一下,结果报错说'xxxxx.ko is built-in'

重新试了几次,还是不行。。。于是看了一下它的源代码。结果发现如果之前编译成功过, openwrt/bin 文件夹和 openwrt/build_dir 文件夹是有内容的。而在编译Linux内核时,会检查这些文件夹下的某些文件夹是否包含了一些内核模块。如果找到了对应的内核文件,则会认为这个文件是内核默认包含了的。而编译器又发现我们在 .config 文件中要求安装这个内核文件,那么就会报错。

所以,在之前编译成功后,如果要再次编译,则需执行清理:

make clean

这个命令是删除 bin 和 build_dir 的目录。
清除完后,再make就可以正常编译了。

附:关于清理的更多命令

Clean
删除 bin 和 build_dir 目录

make clean

Dirclean
删除 bin build_dir staging_dir toolchain 目录
相当于完全清除

make dirclean

Distclean
删除以上所有,还包括已经下载好的包、编译好的文件、feeds,包括 .config 文件
相当于全新安装

make distclean

发表评论