u-boot скрипт, позволяющий выбирать, какую часть rootfs загружать (RAUC)
Мне удалось создать образ с двумя разделами rootfs для запуска на моем jetson nano с помощью yocto/poky. Я следовал инструкциям README уровня meta-rauc и руководству пользователя rauc, чтобы создать файл system.conf и файл rauc_%. Bbappend, и я могу успешно создавать пакеты.
Как я понял, нужен какой-то скрипт u-boot:
Чтобы RAUC мог переключать правильный слот, его системная конфигурация должна указывать имя соответствующего слота с точки зрения загрузчика. Вы также должны настроить соответствующую логику выбора загрузки в самом загрузчике, либо с помощью сценариев (как для GRUB, U-Boot), либо с помощью специальной инфраструктуры выбора загрузки (например, bootchooser в Barebox).
Загрузчик также должен предоставлять набор переменных, которые пользовательское пространство Linux может изменять, чтобы изменить порядок или приоритет загрузки.
Подготовив этот интерфейс, RAUC позаботится о правильной настройке логики загрузки. Он, например, деактивирует слот для обновления перед записью в него и повторно активирует его после успешного завершения установки.
Должен ли я создавать сценарий где-нибудь в слое yocto или в папке сборки, или это сценарий, который мне нужно установить на 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? - Как убедиться, что этот скрипт запускается автоматически при каждой загрузке?
1 ответ
U загрузочная часть последовательности загрузки по умолчанию пытается найти файл с именем boot.src в первом разделе, с которого он загрузился. если этот файл будет найден, он попытается запустить этот скрипт. Команды, помещенные в файл, могут быть основаны на синтаксисе RAUC, поэтому при активации RAUC в пользовательском пространстве он может обновлять те же переменные среды. Таким образом, RAUC обрабатывает последовательность загрузки с помощью команд, помещенных в файл сценария. RAUC не имеет возможности напрямую изменить последовательность загрузки U Boot