更新固件包后,在os下更改账号密码,ssh无法登陆,密码输入无误,web界面暂无,无法使用telnet登陆,所以现在想要在uboot下切换为备区启动,还原成之前的bmc固件
以下是当前uboot的环境
问题:
目前没有看到切换备区启动的命令,执行setenv boot_bank 1 然后reset,依然是主区启动
能否提供一下在uboot下切换到备区启动的流程
更新固件包后,在os下更改账号密码,ssh无法登陆,密码输入无误,web界面暂无,无法使用telnet登陆,所以现在想要在uboot下切换为备区启动,还原成之前的bmc固件
以下是当前uboot的环境
问题:
目前没有看到切换备区启动的命令,执行setenv boot_bank 1 然后reset,依然是主区启动
能否提供一下在uboot下切换到备区启动的流程
答案内容由AI生成,仅供参考:
当 BMC 固件更新后出现 SSH 登录失败、Web 无法访问等问题时,可以通过 U-Boot 切换至备用启动分区(backup bank)恢复系统。以下是基于 Hi1711 平台的完整操作指导。
当前情况:
关键提示:
setenv boot_bank 1无效是因为平台未启用boot_bank变量控制;Hi1711 平台依赖 分区设备名(如umcblk0gp1,umcblk0gp2)和fw_upgrade命令 实现主备切换。
在串口终端上电启动设备,看到如下提示时快速按 Ctrl + B 进入 U-Boot shell:
Hit 'ctrl + b' to stop autoboot: 0
进入后应显示类似:
=>
Hi1711 平台通常使用 eMMC 的多个 GPP 分区作为固件区,例如:
/dev/umcblk0gp0 → 主区(active)/dev/umcblk0gp1 → 备区(backup)虽然 U-Boot 环境中不直接列出设备,但可通过常见命名规则判断。
fw_upgrade 命令切换启动分区
![]()
fw_upgrade是 Hi1711 平台专用命令,用于切换主备固件分区
语法格式(根据 Document Chunk 1 中用户实践):
fw_upgrade <新 active> <新 backup> <原 active> <原 backup>
=> fw_upgrade 5 4 5 6
其中:
5:对应 /dev/umcblk0gp1(常用映射)6:对应 /dev/umcblk0gp2dboot_probe_info 输出)
目的:将原 backup 区设为新的 active 区,实现回退。
来自知识库证据:
- 文档片段 1 中提到:“
fw_upgrade 5 4 5 6” 成功实现切换。- “我找到了在 uboot 下切换启动分区的方法,当前每个启动分区都可以切换并且启动”
运行以下命令查看上次启动信息(如有):
=> printenv
查找是否有 boot_from 或相关变量记录启动源。
也可尝试:
=> dboot_probe_info
来自知识图谱:
dboot_probe_info包含boot source,BMC reset count等关键数据。
执行重启:
=> reset
重启后,观察日志中是否加载了旧版本固件(如版本号、时间戳不同),确认是否已从备区启动。
登录系统后运行:
ipmcget -d version
比对输出中的 active 和 backup 版本,确认当前运行的是旧版固件。
运行:
dmesg | grep -i "boot\|load"
查看是否从 /dev/umcblk0gp1 等备用设备加载。
| 项目 | 说明 |
|---|---|
不支持 boot_bank 变量 |
当前 Hi1711 平台 U-Boot 不解析 boot_bank,设置无效 |
| 避免随意烧写 | 错误操作可能导致双区损坏,最终需返厂维修 |
| 建议预设恢复点 | 若支持 ipmcset -d restore,应在升级前设置恢复点 |
| 双区均损坏的后果 | 如主备都异常,则必须使用 JTAG 或返厂修复(见 DC4) |
| 步骤 | 操作 |
|---|---|
| 1 | 使用串口连接目标设备 |
| 2 | 上电时按 Ctrl+B 进入 U-Boot |
| 3 | 输入 fw_upgrade 5 4 5 6(或其他已知有效组合) |
| 4 | 输入 reset 重启系统 |
| 5 | 观察是否恢复正常 SSH/Web 访问 |
| 6 | 成功后使用 ipmcset -d upgrade 重新刷入正确固件 |
| 命令 | 功能 |
|---|---|
printenv |
查看 U-Boot 环境变量 |
fw_upgrade a b c d |
设置下一启动分区 |
reset |
重启系统 |
dboot_probe_info |
查看启动设备及重置计数(若有) |
ipmcget -d version |
获取固件版本信息(系统运行后) |
结论:
在 U-Boot 中无法通过setenv boot_bank 1实现切换,必须使用平台专用命令fw_upgrade修改启动顺序。通过该方式可以成功切换至备区启动,恢复先前可用的 BMC 固件版本,进而完成问题修复或重新升级。
如有需要,请联系项目支持人员获取 精确的分区编号映射表 以确保切换准确无误。
相关链接:
参考AI答复操作一下
=> fw_upgrade 5 4 5 6
Unknown command ‘fw_upgrade’ - try ‘help’
我当前环境下的uboot没有这个切换分区的命令
可以试试:
Uboot下敲reg_wr 0x8740148 1
之后再ctrl b进入L1
fw_upgrade 5 4 5 6(后面456是分别指/dev/mmcblk0gp0 /dev/mmcblk0gp1 /dev/mmcblk0gp2)
boot_a55
4 5 6就是从0开始启动的,换成645试试
感谢,这边改成645就是备区启动了
您好,我按照您的流程改成了
您好,我的硬件是1711,尝试了指令fw_upgrade 5 4 5 6和fw_upgrade 5 6 4 5启动都是从Area 0启动的,这是什么原因?
我的uboot下printenv如下:
=> printenv
baudrate=115200
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootaa64.efi; if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_efi_bootmgr=if fdt addr -q ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr;fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=dhcp
bootargs=console=ttyS0,115200n8N earlycon=uart8250,mmio32,0x08710000 initrd=${initrd_load_addr},${initrd_size} rdinit=/sbin/init rw ekbox=0x20000$0x84be0000 kbox_mem=0x2e0000@0x84900000 swift_irqsoff_enable swxn=1
bootcmd=run hi1711_boot
bootcmd_dhcp=devtype=dhcp; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00011:UNDI:003000;setenv bootp_arch 0xb;if dhcp ${kernel_addr_r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootdelay=3
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
dtb_load_addr=0x87400000
efi_dtb_prefixes=/ /dtb/ /dtb/current/
ethaddr=08:03:08:08:08:08
ext4_img_flash_addr=0x400000
ext4_img_load_addr=0x88680000
ext4_img_size=0x1b00000
fdt_high=0xffffffffffffffff
fitimage_load_addr=0x88680000
hi1711_boot=run load_ext4_kernel;run load_ext4_dtb;run load_ext4_initrd;run run_linux
hi1711_sfc_fitimage_boot=bootm ${fitimage_load_addr}
initrd_high=0xffffffffffffffff
initrd_load_addr=0xa1480000
initrd_size=0x500000
kernel_load_addr=0x87480000
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
load_ext4_dtb=ext4load hi1711_ext4_blk 0:0 ${dtb_load_addr} /boot/hi1711_asic.dtb
load_ext4_initrd=ext4load hi1711_ext4_blk 0:0 ${initrd_load_addr} /boot/initrd_boot.cpio.gz
load_ext4_kernel=ext4load hi1711_ext4_blk 0:0 ${kernel_load_addr} /boot/uImage
loadaddr=0x8B200000
packet_load_addr=0x87200000
packet_size=0x7c00000
run_linux=bootm ${kernel_load_addr} ${initrd_load_addr}:${initrd_size} ${dtb_load_addr}
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}…; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then part uuid ${devtype} ${devnum}:${distro_bootpart} distro_bootpart_uuid ; run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;run boot_efi_bootmgr;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootaa64.efi; then echo Found EFI removable media binary efi/boot/bootaa64.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing…; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo EXTLINUX FAILED: continuing…; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing…; fi; done
stderr=serial
stdin=serial
stdout=serial
tftp_ext4_img=tftpboot ${ext4_img_load_addr} Hi1711_ext4fs.img
tftp_network_boot=tftp ${dtb_load_addr} hi1711.dtb; tftp ${kernel_load_addr} uImage; tftp ${initrd_load_addr} initrd_boot.cpio.gz; bootm ${kernel_load_addr} ${initrd_load_addr} : ${initrd_size} ${dtb_load_addr}
tftp_packet=tftpboot ${packet_load_addr} Hi1711_flash_ext4.bin
tftp_uboot=tftpboot ${uboot_load_addr} u-boot.bin
tftpwrite_ext4_img=if test ${serverip} = “”;then echo Need to config IP;else run tftp_ext4_img; run write_ext4_img; fi
tftpwrite_packet=if test ${serverip} = “”;then echo Need to config IP;else run tftp_packet; run write_packet; fi
tftpwrite_uboot=if test ${serverip} = “”;then echo Need to config IP;else run tftp_uboot; run write_uboot; fi
uboot_flash_addr=0x0
uboot_load_addr=0x87200000
uboot_size=0x100000
Environment size: 4916/65532 bytes