1.Yocto 编译后文件放在了哪里 输出文件位置
编译完成后内核以及 rootfs,内核,uboot 以及 dtb 会放在相对于 build 目录的 tmp/deploy/
images/MACHINE/下面,这里 MACHINE 需要可能为空(对于老版本的 poky/yocto),也可
能是你的板子名字,例如 sabresd。
对于 toolchain,那么放在 tmp/deploy/sdk/MACHINE/下。
图片示例:
编 译 完 成 后 内 核 以 及 rootfs 以 及 dtb 会 放 在 相 对 于 build 目 录 的 tmp/deploy/images/
imx6qsabresd/下面
各个文件都有一个软连接来指向最新编译产生的文件,因此如果需要看到最新的文件,可以直
接使用软链接即可:
2.Yocto Linux 内核编译目录在哪?
内核放在了哪里? 这个是放在了如下位置,我们可以用下面命令来确定:
bitbake -e linux-imx | grep ^S=
图示:
3.Yocto 如何重新编译 Linux 内核与 dtb,并放到 deploy 目
录?
编译内核,并生成 uImage+dtb,编译的命令如下:
bitbake linux-imx -C compile
注意这里的-C 的 C 是大写,和小写的 c 是有区别的。
注意这里的 linux-imx 是针对 imx 的内核,你的内核名字可能不一样,关于如何确定一个包的名
字,请看:Yocto tips (4): Yocto 如何确定(找到)一个包的名字
4.Yocto 如何确定(找到)一个包的名字
使用下面命令来却确定:
bitbake -s | grep XXX
其中 XXX 为包的关键字,例如 linux 或者 uboot,这样就可以看到所有带有关键字的包了,如
下图,就是为了找到内核:
5.Yocto 如何更改 source code 的下载与 git clone 地址
现象
Yocto 中在 fetch 一些软件包的时候经常出现一天也下载不下来,这种情况极大浪费了我们的
时间。
例如,下面有三个 Package 下载了一天也没有完成:
解决方法
确定下载的地址,手动下载
先确定软件包的下载地址,例如对于 opencv 与 opencv-samples 软件包:
可以看到他们的 git 地址都是一样的,因此,我们可以手动来 git clone:
可以看到我们只使用了几十分钟而已。clone 下来以后,我们就可以让软件包使用我们本地的
这个 repo 了,而不需要忙忙的去远程 repo 去 clone。
让 package 克隆时使用本地的 git
找到软件包对应的 bb 文件
我们可以使用 find 命令来查找
更改 bb 文件
注意里面添加了一个 protocol 指定。
再一次获取
bitbake opencv -c fetch
结果如下:
提示找不到 branch,于是我们到我们本地的 repo 中将此 branch 切出来,也可以将其制作
成 bare repo:
然后再一次进行 fetch 就可以了:
对于其他软件也是类似的。
6.Yocto 中如何共享已经下载的文件
Yocto 的下载耗时可能会超过编译的时间,因此大家都希望下载一次后大家都用共
用下载好了的文件,而不要再去下载。
Yocto 中所有下载了的以及 git clone 的文件都放在环境变量 DL_DIR 指示的目录下,
这个目录默认在 machine build directory 下面。
因此要共享下载文件只需要指定此变量到下载好了的目录即可,可以在 local.conf
中指定即可:
7.Yocto Bitbake 的 clean 与 cleanall 以及 cleansstate 的区
别
Yocto 中对于不同的 Package,有不同的 task,即可以执行不同的操作,有一些是
所有包共通的,例如 clean,build 等。
我们可以使用下面命令来查看一个包都有哪些可执行的 task:
bitbake Package -c listtasks
图示:
我们可以从里面看到 clean 与 cleanall 以及 cleansstate 的区别。
8.Yocto 如何加快软件包的下载 如何只下载所有需要的软件包
加快下载
Yocto 中下载是最耗时的,因此我们可以尽可能的开启最多的并行数量。
对此,我们可以在 local.conf 中将并行数目调大,例如我的 CPU 是 E3-1230 v2, 8
核,所以我可以开启 16 个线程来下载,因为我们的网速慢,所以其实这些下载操作
并非 CPU 密集型任务,很多包也很小,所以同时 IO 也不密集,因此可以适当调大: