uboot下备区启动问题

更新固件包后,在os下更改账号密码,ssh无法登陆,密码输入无误,web界面暂无,无法使用telnet登陆,所以现在想要在uboot下切换为备区启动,还原成之前的bmc固件

以下是当前uboot的环境

问题:
目前没有看到切换备区启动的命令,执行setenv boot_bank 1 然后reset,依然是主区启动

能否提供一下在uboot下切换到备区启动的流程

答案内容由AI生成,仅供参考:

在 U-Boot 下切换到备用区启动的详细流程

当 BMC 固件更新后出现 SSH 登录失败、Web 无法访问等问题时,可以通过 U-Boot 切换至备用启动分区(backup bank)恢复系统。以下是基于 Hi1711 平台的完整操作指导。


:magnifying_glass_tilted_left: 问题分析

当前情况:

  • 固件已更新,但新版本存在配置或认证问题(如账户密码修改无效)
  • Web 界面不可用,Telnet 无法连接
  • SSH 可登录但认证失败
  • 需要通过 U-Boot 手动切换到备份区(备区)启动旧版本固件

:warning: 关键提示setenv boot_bank 1 无效是因为平台未启用 boot_bank 变量控制;Hi1711 平台依赖 分区设备名(如 umcblk0gp1, umcblk0gp2)和 fw_upgrade 命令 实现主备切换。


:white_check_mark: 解决方案:通过 U-Boot 切换到备区启动

步骤 1:进入 U-Boot 命令行

在串口终端上电启动设备,看到如下提示时快速按 Ctrl + B 进入 U-Boot shell:

Hit 'ctrl + b' to stop autoboot:  0

进入后应显示类似:

=> 

步骤 2:确认当前可用的启动分区

Hi1711 平台通常使用 eMMC 的多个 GPP 分区作为固件区,例如:

  • /dev/umcblk0gp0 → 主区(active)
  • /dev/umcblk0gp1 → 备区(backup)

虽然 U-Boot 环境中不直接列出设备,但可通过常见命名规则判断。


步骤 3:使用 fw_upgrade 命令切换启动分区

:white_check_mark: fw_upgrade 是 Hi1711 平台专用命令,用于切换主备固件分区

语法格式(根据 Document Chunk 1 中用户实践):

fw_upgrade <新 active> <新 backup> <原 active> <原 backup>

示例:切换到备区作为新 active 分区

=> fw_upgrade 5 4 5 6

其中:

  • 5:对应 /dev/umcblk0gp1(常用映射)
  • 6:对应 /dev/umcblk0gp2
  • 数值含义取决于具体系统定义(参考 dboot_probe_info 输出)

:light_bulb: 目的:将原 backup 区设为新的 active 区,实现回退。

:pushpin: 来自知识库证据:

  • 文档片段 1 中提到:“fw_upgrade 5 4 5 6” 成功实现切换。
  • “我找到了在 uboot 下切换启动分区的方法,当前每个启动分区都可以切换并且启动”

步骤 4:查看启动源信息(可选诊断)

运行以下命令查看上次启动信息(如有):

=> printenv

查找是否有 boot_from 或相关变量记录启动源。

也可尝试:

=> dboot_probe_info

来自知识图谱:dboot_probe_info 包含 boot source, BMC reset count 等关键数据。


步骤 5:重启并验证是否从备区启动

执行重启:

=> reset

重启后,观察日志中是否加载了旧版本固件(如版本号、时间戳不同),确认是否已从备区启动。


:repeat_button: 补充说明:如何验证切换成功?

方法一:检查版本信息

登录系统后运行:

ipmcget -d version

比对输出中的 active 和 backup 版本,确认当前运行的是旧版固件。

方法二:检查日志

运行:

dmesg | grep -i "boot\|load"

查看是否从 /dev/umcblk0gp1 等备用设备加载。


:red_exclamation_mark: 注意事项与风险提示

项目 说明
不支持 boot_bank 变量 当前 Hi1711 平台 U-Boot 不解析 boot_bank,设置无效
避免随意烧写 错误操作可能导致双区损坏,最终需返厂维修
建议预设恢复点 若支持 ipmcset -d restore,应在升级前设置恢复点
双区均损坏的后果 如主备都异常,则必须使用 JTAG 或返厂修复(见 DC4)

:hammer_and_wrench: 恢复建议流程总结

步骤 操作
1 使用串口连接目标设备
2 上电时按 Ctrl+B 进入 U-Boot
3 输入 fw_upgrade 5 4 5 6(或其他已知有效组合)
4 输入 reset 重启系统
5 观察是否恢复正常 SSH/Web 访问
6 成功后使用 ipmcset -d upgrade 重新刷入正确固件

:puzzle_piece: 附录:相关命令参考

命令 功能
printenv 查看 U-Boot 环境变量
fw_upgrade a b c d 设置下一启动分区
reset 重启系统
dboot_probe_info 查看启动设备及重置计数(若有)
ipmcget -d version 获取固件版本信息(系统运行后)

:white_check_mark: 结论
在 U-Boot 中无法通过 setenv boot_bank 1 实现切换,必须使用平台专用命令 fw_upgrade 修改启动顺序。通过该方式可以成功切换至备区启动,恢复先前可用的 BMC 固件版本,进而完成问题修复或重新升级。

如有需要,请联系项目支持人员获取 精确的分区编号映射表 以确保切换准确无误。

相关链接:

  1. 如何手动切换分区
  2. 【方案讨论】支持自动下载安装bmc_sdk,减少openubmc的容器数量
  3. 请问能否提供hi1711的uboot文件(2.1.07),目前版本无法Ctl+B进入uboot命令行
  4. BMC固件损坏时恢复环境指导
  5. 升级你的BMC | 文档中心 | openUBMC

参考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

按照您的方法,进入L1后执行fw_upgrade,结果如下:

再执行boot_a55后,打引如下:

依然是从area0启动的哎,启动之后在操作系统更改密码,依然无法ssh登陆

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