前言

  OpenWrt目前有诸多版本,最常见的版本有以下四个:
  Offical 版:官方原版,官网:https://openwrt.org/ ,github地址:https://github.com/openwrt/openwrt ,初始用户root,初始密码为空。
  Lean 版:使用 Lean 大源码编译,运行稳定,插件数量略多于 Offical 版,luci界面较为美观,默认情况下,建议使用此版,也是现在目前大部分用户使用的版本。新版github地址:https://github.com/coolsnowwolf/lede ;旧内核版本地址:https://github.com/coolsnowwolf/openwrt ,默认登陆IP 192.168.1.1,初始用户root,初始密码password。
  X-ray 版:官网:https://x-wrt.com/ ,github地址:https://github.com/x-wrt/x-wrt
  immortalwrt 版:官网:https://immortalwrt.org/ ,github地址:https://github.com/immortalwrt/immortalwrt/
  固件文件名中带有 ext4 字样的文件为搭载 ext4 文件系统固件,ext4 格式的固件更适合熟悉 Linux 系统的用户使用,在 Linux 下可以比较方便地调整 ext4 分区的大小;
  固件文件名中带有 squashfs 字样的文件为搭载 squashfs 文件系统固件,而 squashfs 格式的固件适用于 “不折腾” 的用户,其优点是可以比较方便地进行系统还原,哪怕你一不小心玩坏固件,只要还能进入控制面板或 SSH,就可以很方便地进行 “系统还原操作”。
  固件文件名中带有 factory 字样的文件为全新安装 OpenWrt 所用的固件,推荐在全新安装 OpenWrt 时解压 gz 文件刷入 SD 卡或硬盘。
  固件文件名中带有 sysupgrade 字样的文件为升级 OpenWrt 所用的固件,无需解压 gz 文件,可直接在 Luci 面板中升级。

首次编译固件

# 准备环境:Ubuntu 18.04 / 20.04 LTS 系统最好,存储空间60G起步,安装编译环境
sudo apt update -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
# 切换非root账户,并连好梯子(略)
# 克隆github上的源码(放在当前目录下的openwrt文件夹内),这里以lean大的源码为例
git clone https://github.com/coolsnowwolf/lede openwrt
cd openwrt
# 下载(更新)feeds源码并安装
./scripts/feeds update -a
./scripts/feeds install -a
# 调整 OpenWrt 编译固件类型和组件
make menuconfig
# 首次编译建议只选择架构,其它都不要动,这样编译成功率会更高。如果不打算调整组件则输入make defconfig,它会检测编译环境并生成默认的编译配置文件。
# 预下载编译所需的软件包
make download -j4  # -j8指的是使用4个线程进行下载
# 检查文件是否过小的情况
find dl -size -1024c -exec ls -l {} \;
# 根据我多次编译的经验得出,小于1k的文件属于下载不完整,如果存在这样的文件可以使用find dl -size -1024c -exec rm -f {} \;命令将它们删除,
# 然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。
# 开始正式编译
make -j4 V=s  # 这里使用4线程进行编译。V=s:输出详细日志,用于编译失败时找出错误。
# 如果出现错误,再执行make -j1 V=s ,可以看错误,解决以后继续make -j4 V=s编译。
# 这里不建议一上来就make -j1,普通PC编译完差不多要四个多小时,速度很慢,出错以后再用单线程排错。
# 编译完成后固件会放在bin文件夹下

再次编译同固件

# 进入源码目录(如果不在此目录)
cd openwrt
# 更新系统软件包
sudo sh -c "apt update && apt upgrade -y"
# 拉取 OpenWrt 源码更新
git pull
# 下载(更新)feeds源码并安装
./scripts/feeds update -a
./scripts/feeds install -a
# 清除旧的编译产物(可选)
# 在源码有大规模更新或者内核更新后执行,以保证编译质量。此操作会删除/bin和/build_dir目录中的文件。
make clean
# 调整 OpenWrt 编译固件类型和组件
make menuconfig
# 首次编译建议只选择架构,其它都不要动,这样编译成功率会更高。如果不打算调整组件则输入make defconfig,它会检测编译环境并生成默认的编译配置文件。
# 预下载编译所需的软件包
make download -j4  # -j8指的是使用4个线程进行下载
# 开始正式编译
make -j4 V=s  # 这里使用4线程进行编译。V=s:输出详细日志,用于编译失败时找出错误。

高级编译固件

# 文件清理:

# 在源码有大规模更新或者内核更新后执行,以保证编译质量。
# 此操作会删除/bin和/build_dir目录中的文件。
make clean

# 更换架构编译前必须执行该操作。
# 此操作会删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件。
make dirclean

# 清除所有编译产生的文件。
# 除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。
make distclean

# 还原 OpenWrt 源码到初始状态
# 如果把源码改坏了,或者长时间没有进行编译时使用。
git clean -xdf

# 删除执行make menuconfig后产生的一些临时文件。
# 包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。
rm -rf tmp

编译插件

  网上的教程大部分都是下载LEDE的源码,如果只编译插件,最好还是用官方原版SDK包,好处是里面已经有了一些编译工具,不需要到处填坑了。比如我的就是下载:https://downloads.openwrt.org/releases/21.02.1/targets/x86/64/openwrt-sdk-21.02.1-x86-64_gcc-8.4.0_musl.Linux-x86_64.tar.xz
  下载以后解压,然后进入该目录,之后网上教程这个时候一般都是让你 scripts/feeds updata -a && scripts/feeds install -a,经我实验,如果只编译插件,这一步可以跳过。
  直接把插件源码放到SDK包的packages下面,然后就make package/你的插件文件夹名称/compile V=99,根据提示,安装缺少的依赖就可以。如果提示staging_dir/host/bin/ 下面缺少某个文件,这个就在ubuntu本机找,一般是/usr/bin下面,复制过去就可以了。