Blog:
NXP iMX8 Arm 平台 Distro Boot 使用

Monday, September 13, 2021

1). 简介

Arm 嵌入式平台由于其分散性,不同 SoC 厂商通常都采用互不相同的方式来引导启动系统,这就导致了针对嵌入式 Arm 平台的系统发行版本也需要根据不同硬件 SoC 平台进行针对性定制,而不像X86平台(如BIOS或UEFI)或者64-bit Arm 服务器平台(如SBSA或SBBR)这样采用标准化的启动引导流程,因此通用桌面级系统发行版本比如SUSE、Redhat或Fedora就很难持续稳定的支持各种嵌入式Arm 平台,反而趋势是各个硬件供应商自己定制发布针对自己硬件的系统发布版本(如Raspbian,Bananian,Parabuntu)来绑定用户。


Distro Boot的标准名称是Generic Distro Configuration Concept,项目由U-boot开发者始于2014年左右,目标就是试图用一个标准方法去引导启动不同硬件平台。当在U-boot中打开Distro Boot支持后,只需要将任意支持的系统发布版本镜像文件和一个符合Distro Boot定义的启动配置文件放置于一个分区的可移动设备即可引导设备启动进入系统。


本文就基于NXP最新的iMX8 SoC(基于Cortex-A72+A53和Coretex-M4架构)Arm 平台来测试使用Distro Boot机制来引导系统镜像。演示平台来自于Toradex 基于iMX8QM的Apalis iMX8QM Arm 嵌入式模块平台。


需要注意的是,由于不同U-boot/Linux kernel版本的兼容性以及iMX8 Arm 处理器增加的底层SECO/SCFW固件的存在,可能导致本文测试的内容在其他BSP版本上面无法正常工作,本文仅基于当前测试环境进行distro boot的功能演示参考。


2). 准备

Apalis iMX8QM 4GB WB IT Arm 核心版配合Ioxra 载板,连接调试串口UART1(载板X22)到开发主机方便调试。

参考这里更新Toradex Ycoto Linux BSP V5.3版本BSP image,BSP中包含的U-boot默认以及支持Distro boot。

需要通过U-boot distro boot启动的BSP image,需要包含一个启动配置文件,通常为extlinux.conf或者U-boot专用的boot.scr/boot.scr.uimg文件,关于配置文件的说明请参考这里


3). Distro boot启动顺序

默认情况下,U-boot(Distro boot 支持)会按照如下顺序扫描启动配置文件extlinux.conf或者boot.scr/boot.scr.uimg

  • 外部SD卡设备
  • 内部eMMC存储设备
  • 外部USB存储设备
  • 外部网络设备


默认扫描顺序和扫描位置由如下U-boot环境变量决定,如有需要可以自行修改

### default boot devices sequence
boot_targets=mmc1 mmc2 mmc0 usb0 dhcp

### boot partition scanning location
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr
boot_scripts=boot.scr
boot_syslinux_conf=extlinux/extlinux.conf


4). 通过外部存储介质加载Toradex Easy Installer测试

Toradex Easy Installer是Toradex提供的一个基于Linux/QT开发的图形界面工具,用于将不同类型的操作系统方便直观的安装到Toradex计算机模块的内部eMMC存储上面。


在更新了Linux BSP之后,Toradex Easy Installer即被擦除,如果想重新更新Linux或者其他操作系统,就需要重新将Toradex easy installer加载运行,官方支持的方式是参考这里通过恢复模式操作,而基于当前Toradex Easy Installer V5.3版本配合Ycoto Linux V5.x版本,可以实现通过外部存储介质(SD卡或者U盘)在U-boot环境下直接加载Toradex Easy Installer运行而无需配置恢复模式。


测试流程

这里下载对应Apalis iMX8模块的Toradex Easy Installer V5.3版本image 压缩包

解压压缩包,可以看到里面以及包含distro boot所需要的启动文件 boot-tezi.scr,将其更名为 boot.scr。然后将文件复制到外部存储介质 / 目录或者 /boot 目录。

$ unzip Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3.zip
$ cd Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3/
$ ls
boot-tezi.scr image.json overlays.txt recovery-linux.sh tezi.itb u-boot.bin
hdmitxfw.bin imx-boot recovery recovery-windows.bat tezi.png wrapup.sh
$ mv boot-tezi.scr boot.scr
$ cp * /media/simon/<external_storage_mount_point>


