我已经成功创建了一个有两个rootfs分区的镜像,并在我的jetson nano上用yoctopoky运行。我按照元rauc层的README和rauc用户手册,创建了system.conf文件和rauc_%.bbappend文件,我能够成功创建捆绑文件。
据我所知,我需要一些 u-boot脚本:
为了使 RAUC 能够切换到正确的插槽,它的系统配置必须从 Bootloader 的角度指定相应插槽的名称。你还必须在引导程序本身设置一个适当的引导选择逻辑,可以通过脚本(如GRUB,U-Boot)或使用专门的引导选择基础设施(如Barebox中的bootchooser)。
Bootloader 还必须提供一组变量,Linux 用户空间可以通过修改变量来改变启动顺序或优先级。
在准备好这个接口后,RAUC将关心设置适当的引导逻辑。例如,它会在写入槽之前停用要更新的槽,并在成功完成安装后重新激活它。
我是在yocto层或build文件夹中的某个地方做一个脚本,还是做完镜像后需要放在jetson nano上的脚本?- 这个脚本的内容是什么?
我已经做了这个脚本。
test -n "${BOOT_ORDER}" || setenv BOOT_ORDER "system0 system1"
test -n "${BOOT_system0_LEFT}" || setenv BOOT_system0_LEFT 3
test -n "${BOOT_system1_LEFT}" || setenv BOOT_system1_LEFT 3
setenv bootargs
for BOOT_SLOT in "${BOOT_ORDER}"; do
if test "x${bootargs}" != "x"; then
# skip remaining slots
elif test "x${BOOT_SLOT}" = "xsystem0"; then
if test ${BOOT_system0_LEFT} -gt 0; then
setexpr BOOT_system0_LEFT ${BOOT_system0_LEFT} - 1
echo "Found valid slot system0, ${BOOT_system0_LEFT} attempts remaining"
setenv distro_bootpart "1"
setenv boot_line "mmc 1:1 any ${scriptaddr} /boot/extlinux/extlinux.conf"
setenv bootargs "${default_bootargs} root=/dev/mmcblk0p1 rauc.slot=system0"
fi
elif test "x${BOOT_SLOT}" = "xsystem1"; then
if test ${BOOT_system1_LEFT} -gt 0; then
setexpr BOOT_system1_LEFT ${BOOT_system1_LEFT} - 1
echo "Found valid slot system1, ${BOOT_system1_LEFT} attempts remaining"
setenv distro_bootpart "13"
setenv boot_line "mmc 1:D any ${scriptaddr} /boot/extlinux/extlinux.conf"
setenv bootargs "${default_bootargs} root=/dev/mmcblk0p13 rauc.slot=system1"
fi
fi
done
if test -n "${bootargs}"; then
saveenv
else
echo "No valid slot found, resetting tries to 3"
setenv BOOT_system0_LEFT 3
setenv BOOT_system1_LEFT 3
saveenv
reset
fi
sysboot ${boot_line}
而我得到了这个配方 recipes-bsp/u-boot/u-boot-script.bb
在我的元层中。
LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://Licenses/README;md5=30503fd321432fc713238f582193b78e"
S = "${WORKDIR}/git"
PACKAGE_ARCH = "${MACHINE_ARCH}"
DEPENDS = "u-boot-mkimage-native"
inherit deploy
BOOTSCRIPT ??= "${THISDIR}/uboot.sh"
do_mkimage () {
uboot-mkimage -A arm -O linux -T script -C none -a 0 -e 0 \
-n "boot script" -d ${BOOTSCRIPT} ${S}/boot.scr
}
addtask mkimage after do_compile before do_install
do_compile[noexec] = "1"
do_install () {
install -D -m 644 ${S}/boot.scr ${D}/boot.scr
}
do_deploy () {
install -D -m 644 ${D}/boot.scr \
${DEPLOYDIR}/boot.scr-${MACHINE}-${PV}-${PR}
cd ${DEPLOYDIR}
rm -f boot.scr-${MACHINE}
ln -sf boot.scr-${MACHINE}-${PV}-${PR} boot.scr-${MACHINE}
}
addtask deploy after do_install before do_build
FILES_${PN} += "/"
COMPATIBLE_MACHINE = "jetson-nano"
我可以看到,脚本图像正在进入到 work/jetson_nano_poky-linux/u-boot-tegra/2016.07.../git/
文件夹。
但我如何在u-boot中使用它?- 我如何确保这个脚本在每次启动时自动运行?
U引导部分的默认引导序列试图找到一个名为boot.src的文件,在第一个分区,它已经启动了。文件中的命令可以基于 RAUC 语法,这样当 RAUC 在用户空间被激活时,它可以更新相同的环境变量。所以RAUC通过在脚本文件中放入的命令来处理启动顺序。RAUC没有办法直接改变U Boot启动顺序的流程。