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
- Block Devices
- 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
- Collections
- 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