Blog/content/awesome-openwrt.md
2025-01-18 22:20:41 +08:00

14 KiB
Raw Blame History

+++ title = "综合工程:OpenWrt路由部署与软件编译" date = 2023-08-12

[taxonomies] tags = ["综合工程"] +++

前言 openwrt 是一个自由的、兼容性好的嵌入式 linux 发行版。作为软路由玩家必备的一款神器可以实现诸如去广告多拨和科学上网等多种功能。本文介绍openwrt在各种平台上的部署流程。

选择合适的设备

无论是传统的无线路由器还是小主机都有成为openwrt路由的潜力。截止到今天已经有20多个品牌小米华硕锐捷华三等30多种架构x86,ipq,bcm,mtd等支持刷入openwrt你可以在这个网站找到符合你预算和其他要求的,能刷机的路由器。 传统家用无线路由器由于主频低,内存小,并不适合作为软路由;而 NAS-软路由一体式 又有 all in boom 的风险因此推荐X86平台作为物理机。当然也可以采用 armbian 平台或是开发板例如网心云老母鸡、树莓派等设备。截至本文撰写时间二手平台上的价格不太利好一台J1900平台的售价往往在200左右而专门的多网口工控机价格在200到1000不等树莓派更是成为了理财产品需要慎重选择。

选择合适的系统

除了openwrt主线外还可以选择

  • LEDE 高质量更新快速具有新特性的openwrt分支。

  • iStoreOS iStoreOS是openwrt的一个分支iStoreOS 提供了软件中心iStore以及较美观的界面和docker支持对新手体验较好。

  • ImmortalWrt 是一个原版openwrt的分支中文优化好更新也勤快内置镜像源可以直连下载&更新。

如何得到一个openwrt系统

  • 可以在恩山论坛上使用他人编译好的现成的镜像,如"高大全","精品小包"等等,但存在一定风险;
  • 可以使用官方固件下载得到一个最小化的系统,再一步步添加自己要用的包;
  • 可以使用Openwrt 在线编译Openwrt.ai在线编译 一个固件;
  • 可以使用GitHub action 云编译一个固件;
  • 可以在本地linux环境中进行编译。

X86平台安装准备

X86平台安装流程

1.进入PE环境

  • 打开微PE将其安装进U盘中安装完成后将 img 工具和 openwrt 包一起放进去;
  • 将U盘插入目标主机进入 BIOS-boot 设置U盘优先启动各主板进入 BIOS 的按键不同,不确定的话建议都试一遍。

2.格式化硬盘并写盘

  • 进入PE环境中可以看到存在名为“分区助手”的软件打开它并将目标主机硬盘格式化注意不要分区不要分区不要设置文件系统否则后续可能无法编译点击左上角提交并执行
  • 打开img写盘工具将openwrt包写入硬盘注意不要写进U盘里。

3.进入配置界面

  • 重启系统并快速拔出U盘避免重新进入PE这时系统开始运行了。注意Esir固件是不跑码的无需担心。- 一个U盘与一台双网口物理机
  • 当看到 please press Enter to activate this console这个提示的时候系统就安装完毕了。可使用 passwd 命令设置密码。软路由将自动获取IP地址随后我们在浏览器中打开该地址即可看到 Lucl 界面。

硬盘空间有一部分没有被格式化可以手动格式化为ext4并挂载。

注意初始IP往往是192.168.1.1,如果和光猫冲突需要在网络-接口中更改。

基本系统主题比较简陋可以使用luci-theme-argon。

