找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3068

积分

0

好友

446

主题
发表于 16 小时前 | 查看: 0| 回复: 0

什么样的 U-Boot 可以被称为“刷机友好”?简单来说,它应该满足下面几个核心条件:

  1. 进入刷机界面方便:通常只需在路由器启动时长按 Reset 键,就能通过浏览器访问一个 Web 刷机界面。
  2. 刷机功能丰富
    • 备份与恢复:能够备份整个闪存或特定分区(如存放 MAC 地址、无线校准数据的 Factory 分区),这在刷机后恢复关键数据时非常有用。
    • 刷写引导程序与固件:这是最基础也是最重要的功能。
    • 加载并运行 Initramfs 系统:当 Web 界面无法直接完成某些操作时(例如不支持直接刷写 *.itb 格式的固件),可以加载一个运行在内存中的临时系统,在这个系统里执行更复杂的刷机操作。
    • 动态调整 U-Boot 闪存布局:大多数路由器系统要求 U-Boot 的闪存分区布局与固件一致。如果 U-Boot 自身支持修改布局,就能在不重刷 U-Boot 的前提下适配不同固件,大大降低了因布局不匹配而“变砖”的风险。否则,一旦 U-Boot 刷错,往往需要拆机接 TTL 或使用编程器才能救回。

今天介绍的这款开源 U-Boot 项目—— bl-mt798x-dhcpd,就能完美满足以上所有需求。它对联发科(MediaTek)MT798x 系列芯片的路由器做了大量机型适配,是一个功能强大的开源项目选择。

U-Boot Web 恢复界面功能菜单

首先,你可以通过 OpenWrt 官方代码库查看哪些 MT798x 路由器支持刷写 OpenWrt 系统:

支持刷 OpenWrt 的 mt798x 路由器

https://git.openwrt.org/?p=openwrt/openwrt.git;a=tree;f=target/linux/mediatek/dts;hb=HEAD

bl-mt798x-dhcpd 项目基于 hanwckf/bl-mt798x 进行了二次开发,主要增强了其 Web 恢复模式(Web Failsafe)的功能:

bl-mt798x-dhcpd 项目地址

https://github.com/Yuzhii0718/bl-mt798x-dhcpd

下面,我们将以 H3C Magic NX30 Pro 路由器为例,详细介绍如何编译这个 U-Boot、刷入 U-Boot,以及如何使用它来刷机。

一、编译 U-Boot(以 H3C Magic NX30 Pro 为例)

1. 获取源码并应用可选补丁

首先,克隆项目代码。如果你希望 U-Boot 直接支持刷写 FIT 镜像(*.itb 文件),可以应用一个补丁(此补丁主要适配 U-Boot 2022 版)。如果不应用,U-Boot 将无法直接刷写 *.itb 固件,但依然可以通过先加载 initramfs.itb 系统,再在该系统中刷写。

git apply modify-patch/0002-uboot-2022-fit-merge-code-from-1715173329-to-support.patch

2. 配置编译参数进行编译

核心的编译命令如下,关键参数解释:

  • MULTI_LAYOUT=1:启用多闪存布局支持,这需要你提供对应的 _multi_layout_defconfig 文件。
  • FIXED_MTDPARTS=0:允许通过 mtdparts 环境变量动态修改闪存布局。
SOC=mt7981 BOARD=h3c_magic-nx30-pro VERSION=2025 MULTI_LAYOUT=1 FIXED_MTDPARTS=0 ./build.sh

注意:原作者并未为 h3c_magic-nx30-pro 提供 2025 版的适配文件。而要想在 Web Failsafe 下修改闪存布局,必须使用 U-Boot 2025 版。因此,我们需要参考作者对其他机型(如 mt7981-cmcc_a10)的 2025 版适配,自行创建适配文件(以下示例默认启用 NMBM)。

参考适配提交

https://github.com/Yuzhii0718/bl-mt798x-dhcpd/commit/cfe93f98bbdcf430467c454f9f655b355553bdb8

1. 设备树源文件 (mt7981-h3c_magic-nx30-pro.dts):

// SPDX-License-Identifier: GPL-2.0

/dts-v1/;
#include "mt7981.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/linux-event-codes.h>

