Yocto构建Linux系统镜像时,git下载出错/慢、常见问题的解决方案

4/26更新:
        在更换URL后,出现GIT 下载LFS的一个文件出错

ERROR: cryptoauthlib-1.0+gitAUTOINC+b3fcd839ee-r0 do_unpack: Bitbake Fetcher Error: FetchError('Fetch command export PSEUDO_DISABLED=1; export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus,guid=c1303cfe07d692f2b61a84ab662af89d"; export SSH_AGENT_PID="2466"; export SSH_AUTH_SOCK="/run/user/1000/keyring/ssh"; export PATH="/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/sysroots-uninative/x86_64-linux/usr/bin:/home/hqyj/Sam9x60/gml/poky/scripts:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot-native/usr/bin/arm-poky-linux-gnueabi:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot/usr/bin/crossscripts:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot-native/usr/sbin:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot-native/usr/bin:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot-native/sbin:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/recipe-sysroot-native/bin:/home/hqyj/Sam9x60/gml/poky/bitbake/bin:/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/hosttools"; export HOME="/home/hqyj"; git -c core.fsyncobjectfiles=0 -c gc.autoDetach=false -c core.pager=cat checkout b3fcd839eec1cd63a695f541bbf5c5d6af2c96e3 failed with exit code 128, output:\nDownloading cryptoauthlib-manual.pdf (3.6 MB)\nError downloading object: cryptoauthlib-manual.pdf (5509c5b): Smudge error: Error downloading cryptoauthlib-manual.pdf (5509c5b1d9a739cf202c0d7b0c56bc464cb91a1cef151053fb615365665db5ee): Error transferring "5509c5b1d9a739cf202c0d7b0c56bc464cb91a1cef151053fb615365665db5ee": [0] remote missing object 5509c5b1d9a739cf202c0d7b0c56bc464cb91a1cef151053fb615365665db5ee\n\nErrors logged to /home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/git/.git/lfs/logs/20240426T011247.063650489.log\nUse `git lfs logs last` to view the log.\nerror: external filter \'git-lfs filter-process\' failed\nfatal: cryptoauthlib-manual.pdf: smudge filter lfs failed\n', None)
ERROR: Logfile of failure stored in: /home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/armv5e-poky-linux-gnueabi/cryptoauthlib/1.0+gitAUTOINC+b3fcd839ee-r0/temp/log.do_unpack.15971
ERROR: Task (/home/hqyj/Sam9x60/gml/meta-atmel/recipes-security/cryptoauthlib/cryptoauthlib_git.bb:do_unpack) failed with exit code '1'

尝试重新上传等等方法失败了。后面将URL地址修改回原来的地址(我将git的地址修改为本地的地址了)就没报错了。应该是yocto在下载目录找到了仓库,就没有执行do_fetch步骤了。正确后通过,至于之前的LFS的问题,是有一个pdf文件无法通过lfs下载下来,具体出错原因不详。

问题的关键在于找到错误中,yocto期望创建的本地git仓库名。在出错信息里面有。一般为你构建目录下downloads下的git某个相关目录,找到它然后替换!

建议出错就重新执行。不要因为一两个包将整个下载进度卡住,重新下载时,可使用下面的方法下载易出错、下载慢的包。

以下是原回答:

如图,有时在使用git下载github上的相关内容时,时常会因为网络原因导致下载失败进而构建失败。由于我目前还没有找到通过方法让git通上主机的VPN。因此想的是一个笨办法来解决问题:

  在构建目录的downloads下,会有git2和其他的压缩文件。其中,git2目录存放的是自github上拉取下来的裸仓库。downloads下存放的就是纯文件。

这里面包含了下载下来的所有包,很大。所以一定要预留足够的空间

那么这里就主要分为两种情况:

1、如果是下载的具体压缩文件,如xxx.tar.gz有直接的下载链接,那么只需要自己在主机下载好文件,放入构建目录的下的downloads文件夹即可。

2、如果拉取的是GitHub仓库,如拉取Linux的内核文件。拉取仓库十分大,我拉的有大概八个G。下载几乎百分百出错。看了配方文档,知道下载的是Linux-6.6-mchp。但是我不清楚把下载下来的文件以什么命名,放在哪儿合适(放在downloads下不对)

因此,我想到一个笨办法:

如果错误信息中有下载链接,那么直接使用下载链接在windows下载加速即可

如果没有,下载的极其缓慢。我们可以去找相关的配方文件,下载对应的包。

比如这里的是linux-firmware-l_20230625文件,我们在poky的上层目录搜索相关的bb文件。

找到并查看SRC得知

  • ${KERNELORG_MIRROR}: 通常这个变量在 Yocto 的配置文件或者环境变量中定义,常见的值可能是 https://kernel.org/pub。
  • ${BPN}: 这是 BitBake 的包名变量,对于 linux-firmware,这个值应该就是 linux-firmware。
  • ${PV}: 这是包的版本,版本应该是 20230625。

得到下载链接:https://kernel.org/pub/linux/kernel/firmware/linux-firmware-20230625.tar.xz

这是一个示例,时候遇到那种极个别的下载缓慢的包可这样操作。

获取链接后去主机使用恰当的方法加速下载相关裸仓库(我这里使用的github desktop)将其在widows下的.git的裸仓库复制到Linux下的downloads/git2下的相关目录。分三种情况:
        如果你在错误信息内找到了要下载回来的目标仓库名,却在downloads的git2下没找到该文件夹,就直接将windows下的.git文件复制,创建对应的仓库文件夹,将刚才复制的文件粘贴在此文件夹内。