将上述准备好的外部存储介质连接到Ixora载板对应接口,Apalis iMX8 开机从调试串口进入U-boot命令行,执行下面命令启动外部存储介质的Toradex Easy Installer,启动后即可从调试串口看到启动信息,以及连接的显示器看到Toradex Easy Installer应用界面。

### external SD storage depending on corresponding SD slot
# run bootcmd_mmc1 or run bootcmd_mmc2

### external USB stick
# run bootcmd_usb0


如上述章节3描述的默认启动扫描顺序,如果是外部SD卡则即使不中断或改动U-boot的启动,只要具备boot.scr文件的SD卡设备插入,就会优先从外部SD卡启动,而对于U盘,如果需要自动启动,则需要修改U-boot环境变量,将USB设备扫描顺序提前。

# setenv boot_targets 'usb0 mmc1 mmc2 mmc0 dhcp' && saveenv


5). 通过外部存储介质加载Ycoto Linux BSP测试

首先准备一个足够容量的SD卡或者U盘,本文测试使用一个16GB的Mciro SD卡

在Ubuntu PC下通过fdisk 命令在目标SD卡上面制作如下两个分区

Disk /dev/sdc:14.9 GiB,15931539456 字节,31116288 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x8a42d42a


设备 启动 起点 末尾 扇区 大小 Id 类型

/dev/sdc1 2048 8390655 8388608 4G c W95 FAT32 (LBA)
/dev/sdc2 8390656 31116287 22725632 10.9G 83 Linux


然后通过如下命令分别格式化两个分区,FAT32分区用于存放kernel、device tree等基本boot文件,linux ext3分区用于存放rootfs文件

$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
$ sudo mkfs.ext3 -L rootfs /dev/sdc2


这里下载适用于Apalis iMX8的Ycoto Linux Multimedia Demo image,然后解压,并分别将Image里面的boot文件和rootfs解压到刚才制作好的SD卡两个分区。Image boot文件中已经包含了boot.scr文件,无需手动创建。

解压缩image

$ tar xvf Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.3.0+build.10.tar

解压缩 bootfs、rootfs到SD卡

$ cd Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.3.0+build.10/
$ sudo tar xf Reference-Multimedia-Image-apalis-imx8.bootfs.tar.xz --no-same-owner -C /media/simon/boot/
$ sudo tar xf Reference-Multimedia-Image-apalis-imx8.tar.xz -C /media/simon/rootfs/


制作完成后将SD卡插入Ixora载板X10 插槽,启动模块,进入uboot命令行,执行下面命令通过SD卡启动

U-boot boot command from external SD cark

Apalis iMX8 # run bootcmd_mmc1
...

### agter booting, check current boot device is indeed external SD devcie - /dev/mmcblk1
root@apalis-imx8:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 11G 1.1G 9.1G 11% /
devtmpfs 1.4G 4.0K 1.4G 1% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 6.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 1.9G 844K 1.9G 1% /tmp
tmpfs 1.9G 24K 1.9G 1% /var/volatile
/dev/mmcblk0p1 48M 11M 37M 23% /media/mmcblk0p1
/dev/mmcblk0p2 15G 1.1G 13G 8% /media/mmcblk0p2
/dev/mmcblk1p1 4.0G 11M 4.0G 1% /boot


另外,如果需要定制boot流程,可以参考这里说明修改boot.scr 文件。

类似的思路,也可以通过创建TFTP/NFS 服务器实现网络启动,具体可以参考这里说明。


6). 总结

本文测试了基于NXP iMX8平台通过Distro Boot功能实现通过外部存储设备启动的方案,另外也可以延申到TFTP/NFS网络启动。不过由于Distro Boot功能兼容性和底层firmware以及uboot/kernel版本息息相关,因此本文测试仅限于当前测试平台和版本,不代表未来软件发生变化后相关功能还一定确认完整。



参考文献

https://developer.toradex.cn/knowledge-base/distro-boot-linux
https://developer.toradex.cn/knowledge-base/boot-from-sd-usb-sata
https://developer.toradex.cn/knowledge-base/boot-from-a-tftpnfs-server

Author: 秦海,技术销售工程师,韬睿(上海)
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?