/ {
        #address-cells = <1>;
        #size-cells = <1>;
        model = "mt7981-h3c_magic-nx30-pro";
        compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";

        chosen {
                stdout-path = &uart0;
                tick-timer = &timer0;
        };

        config {
                bootcmd = "mtkboardboot";
                blink_led = "green:status";
                system_led = "red:status";
        };

        mtd-layout {
                layout@0 {
                        label = "default";
                        // mtd layout for stock ubi firmware, support immortalwrt/openwrt 64M ubi firmware
                        mtdids = "nmbm0=nmbm0";
                        mtdparts = "nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),65536k(ubi),6144k(pdt_data),6144k(pdt_data_1),1024k(exp),38400k(plugin)";
                };
                layout@1 {
                        label = "112m";
                        // mtd layout for stock ubi firmware, support immortalwrt/openwrt 112M ubi firmware
                        mtdids = "nmbm0=nmbm0";
                        mtdparts = "nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),114688k(ubi)";
                };
                layout@2 {
                        label = "expand(114m)";
                        // mtd layout for 114m ubi firmware
                        mtdids = "nmbm0=nmbm0";
                        mtdparts = "nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),116736k(ubi)";
                };

                layout@3 {
                        label = "qwrt";
                        // mtd layout for lean qwrt
                        mtdids = "nmbm0=nmbm0";
                        mtdparts = "nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),1024k(rsv0),110M(ubi)";
                };
        };

        gpio-keys {
                compatible = "gpio-keys";

                key-reset {
                        label = "reset";
                        linux,code = <KEY_RESTART>;
                        gpios = <&pio 1 GPIO_ACTIVE_LOW>;
                };

                key-wps {
                        label = "wps";
                        linux,code = <KEY_WPS_BUTTON>;
                        gpios = <&pio 0 GPIO_ACTIVE_LOW>;
                };
        };

        gpio-leds {
                compatible = "gpio-leds";

                led-0 {

                        label = "green:status";
                        gpios = <&pio 4 GPIO_ACTIVE_LOW>;
                };

                led-1 {
                        label = "red:status";
                        gpios = <&pio 5 GPIO_ACTIVE_LOW>;
                };
        };

        memory@40000000 {
                device_type = "memory";
                reg = <0x40000000 0x10000000>;
        };

        bl2_verify {
                bl2_compatible = "spim-nand";
        };
};

&uart0 {
        status = "okay";
};

&uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart1_pins>;
        status = "disabled";
};

ð {
        status = "okay";
        mediatek,gmac-id = <0>;
        phy-mode = "2500base-x";
        mediatek,switch = "auto";
        reset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>;

        fixed-link {
                speed = <2500>;
                full-duplex;
        };
};

&pio {
        spi_flash_pins: spi0-pins-func-1 {
                mux {
                        function = "flash";
                        groups = "spi0", "spi0_wp_hold";
                };

                conf-pu {
                        pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
                        drive-strength = <MTK_DRIVE_4mA>;
                        bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
                };

                conf-pd {
                        pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
                        drive-strength = <MTK_DRIVE_4mA>;
                        bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
                };
        };

        spic_pins: spi1-pins-func-1 {
                mux {
                        function = "spi";
                        groups = "spi1_1";
                };
        };

        uart1_pins: spi1-pins-func-3 {
                mux {
                        function = "uart";
                        groups = "uart1_2";
                };
        };

        /* pin15 as pwm0 */
        one_pwm_pins: one-pwm-pins {
                mux {
                        function = "pwm";
                        groups = "pwm0_1";
                };
        };

        /* pin15 as pwm0 and pin14 as pwm1 */
        two_pwm_pins: two-pwm-pins {
                mux {
                        function = "pwm";
                        groups = "pwm0_1", "pwm1_0";
                };
        };

        /* pin15 as pwm0, pin14 as pwm1, pin7 as pwm2 */
        three_pwm_pins: three-pwm-pins {
                mux {
                        function = "pwm";
                        groups = "pwm0_1", "pwm1_0", "pwm2";
                };
        };

        /* pin13 as pwm0, pin15 as pwm1, pin7 as pwm2 */
        three_pwm_pins_1: three-pwm-pins {
                mux {
                        function = "pwm";
                        groups = "pwm0_0", "pwm1_1", "pwm2";
                };
        };
};

