因为想要将路由升级为X86_64平台的软路由,并且主机上使用Proxmox VE搭建虚拟环境,同时跑OpenWrt和基于CoreOS的Docker环境,这就需要自己编译一个支持KVM虚拟机的OpenWrt镜像(官方给出的预编译64位镜像不支持KVM,只有32位镜像支持KVM),所以要先为编译OpenWrt准备编译环境。目前的OpenWrt官方教程由于之前和LEDE项目的分分合合,可用性很差,以下为根据对过程的回忆勉强写下的记录。仅供参考。
编译机是租用GCP平台的VPS,4核vCPU,15G内存,30G硬盘,CentOS 7.0系统。按时间收费,不进行编译工作的时候关机,所以实际使用费用并不高。
一、搭建编译环境
由于CentOS使用yum
包管理系统,所以不需要像apt-get
一样更新源。我们直接运行
sudo yum update
更新已安装的所有软件包。
然后开始安装编译OpenWrt所需的依赖包。
xxxxxxxxxx
sudo yum install autoconf binutils bison bzip2 flex gawk gcc gcc-c++ gettext git-core make ncurses-devel patch unzip wget zlib-devel
xxxxxxxxxx
sudo yum group install "Development Tools"
至此,依赖包应该都安装完成了,yum
包管理系统的"Development Tools"真的很给力,当然我们之后还会进行依赖包检查,如果仍有缺失的依赖包,就按照提示进行安装即可。
二、正式编译前的代码准备工作
首先我们现在github上下载OpenWrt的源代码。
xxxxxxxxxx
git clone https://www.github.com/openwrt/openwrt
上述代码为OpenWrt项目主干代码。也可以通过添加-b xxxxx
选择某个发行版的代码,例如:
xxxxxxxxxx
git clone https://www.github.com/openwrt/openwrt -b chaos_calmer
现在我们已经有了OpenWrt的源代码,cd
进入openwrt文件夹,运行如下代码再运行一次代码更新。
xxxxxxxxxx
git pull
然后我们运行如下命令,更新OpenWrt源并将更新的软件包安装好。虽然官方说可以只更新不安装,但是如果想在编译时选择Luci,此步不可忽略。
xxxxxxxxxx
./scripts/feeds update -a
./scripts/feeds install -a
至此,我们正式完成了所有的准备工作,即将开始正式编译。
三、配置编译参数、正式编译及编译完成后的清理
配置编译参数
现在我们已经做完了所有准备工作,该开始配置编译镜像的参数了。运行下列命令启动一个基于ncurses
的文本配置界面。
xxxxxxxxxx
make kernel_menuconfig
该命令运行你自定义内核选项,主要需要启用的有如下选项。
x
64-bit kernel
//启用64位内核
<*>Virtualization
//启用虚拟化支持
Virtualization -> <*>Kernel-based Virtual Machine (KVM) support
<*>KVM for Intel processors support
<*>KVM for AMD processors support
//启用对Intel和AMD处理器的KVM支持
保存后退出。
然后我们运行如下命令,进行编译镜像的参数配置。
xmake menuconfig
其中我们会看到很多选项,大类如下
x
Target System
//目标设备芯片类型,AxWRT系统只保留了Ralink RT288x/RT3xxx。教学板MT7620芯片就是RT系列的升级版
Subtarget
//目标子类型,一般是具体板子类型
Target Profile
//针对不同路由器的版本再做的一个明确选项参数,一般默认即可
Target Images
//生成的固件文件采用何种分区格式
Global build settings
//编译时的一些全局参数,这些参数与Linux内核或GCC编译器相关
Advanced configuration options
//高级选项参数,用于OpenWrt开发人员,一般用不上
Build the OpenWrt Image Builder
//除了编译固件,再编译一个固件编译环境,可以分发给团队中的其他人使用。
Build the OpenWrt SDK
//产生OpenWrt SDK环境,就是另外一个开发环境
Build the OpenWrt based Toolchain
//单独编译出OpenWrt的交叉编译工具
Image configuration
//编译好的固件所附带的参数信息
Package features
//一些软件包特性
Base system
//基本系统命令软件包
Administration
//高级管理命令软件包
Boot Loaders
//引导程序,教学板不用固件附带,所以这里无选项
Development
//开发用工具包
Firmware
//不要被名字混淆了,这个的意思是,固件中是否带某些其他外围芯片的固件
Kernel modules
//内核编译参数,这里的参数都来自芯片厂对内核的预设配置
Languages
//编程语言软件包
Libraries
//库软件包
LuCI
//OpenWrt下顶顶大名的LuCI界面包
Mail
//电子邮件相关的软件包
Multimedia
//多媒体软件包
Network
//网络相关的软件包
Sound
//声音相关的软件包
Utilities
//工具软件包
Video Streaming
//视频流服务软件包
可以看到选项非常多,以下说明几个常用的功能所需要启用的选项。
x
//启用 Web 管理界面 LuCI,并启用中文支持
LuCI → Collections → 选中 luci
LuCI → Modules → Translations → 选中 Chinese(zh-cn)
//添加DDNS支持,这里直接添加Luci的DDNS支持,根据依赖包,会安装对应的DDNS功能包
LuCI—>Applications —> <*>luci-app-ddns.
//添加支持USB自动mount功能
//添加USB相关支持
Kernel modules —> USB Support —> <*> kmod-usb-core
Kernel modules —> USB Support —> <*> kmod-usb-ohci
Kernel modules —> USB Support —> <*> kmod-usb-uhci
Kernel modules —> USB Support —> <*> kmod-usb-storage
Kernel modules —> USB Support —> <*> kmod-usb-storage-extras
Kernel modules —> USB Support —> <*> kmod-usb2
//添加USB挂载
Base system —> <*>block-mount
//添加自动挂载工具
Utilities —> Filesystem —> <*> badblocks
//添加文件系统支持
Kernel modules —> Filesystems —> <*> kmod-fs-ext4 (移动硬盘EXT4格式选择)
Kernel modules —> Filesystems —> <*> kmod-fs-vfat(FAT16 / FAT32 格式 选择)
Kernel modules —> Filesystems —> <*> kmod-NTFS(NTFS选择,具体是什么忘记了,总之有NTFS字样的)
//添加UTF8编码,CP437编码,ISO8859-1编码
Kernel modules —> Native Language Support —> <> kmod-nls-utf8
Utilities ---> disc ---> <> fdisk manipulate disk partition table
Utilities ---> <*> usbutils USB devices listing utilities
当然还有很多其他的选项,要耐心进行逐项检查,以免白白浪费时间。选择完毕之后保存退出。
正式编译
现在我们终于可以开始编译了。使用如下指令开始编译。
xxxxxxxxxx
make -j 4 V=s
其中-j 4
指使用4个处理器核心进行编译,V=s
指显示所有编译信息。要注意的是使用多个核心进行编译有可能出现随机错误。
编译会耗费较长时间,编译完成之后生成的镜像会出现在~/openwrt/bin
文件夹中,去选取对应的镜像下载即可。
清理工作
最后我们进行编译完成之后的清理工作,可以使用如下三个命令。
x
make clean
#删除bin和build_dir目录的内容。
make dirclean
#删除bin和build_dir目录的内容,并删除staging_dir和交叉编译工具。
make distclean
#删除编译或配置的所有内容,包括下载的所有feed和软件包。大杀器,如果之后还想进行编译的话,慎用!
评论
发表评论