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? - Как убедиться, что этот сценарий запускается автоматически при каждой загрузке?


person Varyag    schedule 01.10.2019    source источник
comment
Вы смотрели эту презентацию   -  person Nayfe    schedule 01.10.2019
comment
Я не! Даем ему шанс и возвращаемся либо к редактированию вопроса, либо к ответу, ty.   -  person Varyag    schedule 01.10.2019
comment
@Nayfe Он говорит о создании образа из скрипта uboot.sh с помощью mkimage, но как мне это сделать и что мне делать с этим изображением?   -  person Varyag    schedule 01.10.2019
comment
Вы можете посмотреть этот например рецепт скрипта u-boot.   -  person Nayfe    schedule 01.10.2019
comment
Я добавил uboot.sh и u-boot-script.bb. Я только что изменил ваш связанный u-boot-script на uboot.sh вместо boot.scr и изменил номера деталей в файле uboot.sh, чтобы они соответствовали моему. Сейчас он строится с помощью bitbake, так что посмотрим, работает ли он   -  person Varyag    schedule 02.10.2019
comment
@Nayfe, я обновил вопрос после попытки воспроизвести рецепт.   -  person Varyag    schedule 02.10.2019
comment
Возможно, у вас еще нет поддержки u-boot для вашей платы, см. commit   -  person Nayfe    schedule 02.10.2019
comment
@Nayfe Я почти уверен, что это так, когда смотрю на содержимое слоя метатегры. Кстати, после того, как я удалил PREFERRED_PROVIDER_virtual/bootloader = "u-boot" из моего файла local.conf, он не возвращал никаких ошибок во время bitbake u-boot, как раньше, но будет ли у меня u-boot в качестве загрузчика, если я не добавил эту строку? Я больше нигде не указываю, что хочу запустить u-boot в качестве загрузчика. За исключением того, что у меня IMAGE_INSTALL += " u-boot-fw-utils"   -  person Varyag    schedule 02.10.2019
comment
Однако конфигурация машины слоя метатегры для jetson nano имеет строки UBOOT_MACHINE = "p3450-porg_defconfig" и KERNEL_ROOTSPEC ?= "root=/dev/mmcblk0p${@uboot_var('distro_bootpart')} rw rootwait"   -  person Varyag    schedule 02.10.2019
comment
См. PREFERRED_PROVIDER_u-boot? = u-boot-tegra   -  person Nayfe    schedule 02.10.2019
comment
ах, так что не надо самому добавлять, ты.   -  person Varyag    schedule 03.10.2019


Ответы (1)


U-часть загрузочной части последовательности загрузки по умолчанию пытается найти файл с именем boot.src в первом разделе, откуда он загрузился. если этот файл будет найден, он попытается запустить этот скрипт. Команды, помещенные в файл, могут быть основаны на синтаксисе RAUC, поэтому при активации RAUC в пользовательском пространстве он может обновлять те же переменные среды. Таким образом, RAUC обрабатывает последовательность загрузки с помощью команд, помещенных в файл сценария. RAUC не имеет возможности напрямую изменить последовательность загрузки U Boot.

person Rohit Pai    schedule 12.06.2020