&spi0 {
        #address-cells = <1>;
        #size-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&spi_flash_pins>;
        status = "okay";
        must_tx;
        enhance_timing;
        dma_ext;
        ipm_design;
        support_quad;
        tick_dly = <2>;
        sample_sel = <0>;

        spi_nand@0 {
                compatible = "spi-nand";
                reg = <0>;
                spi-max-frequency = <52000000>;
        };
};

&pwm {
        pinctrl-names = "default";
        pinctrl-0 = <&two_pwm_pins>;
        status = "okay";
};

&watchdog {
        status = "disabled";
};

2. 默认配置文件 (mt7981_h3c_magic-nx30-pro_defconfig):

CONFIG_ARM=y
CONFIG_SYS_HAS_NONCACHED_MEMORY=y
CONFIG_POSITION_INDEPENDENT=y
CONFIG_ARCH_MEDIATEK=y
CONFIG_TEXT_BASE=0x41e00000
CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x20000
CONFIG_ENV_OFFSET=0x0
CONFIG_DEFAULT_DEVICE_TREE="mt7981-h3c_magic-nx30-pro"
CONFIG_TARGET_MT7981=y
CONFIG_DEBUG_UART_BASE=0x11002000
CONFIG_DEBUG_UART_CLOCK=40000000
CONFIG_SYS_LOAD_ADDR=0x46000000
CONFIG_DEBUG_UART=y
CONFIG_MEDIATEK_BOOTMENU=y
CONFIG_MEDIATEK_BOOTMENU_DELAY=3
CONFIG_MTK_WEB_FAILSAFE=y
CONFIG_MTK_WEB_FAILSAFE_AFTER_BOOT_FAILURE=y
CONFIG_MTK_UBI_SUPPORT=y
CONFIG_MTK_UPGRADE_BL2_VERIFY=y
# CONFIG_MTK_UPGRADE_IMAGE_VERIFY is not set
CONFIG_ENABLE_NAND_NMBM=y
CONFIG_FIT=y
CONFIG_MD5=y
CONFIG_AUTOBOOT_MENU_SHOW=y
CONFIG_AUTOBOOT_MENU_MTK_SHOW=y
CONFIG_DEFAULT_FDT_FILE="mt7981-spim-nand-rfb"
CONFIG_SYS_CBSIZE=512
CONFIG_SYS_PBSIZE=1049
CONFIG_LOGLEVEL=7
CONFIG_LOG=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="MT7981> "
# CONFIG_BOOTM_NETBSD is not set
# CONFIG_BOOTM_PLAN9 is not set
# CONFIG_BOOTM_RTEMS is not set
# CONFIG_BOOTM_VXWORKS is not set
# CONFIG_CMD_ELF is not set
# CONFIG_CMD_XIMG is not set
# CONFIG_CMD_UNLZ4 is not set
# CONFIG_CMD_UNZIP is not set
CONFIG_CMD_BOOTMENU=y
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_GPIO_READ=y
# CONFIG_I2C is not set
CONFIG_CMD_PWM=y
CONFIG_CMD_MTD=y
CONFIG_CMD_NMBM=y
CONFIG_CMD_TFTPPUT=y
CONFIG_CMD_PING=y
CONFIG_CMD_SMC=y
CONFIG_CMD_MTDPARTS=y
CONFIG_MTDIDS_DEFAULT="nmbm0=nmbm0"
CONFIG_MTDPARTS_DEFAULT="nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),65536k(ubi),6144k(pdt_data),6144k(pdt_data_1),1024k(exp),38400k(plugin)"
CONFIG_CMD_GL_BTN=y
CONFIG_OF_EMBED=y
CONFIG_CMD_SHOW_MTD_LAYOUT=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MTD=y
CONFIG_ENV_MTD_DEV="u-boot-env"
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_USE_IPADDR=y
CONFIG_IPADDR="192.168.1.1"
CONFIG_USE_NETMASK=y
CONFIG_NETMASK="255.255.255.0"
CONFIG_USE_SERVERIP=y
CONFIG_SERVERIP="192.168.1.2"
CONFIG_PROT_TCP=y
CONFIG_REGMAP=y
CONFIG_SYSCON=y
CONFIG_BUTTON=y
CONFIG_BUTTON_GPIO=y
CONFIG_CLK=y
# CONFIG_DM_I2C is not set
# CONFIG_I2C_SET_DEFAULT_BUS_NUM is not set
# CONFIG_I2C is not set
CONFIG_LED=y
CONFIG_LED_BLINK=y
CONFIG_LED_GPIO=y
# CONFIG_MMC is not set
CONFIG_DM_MTD=y
CONFIG_MTD_SPI_NAND=y
CONFIG_PHY_FIXED=y
CONFIG_MEDIATEK_ETH=y
# CONFIG_PCIE_MEDIATEK is not set
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7981=y
CONFIG_POWER_DOMAIN=y
CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SPI=y
CONFIG_DM_SPI=y
CONFIG_MTK_SPIM=y
CONFIG_TIMER=y
CONFIG_MTK_TIMER=y
CONFIG_HEXDUMP=y
# CONFIG_EFI_LOADER is not set

