从零开始的 Openwrt 及其衍生版编译

2022-02-26
2分钟阅读时长

软路由实在是比硬路由好用多了,现有的固件也都差强人意,自己编译固件的时候遇到了许多问题,所以在这里写下。

这里的东西仅代表个人观点,实际操作可能因人而异。

选择最适合你的 OpenWrt 分支

  • Openwrt
  • Lede
  • ImmortalWrt

个人建议使用 ImmortalWrt,Lede 第二推荐,在国内的网络环境下,使用 Openwrt 主分支属于自讨苦吃。

环境配置

系统及存储空间

推荐使用 Linux,我个人使用的是 Arch Linux,环境配置只要跑一遍哪个缺补哪个就行。

不过大部分人用的都是 Ubuntu,我还是在这放下 Ubuntu 的依赖吧。

# ubuntu 20.04
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync
# ubuntu 18.04
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget swig rsync

存储空间看你想编译带多少插件的 Wrt,根据本人经验最好分配 100G 的空间给系统,桌面发行版占用存储空间大的自行增加。

网络

需要流畅的国际联网,编译时会下载很多东西。

在网络环境不好的时候,会出现文件校验失败的问题,如果多次重下无果,可以参照下面的解决方案。

  1. 找到 scripts/download.pl 这个文件,使用编辑器打开

  2. 在 280 行左右找到 exit 0 if $sum eq $file_hash;(以 OpenWrt 为例)。

    if (-f "$target/$filename") {
    $hash_cmd and do {
    if (system("cat '$target/$filename' | $hash_cmd > '$target/$filename.hash'")) {
    die "Failed to generate hash for $filename\n";
    }
    
    my $sum = `cat "$target/$filename.hash"`;
    $sum =~ /^(\w+)\s*/ or die "Could not generate file hash\n";
    $sum = $1;
    
    cleanup();
    exit 0 if $sum eq $file_hash;
    
    die "Hash of the local file $filename does not match (file: $sum, requested: $file_hash) - deleting download.\n";
    unlink "$target/$filename";
    };
    }
    
  3. 在下面添加一行 exit 0 if $sum eq "<your sha256 hash>";

综上,推荐使用国外的 VPS 进行编译,核心数量自己挑。

准备编译

::: info 确保你不是在用 root 用户执行操作,如果是,请赶紧切换为普通用户 :::

克隆相关仓库

# ImmortalWrt
git clone https://github.com/immortalwrt/immortalwrt.git
# Lede
git clone https://github.com/coolsnowwolf/lede.git
# OpenWrt
git clone https://github.com/openwrt/openwrt.git

进入仓库并执行更新,如果有自定义源需要添加请在更新前添加

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

配置编译选项

::: warning 一定要保存!!!
不然有你好受的。
配置中不会提示冲突包,所以在编译后要手动修改,把冲突包去掉,这是很不好的一点。 :::

make menuconfig

下载软件包

make download -j8

开始编译

一次编译

make -j1 V=s
# -j 为线程数,首次编译推荐单线程,不然会出奇奇怪怪的问题
# V=s 为输出详细日志

二次编译

拉取最新源码(可选)

git pull

清理构建文件

make clean
# 需要切换架构的还要
make dirclean

调整配置

make menuconfig

更新软件包

make download -j8

再次编译

make -j$(nproc) || make -j1 V=s

常用软件包列表

  1. luci-app-adguardhome DNS 和网址过滤
  2. luci-app-autoreboot 高级重启
  3. luci-app-baidupcs-web Baidu PCS
  4. luci-app-smartdns DNS 服务器,我现在最常用的
  5. luci-app-unblockneteasemusic 解锁网易云音乐
  6. luci-app-arpbind 绑定 IP 到指定的 MAC 地址
  7. luci-app-ddns 域名解析
  8. luci-app-filetransfer 文件传输
  9. luci-app-frpc frp 客户端
  10. luci-app-frps frp 服务端
  11. luci-app-upnp UPnP
  12. luci-app-mtwifi 闭源 wifi 驱动

有些特殊的包没有放出来,如果你需要它,请自行寻找。

Avatar

Nullpinter

越过长城,走向世界