By Toradex秦海
1). 簡介
ARM嵌入式平臺由于其分散性,不同SoC廠商通常都采用互不相同的方式來引導(dǎo)啟動系統(tǒng),這就導(dǎo)致了針對嵌入式ARM平臺的系統(tǒng)發(fā)行版本也需要根據(jù)不同硬件SoC平臺進(jìn)行針對性定制,而不像X86平臺(如BIOS或UEFI)或者64-bit?ARM服務(wù)器平臺(如SBSA或SBBR)這樣采用標(biāo)準(zhǔn)化的啟動引導(dǎo)流程,因此通用桌面級系統(tǒng)發(fā)行版本比如SUSE、Redhat或Fedora就很難持續(xù)穩(wěn)定的支持各種嵌入式ARM平臺,反而趨勢是各個硬件供應(yīng)商自己定制發(fā)布針對自己硬件的系統(tǒng)發(fā)布版本(如Raspbian,Bananian,Parabuntu)來綁定用戶。
Distro?Boot的標(biāo)準(zhǔn)名稱是Generic Distro Configuration Concept,項目由U-boot開發(fā)者始于2014年左右,目標(biāo)就是試圖用一個標(biāo)準(zhǔn)方法去引導(dǎo)啟動不同硬件平臺。當(dāng)在U-boot中打開Distro?Boot支持后,只需要將任意支持的系統(tǒng)發(fā)布版本鏡像文件和一個符合Distro?Boot定義的啟動配置文件放置于一個分區(qū)的可移動設(shè)備即可引導(dǎo)設(shè)備啟動進(jìn)入系統(tǒng)。
本文就基于NXP最新的iMX8 SoC(基于Cortex-A72+A53和Coretex-M4架構(gòu))ARM平臺來測試使用Distro?Boot機(jī)制來引導(dǎo)系統(tǒng)鏡像。演示平臺來自于Toradex 基于iMX8QM的Apalis?iMX8QM?ARM嵌入式模塊平臺。
需要注意的是,由于不同U-boot/Linux kernel版本的兼容性以及iMX8 ARM處理器增加的底層SECO/SCFW固件的存在,可能導(dǎo)致本文測試的內(nèi)容在其他BSP版本上面無法正常工作,本文僅基于當(dāng)前測試環(huán)境進(jìn)行distro boot的功能演示參考。
2). 準(zhǔn)備
a). Apalis iMX8QM?4GB?WB ITARM核心版配合Ioxra載板,連接調(diào)試串口UART1(載板X22)到開發(fā)主機(jī)方便調(diào)試。
b). 參考這里更新Toradex Ycoto Linux BSP V5.3版本BSP image,BSP中包含的U-boot默認(rèn)以及支持Distro boot。
c). 需要通過U-boot distro boot啟動的BSP image,需要包含一個啟動配置文件,通常為extlinux.conf或者U-boot專用的boot.scr/boot.scr.uimg文件,關(guān)于配置文件的說明請參考這里。
3). Distro boot啟動順序
a). 默認(rèn)情況下,U-boot(Distro boot 支持)會按照如下順序掃描啟動配置文件extlinux.conf或者boot.scr/boot.scr.uimg
./ 外部SD卡設(shè)備
./ 內(nèi)部eMMC存儲設(shè)備
./ 外部USB存儲設(shè)備
./ 外部網(wǎng)絡(luò)設(shè)備
b). 默認(rèn)掃描順序和掃描位置由如下U-boot環(huán)境變量決定,如有需要可以自行修改
------------------------------------
### 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). 通過外部存儲介質(zhì)加載Toradex Easy Installer測試
a). Toradex Easy Installer是Toradex提供的一個基于Linux/QT開發(fā)的圖形界面工具,用于將不同類型的操作系統(tǒng)方便直觀的安裝到Toradex計算機(jī)模塊的內(nèi)部eMMC存儲上面。
b). 在更新了Linux BSP之后,Toradex Easy Installer即被擦除,如果想重新更新Linux或者其他操作系統(tǒng),就需要重新將Toradex easy installer加載運(yùn)行,官方支持的方式是參考這里通過恢復(fù)模式操作,而基于當(dāng)前Toradex Easy Installer V5.3版本配合Ycoto Linux V5.x版本,可以實現(xiàn)通過外部存儲介質(zhì)(SD卡或者U盤)在U-boot環(huán)境下直接加載Toradex Easy Installer運(yùn)行而無需配置恢復(fù)模式。
c). 測試流程
./ 從這里下載對應(yīng)Apalis iMX8模塊的Toradex Easy Installer V5.3版本image 壓縮包
./ 解壓壓縮包,可以看到里面以及包含distro boot所需要的啟動文件 boot-tezi.scr,將其更名為 boot.scr。然后將文件復(fù)制到外部存儲介質(zhì) / 目錄或者 /boot 目錄。
------------------------------------
$ unzip Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3.zip
$ cd Apalis-iMX8_ToradexEasyInstaller_5.3.0+build.3/
$ ls
boot-tezi.scrimage.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>
------------------------------------
./ 將上述準(zhǔn)備好的外部存儲介質(zhì)連接到Ixora載板對應(yīng)接口,Apalis iMX8 開機(jī)從調(diào)試串口進(jìn)入U-boot命令行,執(zhí)行下面命令啟動外部存儲介質(zhì)的Toradex Easy Installer,啟動后即可從調(diào)試串口看到啟動信息,以及連接的顯示器看到Toradex Easy Installer應(yīng)用界面。
------------------------------------
### external SD storage depending on corresponding SD slot
# run bootcmd_mmc1 or run bootcmd_mmc2
### external USB stick
# run bootcmd_usb0
------------------------------------
./ 如上述章節(jié)3描述的默認(rèn)啟動掃描順序,如果是外部SD卡則即使不中斷或改動U-boot的啟動,只要具備boot.scr文件的SD卡設(shè)備插入,就會優(yōu)先從外部SD卡啟動,而對于U盤,如果需要自動啟動,則需要修改U-boot環(huán)境變量,將USB設(shè)備掃描順序提前。
------------------------------------
# setenv boot_targets 'usb0 mmc1 mmc2 mmc0 dhcp' && saveenv
------------------------------------
5). 通過外部存儲介質(zhì)加載Ycoto Linux BSP測試
a). 首先準(zhǔn)備一個足夠容量的SD卡或者U盤,本文測試使用一個16GB的Mciro SD卡
b). 在Ubuntu PC下通過fdisk 命令在目標(biāo)SD卡上面制作如下兩個分區(qū)
------------------------------------
Disk /dev/sdc:14.9 GiB,15931539456 字節(jié),31116288 個扇區(qū)
單元:扇區(qū)/ 1 * 512 = 512 字節(jié)
扇區(qū)大小(邏輯/物理):512 字節(jié) / 512 字節(jié)
I/O 大小(最小/最佳):512 字節(jié) / 512 字節(jié)
磁盤標(biāo)簽類型:dos
磁盤標(biāo)識符:0x8a42d42a
設(shè)備啟動起點末尾扇區(qū)大小Id 類型
/dev/sdc1 ?????????2048 ?8390655 ?8388608 ???4G ?c W95 FAT32 (LBA)
/dev/sdc2 ??????8390656 31116287 22725632 10.9G 83 Linux
------------------------------------
c). 然后通過如下命令分別格式化兩個分區(qū),F(xiàn)AT32分區(qū)用于存放kernel、device tree等基本boot文件,linux ext3分區(qū)用于存放rootfs文件
------------------------------------
$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
$ sudo mkfs.ext3 -L rootfs /dev/sdc2
------------------------------------
d). 從這里下載適用于Apalis iMX8的Ycoto Linux Multimedia Demo image,然后解壓,并分別將Image里面的boot文件和rootfs解壓到剛才制作好的SD卡兩個分區(qū)。Image boot文件中已經(jīng)包含了boot.scr文件,無需手動創(chuàng)建。
------------------------------------
### 解壓縮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/
------------------------------------
e). 制作完成后將SD卡插入Ixora載板X10 插槽,啟動模塊,進(jìn)入uboot命令行,執(zhí)行下面命令通過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). 類似的思路,也可以通過創(chuàng)建TFTP/NFS 服務(wù)器實現(xiàn)網(wǎng)絡(luò)啟動,具體可以參考這里說明。
6). 總結(jié)
本文測試了基于NXP?iMX8平臺通過Distro Boot功能實現(xiàn)通過外部存儲設(shè)備啟動的方案,另外也可以延申到TFTP/NFS網(wǎng)絡(luò)啟動。不過由于Distro Boot功能兼容性和底層firmware以及uboot/kernel版本息息相關(guān),因此本文測試僅限于當(dāng)前測試平臺和版本,不代表未來軟件發(fā)生變化后相關(guān)功能還一定確認(rèn)完整。
參考文獻(xiàn)
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?