新闻详情

新闻详情

首页 / 资讯中心 / 详情

yocto: 03-busybox.bb

发布时间:2026/9/29 13:36:47来源:尧图网络
yocto: 03-busybox.bb
好我们就只解剖 busybox.bb不再一下子铺开几十个 recipe。你前面已经看到pn-buildlisttask-depends.dotbitbake core-image-minimal现在我们把视角缩小到一个具体问题BitBake 到底是怎么把 busybox.bb 变成最终 rootfs 里的 /bin/busybox 的1. 先建立一个正确的认识不要把busybox.bb理解成“一个用来编译 BusyBox 的 Makefile。”它更接近告诉 BitBakeBusyBox 是什么、源码在哪里、怎么配置、怎么编译、怎么安装、最后哪些文件属于这个 package。所以我们可以先把 recipe 看成但这里有一个非常重要的 Yocto 思维busybox.bb 本身并没有完整描述所有这些东西。它会继承inherit …而很多真正的行为来自这才是 Yocto 真正值得学习的地方2. 第一刀busybox.bb 到底在哪里Enable unprivileged user namespaces for v24.04Run this command to enable them:sudo sysctl kernel.apparmor_restrict_unprivileged_userns0This will take effect immediately but will reset after reboot. To make it permanent:*echo “kernel.apparmor_restrict_unprivileged_userns0” | sudo tee /etc/sysctl.d/99-apparmor-unprivileged-userns.confsudo sysctl -p /etc/sysctl.d/99-apparmor-unprivileged-userns.conf*在你的 Yocto 环境中先执行bitbake-layers show-recipes busybox你应该会看到类似 meta/recipes-core/busybox/busybox_…bb然后find …/ -name ‘busybox*.bb*’找到以后sed -n ‘1,240p’ 你的busybox.bb路径不要急着全部看懂。第一遍阅读时不必追求完全理解所有细节。我们第一遍只寻找下面这些东西SUMMARY DESCRIPTION LICENSE LIC_FILES_CHKSUM SRC_URI SRCREV PV inherit DEPENDS RDEPENDS do_configure do_compile do_install FILES3. 第一件非常重要的事recipe 不是 shell script例如你看到SRC_URI https://…不要认为 BitBake 马上执行wget …而应该想到busybox.bb│ SRC_URI▼BitBake 数据库▼fetcher▼downloads/▼unpack▼work/…/busybox/…所以SRC_URI本质是在告诉 BitBake这个 recipe 的 source input 是什么。4. 我们真正要追的是 WORKDIR这个变量至关重要它是整个构建过程的“工作现场”。执行以下命令查看它的值bitbake-ebusybox|grep^WORKDIR你可能会看到类似这样的路径WORKDIR/home/.../build/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/busybox/...这个目录就是我们接下来观察 BusyBox 构建生命周期的核心现场所有中间文件和任务输出都将在这里生成。5. 你应该开始建立这个目录结构概念假设tmp/work/…/busybox//里面会逐渐出现busybox/version/├── busybox-version/← 解压后的源码 ├── image/ ← do_install 安装进去的临时 root ├── packages-split/ ← 打包拆分结果 ├── package/ ← package 阶段 ├── temp/ ← task 日志、脚本 └──...这几个目录非常重要。尤其是temp/因为这里能看到log.do_fetch log.do_unpack log.do_configure log.do_compile log.do_install run.do_compile run.do_install这就是我们学习 BitBake 最好的教材6. 第二刀任务从哪里来也许你会问BitBake 到底在干什么现在我们可以用 busybox 来回答。执行bitbake -c listtasks busybox你会看到大量任务例如do_fetch do_unpack do_patch do_prepare_recipe_sysroot do_configure do_compile do_install do_package do_packagedata do_package_write_ipk...现在不要把它们当成一串命令。把它看成这就是 BitBake 的核心工作。8. 最值得你现在理解的一个东西task假设do_compile你可以暂时把它理解为一个可执行的任务节点。例如do_compile最终会变成某个 shell script。你可以直接看bitbake -c compile busybox然后找到tmp/work/…/busybox/…/temp/run.do_compile执行less tmp/work/…/busybox/…/temp/run.do_compile9. 你会第一次看到“BitBake 真正生成的东西”你可能在 busybox.bb 中根本没看到make但是run.do_compile里面可能最终出现oe_runmake或者经过变量展开之后变成make …这时候你就会发现recipe 是输入。而run.do_compile才是BitBake 根据 recipe、class 与 configuration 最终生成出来的执行脚本。所以我们可以画成这张图你一定要记住。9. 第三刀inherit 才是 Yocto 的灵魂之一你打开 busybox.bb很可能会看到inherit …这里先不要急着研究 BusyBox。我们只问它继承了哪些 class因为inherit xxx意味着比如一个 recipe 可以非常短inherit autotools但是 autotools.bbclass 可以给它带来do_configure do_compile do_install以及大量变量和函数。所以以后你看到inherit xxx第一反应应该是“哦这个 recipe 的很多行为藏在 xxx.bbclass 里面。”10. 我们下一步不要猜直接让 BitBake 告诉我们运行bitbake -e busybox /tmp/busybox.env然后grep^PN/tmp/busybox.env grep^PV/tmp/busybox.env grep^WORKDIR/tmp/busybox.env grep^S/tmp/busybox.env grep^B/tmp/busybox.env grep^D/tmp/busybox.env这几个变量非常重要。你会开始看到PN PV WORKDIR S B D它们可以先这样理解其中SBD非常值得重点理解。11. D 是很多初学者第一次真正“顿悟”的地方假设 do_install 最终执行install-d ${D}${bindir}install-m 0755 busybox ${D}${bindir}/busybox你可能会疑惑${D}/usr/bin/busybox 是不是直接安装到我的 Linux 系统不是。它实际可能是tmp/work/…/busybox/…/image/usr/bin/busybox也就是D│└── usr└── bin└── busybox所以do_compile▼编译出 BusyBox▼do_install▼${D}/usr/bin/busybox▼package▼最终 .ipk/.rpm/.deb这时候你已经开始理解Yocto 并不是在编译的时候直接修改最终 rootfs。而是这条链特别重要。12. 再回头看你之前的 pn-buildlist你之前看到busybox出现在pn-buildlist现在就可以重新理解了。它不是说“BitBake 找到了一个 busybox 文件。”而是BitBake 解析 metadata 后确定当前目标构建图中需要 busybox 这个 recipe。然后 BitBake 为它建立 taskbusybox │ ├── do_fetch ├── do_unpack ├── do_patch ├── do_configure ├── do_compile ├── do_install ├── do_package └──...而你之前看到的task-depends.dot其实是在更高层次告诉你busybox:do_compile busybox:do_install busybox:do_package...和其他 recipe/task 之间是什么关系。13. 所以我们现在把 busybox 的学习路线固定下来不要一次看完所有内容。我们按这 6 层 解剖第一层busybox.bb↓“这个 recipe 声明了什么”第二层inherit *.bbclass↓“它继承了什么行为”第三层bitbake -e busybox↓“变量最终被展开成什么”第四层bitbake -c listtasks busybox↓“BitBake 给它建立了哪些 task”第五层temp/run.do_*↓“这些 task 最终到底执行了什么”第六层WORKDIR / image / packages-split↓“文件到底去了哪里”这六层走完你对 BitBake 的理解会发生一个明显变化。你不再是“我会写几个 .bb 文件。”而会变成“我知道 BitBake 是如何把 metadata 变成 task再把 task 变成实际构建动作的。”14. 我建议我们下一步就做一个非常具体的实验不要再看理论。我们直接拿你的实际环境bitbake -e busybox然后我带你逐行解剖这 5 个变量PN PV WORKDIR S D接着执行bitbake -c compile busybox然后我们一起打开temp/run.do_compile temp/log.do_compile到时候我会带你回答一个非常关键的问题busybox.bb 里面明明没有直接写完整的 make 命令BitBake 到底是怎么“拼”出 do_compile 的这一步是真正进入 BitBake 内部机制的入口。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot+MyBatisPlus多数据源实战:MySQL与SqlServer双库切换完整方案 2026/9/29 15:30:07

