这可能不是 Yocto 本身的问题,而是与在 Avenger96(STM32MP1) 板上正确启动 Linux 有关。我目前正在与 Yocto(Dunfell) 一起开发 Avenger96。目的是实现SWUpdate OTA更新系统。为此,我使用 A/B 策略。我也正在使用systemd
而不是sysVinit
.在我的conf/local.conf
我已经设置:
DISTRO_FEATURES_append = " systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
我的.wks
文件如下所示:
part fsbl1 --source rawcopy --sourceparams="file=u-boot-spl.stm32" --part-name "fsbl1" --ondisk mmcblk --align 1 --size 256k
part fsbl2 --source rawcopy --sourceparams="file=u-boot-spl.stm32" --part-name "fsbl2" --ondisk mmcblk --align 1 --size 256k
part ssbl --source rawcopy --sourceparams="file=u-boot.itb" --part-name "ssbl" --ondisk mmcblk --align 1 --size 2M
part / --source rootfs --ondisk mmcblk0 --fstype=ext4 --label root_A --part-name "rootfs_A" --align 4096 --use-uuid --active --size 3G
part / --source rootfs --ondisk mmcblk0 --fstype=ext4 --label root_B --part-name "rootfs_B" --align 4096 --use-uuid --size 3G
bootloader --ptable gpt
我能够创建图像并将其复制到 SD 卡。但是在启动时我遇到以下问题/错误:
[ OK ] Started D-Bus System Message Bus.
Starting Load/Save RF Kill Switch Status...
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or "exit"
to boot into default mode.
Press Enter for maintenance
(or press Control-D to continue):
按“Ctrl+D”后,我得到:
Reloading system manager configuration
[ 1306.916497] systemd-fstab-generator[202]: Mount point fsbl1 is not a valid path, ignoring.
[ 1306.940236] systemd-fstab-generator[202]: Mount point fsbl2 is not a valid path, ignoring.
[ 1306.947455] systemd-fstab-generator[202]: Mount point ssbl is not a valid path, ignoring.
Starting default target
.
.
然后它要求登录,我可以以“root”身份登录。我不明白为什么会进入紧急模式或恢复模式。在谷歌上我发现它通常与/etc/fstab有关。以下是/etc/fstab/内容(从board复制):
# stock fstab - you probably want to override this with a machine specific one
/dev/root / auto defaults 1 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts mode=0620,ptmxmode=0666,gid=5 0 0
tmpfs /run tmpfs mode=0755,nodev,nosuid,strictatime 0 0
tmpfs /var/volatile tmpfs defaults 0 0
# uncomment this if your device has a SD/MMC/Transflash slot
#/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0
/dev/mmcblkp1 fsbl1 vfat defaults 0 0
/dev/mmcblkp2 fsbl2 vfat defaults 0 0
/dev/mmcblkp3 ssbl vfat defaults 0 0
还有一个疑问:当我们从紧急/救援模式进行软件更新时会发生什么?就我而言,我可以安装更新(使用 SWUpdate),但重新启动后系统再次从旧分区启动。但我可以手动切换到更新的分区u-boot env
并验证是否安装了新映像。所以我假设这种行为再次与 u-boot 的某些问题有关(可能新设置的环境在下次启动时被擦除)。我还可以做其他事情,例如从 u-boot 环境访问fw_printenv/fw_setenv
、设置和更改分区。bootlimit
我发现 aboot.scr
正在被使用,并且我已在脚本中进行了设置。rootfspart
在u-boot头文件中为"rootfspart=4\0" \
setenv bootargs "${bootargs} root=/dev/mmcblk0p${rootfspart} rdinit=/bin/kinit rw rootwait single"
谁能告诉我这里可能存在什么潜在问题吗?任何关于研究方向的建议都会有所帮助。
我们将非常感谢您的帮助。
提前致谢。
PS:如果缺少任何信息,请告诉我。另外,当我登录后检查时,journalctl -xb
我只能找到Alternate GPT is invalid, using primary GPT.
和GPT: Use GNU Parted to correct GPT errors.
。但也许我在这里错过了一些东西。