刷错主题无法打开luci通过 SSH 登录路由器,切换到另一个已知正常的主题(例如 Bootstrap uci set luci.main.mediaurlbase='/luci-static/bootstrap' uci commit luci /etc/init.d/uhttpd restart 然后重新访问 Web 界面,查看是否恢复正常。

X86平台编译完整openwrt

  • 系统版本Debian 11 或者 Ubuntu LTS

  • 网络要求:科学上网环境,配置推荐 2H4G 以上

  • 编译依赖

安装依赖

sudo apt update -y

sudo apt full-upgrade -y

sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache clang cmake cpio curl device-tree-compiler flex gawk gcc-multilib g++-multilib gettext \
genisoimage git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libfuse-dev libglib2.0-dev \
libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev \
libreadline-dev libssl-dev libtool llvm lrzsz msmtp ninja-build p7zip p7zip-full patch pkgconf \
python3 python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion \
swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

  • 清理
sudo apt autoremove --purge
sudo apt clean
  • 新建一个用户,用于编译固件(可选)
useradd -m openwrt  # 新建一个名为 openwrt 的用户

不可以使用Root用户进行编译!!

  • 修改用户默认的 Shell
apt install -y sudo

usermod -s /bin/bash openwrt
  • 切换用户
su openwrt

cd ~
  • 拉取源码,这里用的是 LEDE 分支源码:
git clone https://github.com/coolsnowwolf/lede

cd lede
  • 添加软件源,可自行添加软件源至 feeds.conf.default 文件也可以直接git添加需要的软件到lede目录下
vim feeds.conf.default
常用源
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git haibo https://github.com/haiibo/openwrt-packages
src-git liuran001 https://github.com/liuran001/openwrt-packages
  • 单独添加(在更新并安装插件之前执行)例如:
git clone https://github.com/chenmozhijin/turboacc.git
  • 更新并安装插件
./scripts/feeds clean

./scripts/feeds update -a

./scripts/feeds install -a
  • 自定义配置

修改默认IP为 10.0.0.2

sed -i 's/192.168.1.1/192.168.2.1/g' package/base-files/files/bin/config_generate

修改默认主机名

sed -i '/uci commit system/i\uci set system.@system[0].hostname='OpenWrt'' package/lean/default-settings/files/zzz-default-settings

加入编译者信息

sed -i "s/OpenWrt /smith build $(TZ=UTC-8 date "+%Y.%m.%d") @ OpenWrt /g" package/lean/default-settings/files/zzz-default-settings

修改默认主题

sed -i "s/luci-theme-bootstrap/luci-theme-argon/g" feeds/luci/collections/luci/Makefile

执行 make menuconfig 命令进入编译菜单。

  • 菜单选项说明

选择 CPU 类型

Target System (x86) --> # 软路由选择 x86硬路由根据型号厂家自行选择

Subtarget (x86_64) --> # CPU 子选项

Target Profile (Generic x86/64) --> # 厂家具体型号

设置镜像编译的格式squashfsext4

Target Images --> # 默认 squashfs

添加较多插件时为了避免空间不足建议修改下面两项默认大小x86/64

Target Images --> (16) Kernel partition size (in MB) # 默认是16建议修改为256

开启 IPv6 支持

Extra packages --> ipv6helper选定这个后下面几项会自动选择

开启适用于 VMware 的 VMware Tools

Utilities --> open-vm-tools

Utilities --> open-vm-tools-fuse

选择插件

LuCI --> Applications # 根据需要选择,* 代表编入固件M 表示编译成模块或者IPK包为空表示不编译

选择主题

LuCI --> Themes # 选择喜欢的主题,可以选多个

配置完成后使用编译菜单底部的 Save 保存,然后退出菜单 Exit开始下载软件包

  • 预下载编译所需的软件包
make download -j8
  • 检查文件完整性
find dl -size -1024c -exec ls -l {} \;

检查文件完整性命令可以列出下载不完整的文件小于1k的文件属于下载不完整如果存在则用下面的命令删除然后重新下载编译所需的软件包再次检查.确认所有文件完整可大大提高编译成功率,避免浪费时间

find dl -size -1024c -exec rm -f {} \;

最后编译固件,编译完成后输出路径是 bin/targets,默认密码是 password.

  • 编译固件(-j 后面是线程数,首次编译推荐用单线程)
make V=s -j1
  • 二次编译

拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码

cd lede

git pull

./scripts/feeds update -a

./scripts/feeds install -a

清除旧的编译产物和目录(可选)

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

更换架构编译前必须执行

此操作会删除 /bin 和 /build_dir 目录的中的文件make clean以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件

同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志

make defconfig

make download -j8

find dl -size -1024c -exec ls -l {} \;

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

如果需要重新配置

rm -rf ./tmp && rm -rf .config # 清除临时文件和编译配置文件

make menuconfig

make download -j8

find dl -size -1024c -exec ls -l {} \;

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

Arm平台安装OpenWrt

相比X86平台arm架构的设备兼容性不高不能随便找一个包就能安装。以下是一般步骤

  • 首先得知道你的设备的CPU比如ipq40XX系列然后在对应的仓库查看并下载包体。

  • 当然也可以在这里直接下载相关型号对应的固件,其中 Sysupgrade 映像是用来更新现有运行 OpenWrt 的设备,使用 Factory 映像在首次刷机时刷入。

  • 随后开启Telnet或者SSH或者TTL串口连接到路由器将对应的Uboot刷入如果没有适配的包就无法刷openwrt。

  • 通过Uboot的网络界面刷入Factory包随后就可以在后台如192.168.1.1进入openwrt的管理界面。

在ubuntu上单独编译openwrt的ipk包

这里以ubuntu环境为例我们假设你有一台虚拟机或者WSL。

注意编译不能使用Root用户

随后安装编译依赖的各个包:

sudo apt install python3-distutils-extra git gawk libncurses-dev build-essential binutils bzip2 diff find flex gawk gcc-6+ getopt grep install libc-dev libz-dev make4.1+ perl python3.7+ rsync subversion unzip which

sudo apt install -y build-essential python3-dev python3-setuptools swig \
    libmesa-dev libwayland-dev libgraphene-dev \
    gawk wget git-core diffstat unzip texinfo gcc-multilib \
    libncurses5-dev libncursesw5-dev zlib1g-dev \
    libssl-dev flex bison gperf libxml-parser-perl \
    python-is-python3 python3-pip gettext

sudo apt install -y swig
sudo apt install -y mesa-common-dev libwayland-dev libgraphene-1.0-dev

随后下载我们刷入openwrt的对应的SDK包,如

git clone https://github.com/immortalwrt/immortalwrt.git

下载和安装仓库信息

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

下载并选中我们需要编译的包,这里以inyn为例

git clone https://github.com/diredocks/openwrt-inyn.git ./package/inyn
make menuconfig

menuconfig 的命令行界面中,选中 Network -> inyn 将其首部调整为 <M> 表示按需编译,最后选中 Save -> OK -> Exit 保存配置信息,然后 Exit 退出配置。

编译 inyn 软件包

make package/inyn/compile V=s
## 如果不行则需要先编译工具链,即为 make j=4 j为CPU核数

常用命令:

# 更新软件列表
opkg update

# 更新所有 LUCI 插件
opkg list-upgradable | grep luci- | cut -f 1 -d ' ' | xargs opkg upgrade

# 如果要更新所有软件,包括 OpenWRT 内核、固件等
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

新版本的openwrt24.10已经改用APK包管理器。

最终实现目标

  • 1.IPv6 分配到每个设备;
  • 2.NAT类型为NAT1全锥形
  • 3.可控的流量记录与IP控制/QOS
  • 4.可靠的硬件加速;
  • 5.多线多播/宽带提速;
  • 6.PPPoE拨号替代一部分光猫功能
  • 7.智能DNS配置与去广告
  • 8.VPN配置回家
  • 9.实现透明代理。

剩余专业路由功能可以由ROS替代服务则跑在NAS系统上避免ALL in Boom

🔗