OpenWrt 是一款路由器操作系统。如果你想要给自己的路由器安装 OpenWrt 的话,一般来说使用别人已经构建好的 OpenWrt 固件就够用了。当然如果你闲得没事干,那么也可以自己构建固件。

Prerequisites

  • CPU:必须为 amd64 架构
  • 操作系统:Ubuntu 22.04
  • 非 root 环境
  • 15 GB 空闲空间

Build

  1. 安装依赖:

    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 ecj fastjar flex gawk gettext gcc-multilib \
    g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
    libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5 \
    libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool lld llvm lrzsz mkisofs msmtp \
    nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip python3-ply \
    python3-docutils python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig \
    texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd
  2. 克隆源代码库OpenWrt 项目有多个子分支。ImmportalWrt 是根据国人需求改进的 OpenWrt 分支,ImmportalWrt-MT798Xhanwckf 大佬在 ImmportalWrt 的基础上为 MediaTek MT798X 系列芯片做的适配。

    %%{init: { 'gitGraph': {'mainBranchName': 'OpenWrt', 'showCommitLabel': false }} }%%
    gitGraph
    commit
    commit

    branch ImmortalWrt
    commit
    commit tag: "v21.02"

    branch ImmortalWrt-MT798X
    commit
    commit
    commit

    checkout OpenWrt
    commit
    checkout ImmortalWrt
    commit

    克隆你需要的库:

    # OpenWrt
    git clone -b <branch> --single-branch --filter=blob:none https://github.com/openwrt/openwrt.git
    cd openwrt # ImmortalWrt
    git clone -b <branch> --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
    cd immortalwrt # ImmortalWrt-798X
    git clone --filter=blob:none https://github.com/hanwckf/immortalwrt-mt798x
    cd immortalwrt-mt798x

    branch:

  3. 更新 feeds。feeds 配置了我们想要安装的插件。

    1. 编辑 feeds 配置文件 feeds.conf(可省略)

    2. 更新并安装 feeds:

    # 获取 feeds.conf / feeds.conf.default 中定义的所有最新软件包定义
    ./scripts/feeds update -a # 请确认命令是否执行成功 # 将所有获取的软件包的符号链接安装到 package/feeds/ 中
    ./scripts/feeds install -a
  4. 配置构建选项:

    make menuconfig  # 为工具链、目标系统和固件包选择首选配置

    方向键选中条目,回车键应用下方的操作,左右键切换操作。

    1. 首先要配置构建系统的目标平台。通过 Target SystemSubtargetTarget Profile 三个选项一起配置。

      • Target System:构建系统的目标架构,通常指定你要为其构建固件的硬件平台类型。例如,常见的目标系统包括 Atheros AR7xxx/AR9xxxBroadcom BCM27xxMediaTek Ralink MIPS 等等。
      1. Subtarget:有些目标系统会有不同的子目标,它们代表了更具体的硬件配置或者变种。例如,对于某些 SoC,不同的子目标可能代表不同的芯片型号或者不同的硬件功能。

      2. Target Profile:目标配置文件进一步细化到了具体的设备级别。它通常包括了特定设备的硬件特性和配置,例如内存大小、闪存布局、网卡配置等。

      以我的 Redmi AX6000 为例,对构建系统配置如下:

      • Target System: MediaTek Ralink ARM
      • Subtarget: MT7986
      • Target Profile: Xiaomi Redmi Router AX6000
    2. 接下来要配置目标固件镜像格式(Target Image)。这里介绍一下常用的选项:

      Root filesystem images

      将构建的 OpenWrt 系统的根目录 / 打入映像文件。这里我们可以选择磁盘映像内的文件系统:

      • ext4:一种常用的 Linux 文件系统,支持读写操作。如果你的固件要刷入 PC 机或虚拟机,那么可以使用这种文件系统。

      • squashfs:一种只读的压缩文件系统,常用于嵌入式设备以减少存储空间占用。

        • Build GRUB EFI images:构建适用于 EFI(UEFI 前身)硬件的 x86 平台的 GRUB 引导镜像。现在的嵌入式设备都是 EFI 了。

          • Build LiveCD image (ISO):构建一个可引导的 ISO 镜像文件,如果你要往 PC 机刷固件的话可以用这种格式
          • Build VMware image files (VMDK):构建适用于 VMware 虚拟机的 VMDK 镜像文件
          • GZip Images:将生成的固件映像文件进行 GZip 压缩
    3. 上面的配置都与你的目标平台有关。从现在开始你可以定制自己的 OpenWrt 了。这里我们主要编辑的是 LuCICollectionsApplicationsThemes 配置。

      • * 表示将模块包含进固件(按 Y
      • M 表示模块将单独编译,不会包含进固件(按 M
      • (空白)表示不编译该模块(按 N

      首先将 LuCI -> Collections -> LuCI 选中,这将启用 LuCI Web 配置界面。接下来在 LuCI -> Applications 中选中你喜欢的插件。然后在 LuCI -> Themes 中选择你喜欢的主题。最后在 LuCI -> Modules -> Translations 选择语言。

    4. 配置完成后退出并保存。配置文件将被保存到项目根目录下的 .config 文件中。

    更多关于插件的解释可以参见:OpenWrt 编译 LuCI -> Applications 添加插件应用说明-L大【2022.11.28】| 恩山无线论坛

  5. 构建固件

    make -j $(($(nproc)+1)) download world  # 下载依赖,然后使用多线程构建

    编译过程需要 2 个小时左右。

    该命令会:

    1. 编译工具链
    2. 然后用这个工具链交叉编译源文件
    3. 创建 opkg 软件包
    4. 创建镜像

Artifacts

  • 构建产物位于 bin/targets/{platform}/{subtarget}/ 目录中。
  • 构建时生成的工具链位于 staging_dir/toolchain-{arch}_gcc-{gcc-version}_musl

一个完整的 OpenWrt 固件由两部分组成:rootfs(根文件系统)和 kernel(内核)。这两部分共同组成了设备启动和运行所需的基本软件环境。

  • 内核:openwrt-{arch}-kernel.bin
  • 根文件系统:openwrt-{arch}-squashfs-rootfs.bin

在实际使用中,OpenWrt 通常会将这两部分结合起来生成一个完整的固件映像文件,例如:

  • openwrt-{arch}-squashfs-sysupgrade.bin:用于系统升级的固件映像。
  • openwrt-{arch}-squashfs-factory.bin:用于初次刷入设备的固件映像。
  • openwrt-{arch}-combined.bin:一些平台会生成结合了内核和根文件系统的单一镜像文件。

此外,在构建过程中 OpenWrt 还会生成一些元数据文件:

  • config.buildinfo 记录了构建过程中使用的所有配置选项
  • feeds.buildinfo 记录了构建过程中使用的所有软件包源
  • openwrt-{arch}.manifest 记录了构建过程中所选的所有软件包及其版本信息
  • packages 文件夹包含了根据你的配置编译和打包的所有软件包
  • sha256sums 包含了所有生成文件的 SHA-256 校验和
  • version.buildinfo 记录了当前构建所使用的 OpenWrt 版本信息,包括主版本号、分支名称、Git 提交哈希等。
  • profiles.json 包含了构建目标(profiles)的详细信息。这对于了解支持的设备、生成的固件以及配置特性非常有用。

Clean

在开始新的构建前,你可能想要清理上次构建的产物。

  • 清理构建产物:

    make clean  # 删除 /bin 和 /build_dir 中的内容
  • 完全清理:

    make dirclean  # 删除 /bin、/build_dir、/staging_dir(工具和交叉编译工具链)、/tmp(有关软件包的数据)和 /logs 中的内容

Appandix

一些名词:

  • Stock firmware:原厂固件

  • Stock layout:原厂分区(容量较小)

  • Uboot layout:U-Boot 大分区(容量较大)

参见:OpenWrt 文件名格式,安装固件前了解 | 喵二

预编译固件:

Web 配置界面:

参见:

Troubleshooting

Ubuntu 24.04 无法安装 Python2.7

参见:Ubuntu 24.04 安装 Python 2.7

构建 OpenWrt的更多相关文章

  1. 在主机上如何构建openwrt的编译环境?

    答: 请参考官方文档

  2. openwrt开发笔记一:源码下载与编译

    1.1 环境要求 编译系统:Linux发行版(本文使用Ubuntu) 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空 ...

  3. openwrt构建过程探索

    参考网站:http://wiki.openwrt.org/doc/howto/buildroot.exigence 需要下载必要的库文件,编译器等... 1 首先要获得openwrt的源码,参考ope ...

  4. 嵌入式文件系统构建工具 busybox / buildroot / openwrt

    1.busybox busybox最轻量 1) 修改Makefile CROSS_COMPILE ?= /usr/local/gcc-linaro-arm-linux-gnueabihf/bin/ar ...

  5. 【OpenWRT】【RT5350】【一】OpenWrt开发环境搭建

    [宿主机构建] 本人电脑配置如下: CPU: intel 酷睿 i3 3.3G 双核 内存: 金士顿 8G 硬盘:希捷 1TB 7200rpm 操作系统:win7  旗舰版 64位 OpenWrt是在 ...

  6. OpenWrt自定义和官方一样的固件

    我用的OpenWrt版本是Barrier Breaker 14.07,硬件是NetGear WNDR4300. 我自定义固件的目的是把固件的根分区扩到最大(100MB,总FLASH是128MB),试过 ...

  7. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  8. openwrt的交叉编译

    默认情况下,openwrt编译脚本会自动从Internet上获取所需要的软件包源代码,并把下载的源码包存放在当前目录的 dl/ 目录中:  在 build_dir/ 目录中存放编译中使用的软件包,   ...

  9. OpenWrt for vmware 从openwrt.org下载10.03.1 或是自己下载最新的源码进行编译生成x86 vmdk格式

    1,直接从OpenWrt.org官网下载 http://downloads.openwrt.org/backfire/10.03.1/x86_generic/ 更新OpenWrt在线软件源 opkg ...

  10. openwrt教程 第一章 物联网&amp;openwrt开发概述

    1.1 我们的宗旨 互联网.移动互联网的时代已经过去,物联网的时代已经来临!2014年,是物联网元年,2016年,物联网将达到高潮!为了迎接该潮流,我们工作室(F403科技创意室:http://f40 ...

随机推荐

  1. 详解Web应用安全系列(5)敏感数据泄露漏洞

    在最近几年,这是最常见的,最具影响力的攻击.这个领域最常见的漏洞是不对敏感数据进行加密.在数据加密过程中,常见的问题是不安全的密钥生成和管理以及使用弱密码算法,弱协议和弱密码.特别是使用弱的哈希算法来 ...

  2. python学习_PIL的Image模块初步使用

    基本介绍: Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像.调整图像大小和图像颜色处理等.与 Pillow 相比,OpenCV 和 Scikit-imag ...

  3. SpringBoot连接数据库的方式

    1.Spring集成的服务 直接通过注入方式使用,如redis,jdbc等等服务. spring: redis: host: localhost port: 6379 password: 123456 ...

  4. Vue 怎么用 vm.$set() 解决对象新增属性不能响应的问题 ?

    受现代 JavaScript 的限制 ,Vue 无法检测到对象属性的添加或删除.由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 ...

  5. yb课堂 新版VueCli 4.3创建vue项目,Vue基础语法入门 《二十九》

    Vue模版语法开发起步 基于HTML的模版语法,允许声明式地将DOM绑定至底层Vue实例的数据 用简洁的模版语法来声明式的将数据渲染进DOM的系统 结合响应系统,在应用状态改变时,Vue能够智能地计算 ...

  6. 基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

    系统介绍: 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于网络书店商城当然也不能排除在外,随着网络技术的不断成熟,带动了网络书店商城,它彻底改变了过去传统 ...

  7. oeasy教您玩转linux010210管理应用aptitude

    上一部分我们都讲了什么? 下载并运行了 hollywood hollywood 更新了源的信息 sudo apt update 查看所有已经安装的软件包 # dpkg deiban 本地包管理 dpk ...

  8. SQL Server 帐号权限管理及C#编程应用(图解)

    昨晚在群里讲解这部分内容,因为好久没操作过了,差点翻车...今天把它整理一下发出来,方便没听明白的小伙伴学习和理解. 我们平时学习数据库时,要么使用sa帐号,要么用windows默认帐号登录,总之都拥 ...

  9. Java基础学习知识点框架(详细)

    //学习网站 Java研发技术学习路线_飞月程序人生-CSDN博客_java开发学习路线 Java后端技术栈梳理 - 知乎 harrywfl/JavaGuide: [Java学习+面试指南] 一份涵盖 ...

  10. 【Python】Django学习1

    按黑马程序员的美多商场作方向: https://www.bilibili.com/video/BV1nf4y1k7G3 一.应用创建.注册处理.配置 Pycharm 创建Django项目: 自应用注册 ...