工控网首页
>

应用设计

>

NXP iMX8 ARM平台Distro Boot使用

NXP iMX8 ARM平台Distro Boot使用

1). 简介

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

 

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

 

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

 

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

 

 

2). 准备

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

 

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

 

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

 

 

3). Distro boot启动顺序

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

./ 外部SD卡设备

./ 内部eMMC存储设备

./ 外部USB存储设备

./ 外部网络设备

 

b). 默认扫描顺序和扫描位置由如下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测试

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

 

b). 在更新了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运行而无需配置恢复模式。

 

c). 测试流程

./ 这里下载对应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/

------------------------------------

./ 将上述准备好的外部存储介质连接到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测试

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

 

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

------------------------------------

Disk /dev/sdc14.9 GiB15931539456 字节,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

------------------------------------

 

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

------------------------------------

$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1

$ sudo mkfs.ext3 -L rootfs /dev/sdc2

------------------------------------

 

d). 这里下载适用于Apalis iMX8Ycoto 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

### 解压缩 bootfsrootfsSD

$ 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/

------------------------------------

 

e). 制作完成后将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

------------------------------------

 

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

G). 类似的思路,也可以通过创建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 

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

在 Linux 系统上 Docker 容器的性能影响

上游优先 - Toradex 采用主线内核支持

NXP iMX8M Plus M7核心FreeRTOS开发

嵌入式Linux上使用Ramoops

使用容器编译Yocto镜像