3. 多布局配置文件 (mt7981_h3c_magic-nx30-pro_multi_layout_defconfig):

CONFIG_ARM=y
CONFIG_SYS_HAS_NONCACHED_MEMORY=y
CONFIG_POSITION_INDEPENDENT=y
CONFIG_ARCH_MEDIATEK=y
CONFIG_TEXT_BASE=0x41e00000
CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x20000
CONFIG_ENV_OFFSET=0x0
CONFIG_DEFAULT_DEVICE_TREE="mt7981-h3c_magic-nx30-pro"
CONFIG_TARGET_MT7981=y
CONFIG_DEBUG_UART_BASE=0x11002000
CONFIG_DEBUG_UART_CLOCK=40000000
CONFIG_SYS_LOAD_ADDR=0x46000000
CONFIG_DEBUG_UART=y
CONFIG_MEDIATEK_BOOTMENU=y
CONFIG_MEDIATEK_BOOTMENU_DELAY=3
CONFIG_MTK_WEB_FAILSAFE=y
CONFIG_MTK_WEB_FAILSAFE_AFTER_BOOT_FAILURE=y
CONFIG_MTK_UBI_SUPPORT=y
CONFIG_MTK_UPGRADE_BL2_VERIFY=y
# CONFIG_MTK_UPGRADE_IMAGE_VERIFY is not set
CONFIG_ENABLE_NAND_NMBM=y
CONFIG_NMBM_MAX_BLOCKS=64
CONFIG_FIT=y
CONFIG_MD5=y
CONFIG_AUTOBOOT_MENU_SHOW=y
CONFIG_AUTOBOOT_MENU_MTK_SHOW=y
CONFIG_DEFAULT_FDT_FILE="mt7981-spim-nand-rfb"
CONFIG_SYS_CBSIZE=512
CONFIG_SYS_PBSIZE=1049
CONFIG_LOGLEVEL=7
CONFIG_LOG=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="MT7981> "
# CONFIG_BOOTM_NETBSD is not set
# CONFIG_BOOTM_PLAN9 is not set
# CONFIG_BOOTM_RTEMS is not set
# CONFIG_BOOTM_VXWORKS is not set
# CONFIG_CMD_ELF is not set
# CONFIG_CMD_XIMG is not set
# CONFIG_CMD_UNLZ4 is not set
# CONFIG_CMD_UNZIP is not set
CONFIG_CMD_BOOTMENU=y
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_GPIO_READ=y
# CONFIG_I2C is not set
CONFIG_CMD_PWM=y
CONFIG_CMD_MTD=y
CONFIG_CMD_NMBM=y
CONFIG_CMD_TFTPPUT=y
CONFIG_CMD_PING=y
CONFIG_CMD_SMC=y
CONFIG_CMD_MTDPARTS=y
CONFIG_CMD_GL_BTN=y
CONFIG_OF_EMBED=y
CONFIG_MEDIATEK_MULTI_MTD_LAYOUT=y
CONFIG_CMD_SHOW_MTD_LAYOUT=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MTD=y
CONFIG_ENV_MTD_DEV="u-boot-env"
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_USE_IPADDR=y
CONFIG_IPADDR="192.168.1.1"
CONFIG_USE_NETMASK=y
CONFIG_NETMASK="255.255.255.0"
CONFIG_USE_SERVERIP=y
CONFIG_SERVERIP="192.168.1.2"
CONFIG_PROT_TCP=y
CONFIG_REGMAP=y
CONFIG_SYSCON=y
CONFIG_BUTTON=y
CONFIG_BUTTON_GPIO=y
CONFIG_CLK=y
# CONFIG_DM_I2C is not set
# CONFIG_I2C_SET_DEFAULT_BUS_NUM is not set
# CONFIG_I2C is not set
CONFIG_LED=y
CONFIG_LED_BLINK=y
CONFIG_LED_GPIO=y
# CONFIG_MMC is not set
CONFIG_DM_MTD=y
CONFIG_MTD_SPI_NAND=y
CONFIG_PHY_FIXED=y
CONFIG_MEDIATEK_ETH=y
# CONFIG_PCIE_MEDIATEK is not set
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7981=y
CONFIG_POWER_DOMAIN=y
CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SPI=y
CONFIG_DM_SPI=y
CONFIG_MTK_SPIM=y
CONFIG_TIMER=y
CONFIG_MTK_TIMER=y
CONFIG_HEXDUMP=y
# CONFIG_EFI_LOADER is not set

编译成功后,会在相应目录生成 U-Boot 文件。对于 H3C Magic NX30 Pro,生成的文件名类似:mt7981_h3c_magic-nx30-pro_2025-fip-dhcpd-Yuzhii-multi-layout.bin

二、刷入 U-Boot(以 H3C Magic NX30 Pro 为例)

重要提示:刷机有风险,操作前请务必备份重要数据!

方法一:通过原 U-Boot 刷写(如果支持)

如果路由器当前的 U-Boot 提供了刷写 U-Boot 的功能,可以直接在 U-Boot 的 Web 界面中上传并刷入新的 U-Boot 文件。

方法二:在现有系统中通过 SSH 刷写

如果原 U-Boot 不支持刷写,则需要通过 SSH 登录到路由器现有的系统(如 OpenWrt)中进行刷写。

  1. 启用 MTD 分区写权限
    需要安装并加载一个允许写入 MTD 分区的内核模块。

    opkg update
    opkg install kmod-mtd-rw
    opkg files kmod-mtd-rw # 查找模块路径
    cd /lib/modules/6.6.119 # 进入对应内核版本的模块目录,版本号请根据实际情况修改
    insmod mtd-rw.ko i_want_a_brick=1

    加载 mtd-rw 内核模块

  2. 写入新的 U-Boot 到 FIP 分区
    使用 mtd write 命令将编译好的 U-Boot 文件写入对应的分区(通常是 FIP 分区)。

    mtd write mt7981_h3c_magic-nx30-pro_2025-fip-dhcpd-Yuzhii-multi-layout.bin FIP

    执行 mtd write 命令刷写 U-Boot

写入完成后,重启路由器即可进入新的 U-Boot。

三、使用新 U-Boot 为路由器刷入系统

刷机前,请再次确认已备份闪存中的重要数据(如 Factory 分区)。

关键步骤:确保闪存布局一致