如果git2已经有了仓库文件,就替换其git2内的相关文件。

如果是tar文件,就下载tar文件放在downloads目录即可。

可以看到已经跳过do_fetch步骤开始下一步了。

至此应该能解决问题,如果还是失败,接着尝试下面的方法:

修改配方文件,将远程仓库链接改为本地链接
 

并且需要去找到对应的配方文件并修改(在错误报告中就有路径,配方文件为bb后缀)。

这里我就修改了git路径。成功解决了问题。

另外在do_install的时候,出现了删除一个文件,但文件不存在报的警告,却中止了整个install进程。于是准备一步一步看其删除指令的配方脚本文件。

rm: cannot remove '/home/hqyj/Sam9x60/gml/poky/build-microchip/tmp/work/sam9x60_curiosity-poky-linux-gnueabi/linux-mchp/6.6+gitAUTOINC+468020704f-r0/image/lib/modules/6.6.23-linux4microchip-2024.04-rc1+/source': No such file or directory
WARNING: exit code 1 from a shell command.

最后通过依赖关系在kernel.bbclass内找到了相关的代码,将其修改为查询目录是否存在,存在再删除。

kernel_do_install() {
	#
	# First install the modules
	#
	unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
	if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
		oe_runmake DEPMOD=echo MODLIB=${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION} INSTALL_FW_PATH=${D}${nonarch_base_libdir}/firmware modules_install
		rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/build"
		rm "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/source"
		# Remove empty module directories to prevent QA issues
		find "${D}${nonarch_base_libdir}/modules/${KERNEL_VERSION}/kernel" -type d -empty -delete
	else
		bbnote "no modules to install"
	fi

	#
	# Install various kernel output (zImage, map file, config, module support files)
	#
	install -d ${D}/${KERNEL_IMAGEDEST}

	#
	# When including an initramfs bundle inside a FIT image, the fitImage is created after the install task
	# by do_assemble_fitimage_initramfs.
	# This happens after the generation of the initramfs bundle (done by do_bundle_initramfs).
	# So, at the level of the install task we should not try to install the fitImage. fitImage is still not
	# generated yet.
	# After the generation of the fitImage, the deploy task copies the fitImage from the build directory to
	# the deploy folder.
	#

	for imageType in ${KERNEL_IMAGETYPES} ; do
		if [ $imageType != "fitImage" ] || [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ] ; then
			install -m 0644 ${KERNEL_OUTPUT_DIR}/$imageType ${D}/${KERNEL_IMAGEDEST}/$imageType-${KERNEL_VERSION}
		fi
	done

     修改为:

使用相关bitback命令清除状态然后重新构建对应内容即可。


还有一个常见的问题,由于设备的硬件条件,编译的时候因为rom/ram不足会导致的一系列问题:
如下面的错误日志的报错:

 

  File "/home/hqyj/Sam9x60/gml/poky/build-microchip-headless-imagep/tmp/work/x86_64-linux/rust-native/1.59.0-r0/rustc-1.59.0-src/src/bootstrap/bootstrap.py", line 182, in run
    raise RuntimeError(err)
RuntimeError: failed to run: /home/hqyj/Sam9x60/gml/poky/build-microchip-headless-imagep/tmp/work/x86_64-linux/rust-native/1.59.0-r0/rustc-1.59.0-src/build/bootstrap/debug/bootstrap -j 8 build --stage 2 --verbose
WARNING: exit code 1 from a shell command.

可以尝试对出错的部分单独先bitback clean后再单独bitback。会解决很多问题

如果在使用yocto时有比较好的Linux下的git加速方法,还希望有老哥能提点一下

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yocto 构建系统是一个用于嵌入式 Linux 系统的开源项目。它能够帮助开发人员快速构建定制化的 Linux 发行版,以满足各种嵌入式设备的需求。 Yocto 构建系统的核心是 BitBake,它是一个基于 Python 的构建工具。BitBake 可以根据用户创建的配置文件,自动化地构建整个 Linux 系统。通过使用 BitBake 可以方便地管理软件包的依赖关系、选择所需的组件和功能,自动生成适合目标设备的 Linux 镜像Yocto 能够让开发人员更加灵活地定制和优化 Linux 系统。它提供了一个强大的层次结构,允许用户创建、管理和共享不同级别的自定义层。用户可以在不同的层中添加、删除或修改软件包、配置、脚本和图像。这样,无论是开发嵌入式 Linux 系统还是定制特定设备的 Linux 发行版,都能够很方便地实现。 除了 BitBake,Yocto 还包含了 Poky Build System,它是一个基于 OpenEmbedded 构建框架的参考实现。Poky 提供了一组标准的开发工具和环境,方便开发人员进行软件包管理、构建、调试和测试等工作。 通过使用 Yocto 构建系统,开发人员可以更加专注于自定义和优化嵌入式系统,而无需关注底层的构建细节。同Yocto 还提供了广泛的文档和社区支持,使得开发人员可以快速上手并解决问题。 总之,Yocto 构建系统是一个强大的工具,能够帮助开发人员快速构建自定义、高度灵活和可优化的嵌入式 Linux 系统。无论是个人开发者还是企业开发团队,都可以利用 Yocto 构建系统来实现高效的嵌入式 Linux 系统开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值