SpringBoot+MyBatisPlus多数据源实战:MySQL与SqlServer双库切换完整方案

做项目遇到多数据源需求,往往是两种让人头大的情况:一种是历史遗留系统太老,新业务想用MySQL,旧数据又躺在SqlServer里动不了;另一种是刚接手一个项目,一看配置一半库在MySQL、一半在Oracle或SqlServer&…

阅读更多 →
告别文件夹视图混乱:Windows资源管理器详细信息默认设置全攻略 2026/9/29 15:30:07

告别文件夹视图混乱:Windows资源管理器详细信息默认设置全攻略

在 Windows 里翻文件翻到心态爆炸的场景,我估计每个打工人都遇到过:明明已经把文件夹列表切成了“详细信息”,列宽列序也费劲调好了,结果一打开下一个文件夹又变回满屏大图标,就像系统在跟你玩“你猜我记不记得”。更隐…

阅读更多 →
iPhone配置学校邮箱全攻略:IMAP/SMTP参数、授权码与报错排查 2026/9/29 15:29:53

iPhone配置学校邮箱全攻略:IMAP/SMTP参数、授权码与报错排查

开学季总有人抱着新iPhone来找我:“学长,帮我看看学校邮箱怎么在手机上配?”这问题看着简单,真动起手来,卡在服务器参数、授权码、SSL端口上的人一抓一大把。网页版邮箱点开就能用,换成iOS自带邮件应用就报…

阅读更多 →
Python数据分析工具链实战:从环境搭建到业务洞察 2026/9/29 15:29:33

Python数据分析工具链实战:从环境搭建到业务洞察

1. 工具链全景规划:先想清楚再动手 做数据分析这些年,我最大的体会是: 多数人学Python半途而废,不是语法学不会,而是从一开始就把环境搞乱了。 今天想聊聊数据分析师日常真正会用到的Python工具组合,以及…

阅读更多 →
柔焦滤镜全解析:从光学原理到实拍参数,拍出高级感人像 2026/9/29 15:29:33

柔焦滤镜全解析:从光学原理到实拍参数,拍出高级感人像

从怼脸拍到退三步:柔焦滤镜到底在解决什么问题拍人像这几年,我越来越发现一个反常识的现象:很多人花大价钱买回来顶级镜头,结果拍出来的片子反而不如一支几百块的旧镜头耐看。问题不在解析力,而在观看方式上。顶级镜头…

阅读更多 →
React Native 接入鸿蒙:桥接实践与踩坑排查指南 2026/9/29 15:29:33

React Native 接入鸿蒙:桥接实践与踩坑排查指南

这两年做跨端开发,绕不开一个话题:React Native 怎么接鸿蒙。我前阵子把一个RN项目往鸿蒙设备上迁,期间要自己写鸿蒙(HarmonyOS)组件,还要把鸿蒙的系统能力暴露给React Native侧调用,踩的坑比预…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