成功刷机的首要条件是 U-Boot 的闪存布局必须与你要刷写的固件完全一致。否则,系统将无法正常启动。

  1. 如何获知固件的闪存布局?
    查看固件配套的设备树源文件(.dts)或咨询固件发布者。例如,H3C Magic NX30 Pro 在 ImmortalWrt 24.10 中的 DTS 文件位置:https://github.com/immortalwrt/immortalwrt/blob/openwrt-24.10/target/linux/mediatek/dts/mt7981b-h3c-magic-nx30-pro.dts

  2. 调整 U-Boot 闪存布局

    • 必须有一个 ubi 分区,且其大小必须与固件中定义的 ubi 分区大小严格相等。理想情况下,整个分区表都应一致。
    • 如果布局不符,你可以在 U-Boot 的 Web Failsafe 界面中操作:
      • 方法 A:使用内置终端。在“系统” -> “终端”中,使用 fw_setenv mtdparts 命令直接设置。例如,将 H3C Magic NX30 Pro 恢复为出厂布局:
        fw_setenv mtdparts 'nmbm0:1024k(bl2),512k(u-boot-env),2048k(Factory),2048k(fip),65536k(ubi),6144k(pdt_data),6144k(pdt_data_1),1024k(exp),38400k(plugin)'
      • 方法 B:选择预设布局bl-mt798x-dhcpd 2025 版已在 Web 界面提供了修改闪存布局的入口。你可以在“系统” -> “终端”里执行命令,也可以直接在刷固件时,在“选择 mtd 布局”下拉菜单中选择已内置的布局。
        Web界面中的终端入口
        固件升级时选择预设的MTD布局
  3. 执行网络刷机
    当 U-Boot 中的 ubi 分区布局与固件匹配后,就可以进行刷机了。路由器通电时长按 Reset 键,启动进入 Web Failsafe 界面(默认地址 http://192.168.1.1),在“固件升级”页面选择 sysupgrade 格式的系统固件文件并上传。
    在 Web Failsafe 界面中上传固件

处理特殊格式固件(*.itb)

对于 *.itb 格式的固件,有两种刷写方式:

  • 方式1:在编译 U-Boot 时,应用前文提到的支持 FIT 镜像的补丁,这样 U-Boot 就能直接刷写 *.itb 文件。
  • 方式2:如果 U-Boot 不支持直接刷写,可以先在 Web Failsafe 中“加载 Initramfs”,上传并启动一个 *initramfs*.itb 格式的内存系统。然后,在这个临时系统中,再刷写 *.itb 格式的 sysupgrade 固件。
    加载 Initramfs 系统

解决刷机后可用空间异常小的问题

有时刷完系统后,你会发现可用空间(即 ubi 分区内的 rootfs_data 卷)远小于 【ubi分区大小 - kernel卷大小 - rootfs卷大小】 的理论值。此时,可以:

  1. 进入 Web Failsafe 并加载一个 initramfs 系统。
  2. SSH 登录该临时系统。
  3. 执行 mtd erase ubi 命令擦除整个 UBI 分区。
  4. 重新进入 Web Failsafe 刷写 sysupgrade 固件。

使用 ubinfo 查看 UBI 分区及各卷大小

四、重要注意事项:关于 NMBM

本项目 U-Boot 的 2023/2025 版默认启用了 NMBM(NAND 闪存坏块管理)。这是一个重要的特性,能提升闪存寿命和可靠性。

  • 强烈建议:刷写同样启用了 NMBM 的系统固件。ImmortalWrt 24.10 等新版系统通常会提供启用 NMBM 的 DTS 文件,你可以在技术文档或源码中看到类似下面的配置:
    DTS 中启用 NMBM 的配置片段

  • 警告:如果你刷入了不兼容/不支持 NMBM 的引导程序或固件,它们将无法识别被 NMBM 重映射的闪存区域,可能导致关键数据无法读取,从而使设备“变砖”。这种数据损坏的风险可能是不可逆的,强行混刷甚至可能直接损坏 NAND 闪存上的原始数据(如无线校准数据)。

  • 如果需要刷写不支持 NMBM 的系统
    你必须编译一个不启用 NMBM 的 U-Boot。使用 2022 版源码,并确保不开启 NMBM 选项进行编译:

    SOC=mt7981 BOARD=h3c_magic-nx30-pro VERSION=2022 MULTI_LAYOUT=0 FIXED_MTDPARTS=0 ./build.sh

    请注意,此版本没有内置多闪存布局,Web Failsafe 中也没有修改布局的图形界面,只能通过加载 initramfs 系统后使用 fw_setenv mtdparts 命令来设置闪存布局。

希望这篇详细的指南能帮助你为 MT798x 路由器更换一个功能强大、刷机友好的 U-Boot,享受更自由的路由器定制体验。




上一篇:JWT算法混淆漏洞复现:从普通用户到管理员权限提升
下一篇:单片机指针实战指南:从内存地址到硬件寄存器操控(STM32嵌入式C语言)
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-28 19:13 , Processed in 0.264881 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表