什么样的 U-Boot 可以被称为“刷机友好”?简单来说,它应该满足下面几个核心条件:
- 进入刷机界面方便:通常只需在路由器启动时长按 Reset 键,就能通过浏览器访问一个 Web 刷机界面。
- 刷机功能丰富:
- 备份与恢复:能够备份整个闪存或特定分区(如存放 MAC 地址、无线校准数据的 Factory 分区),这在刷机后恢复关键数据时非常有用。
- 刷写引导程序与固件:这是最基础也是最重要的功能。
- 加载并运行 Initramfs 系统:当 Web 界面无法直接完成某些操作时(例如不支持直接刷写
*.itb 格式的固件),可以加载一个运行在内存中的临时系统,在这个系统里执行更复杂的刷机操作。
- 动态调整 U-Boot 闪存布局:大多数路由器系统要求 U-Boot 的闪存分区布局与固件一致。如果 U-Boot 自身支持修改布局,就能在不重刷 U-Boot 的前提下适配不同固件,大大降低了因布局不匹配而“变砖”的风险。否则,一旦 U-Boot 刷错,往往需要拆机接 TTL 或使用编程器才能救回。
今天介绍的这款开源 U-Boot 项目—— bl-mt798x-dhcpd,就能完美满足以上所有需求。它对联发科(MediaTek)MT798x 系列芯片的路由器做了大量机型适配,是一个功能强大的开源项目选择。

首先,你可以通过 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)中进行刷写。
-
启用 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

-
写入新的 U-Boot 到 FIP 分区:
使用 mtd write 命令将编译好的 U-Boot 文件写入对应的分区(通常是 FIP 分区)。
mtd write mt7981_h3c_magic-nx30-pro_2025-fip-dhcpd-Yuzhii-multi-layout.bin FIP

写入完成后,重启路由器即可进入新的 U-Boot。
三、使用新 U-Boot 为路由器刷入系统
刷机前,请再次确认已备份闪存中的重要数据(如 Factory 分区)。
关键步骤:确保闪存布局一致
成功刷机的首要条件是 U-Boot 的闪存布局必须与你要刷写的固件完全一致。否则,系统将无法正常启动。
-
如何获知固件的闪存布局?
查看固件配套的设备树源文件(.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。
-
调整 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 布局”下拉菜单中选择已内置的布局。


-
执行网络刷机:
当 U-Boot 中的 ubi 分区布局与固件匹配后,就可以进行刷机了。路由器通电时长按 Reset 键,启动进入 Web Failsafe 界面(默认地址 http://192.168.1.1),在“固件升级”页面选择 sysupgrade 格式的系统固件文件并上传。

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

解决刷机后可用空间异常小的问题
有时刷完系统后,你会发现可用空间(即 ubi 分区内的 rootfs_data 卷)远小于 【ubi分区大小 - kernel卷大小 - rootfs卷大小】 的理论值。此时,可以:
- 进入 Web Failsafe 并加载一个
initramfs 系统。
- SSH 登录该临时系统。
- 执行
mtd erase ubi 命令擦除整个 UBI 分区。
- 重新进入 Web Failsafe 刷写
sysupgrade 固件。

四、重要注意事项:关于 NMBM
本项目 U-Boot 的 2023/2025 版默认启用了 NMBM(NAND 闪存坏块管理)。这是一个重要的特性,能提升闪存寿命和可靠性。
-
强烈建议:刷写同样启用了 NMBM 的系统固件。ImmortalWrt 24.10 等新版系统通常会提供启用 NMBM 的 DTS 文件,你可以在技术文档或源码中看到类似下面的配置:

-
警告:如果你刷入了不兼容/不支持 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,享受更自由的路由器定制体验。